如需转载请注明出处:https://juyou.blog.csdn.net/article/details/116021595
我最近在找工作呀,哪位大佬有合适的工作机会,可以推荐一下呀。
坐标北京,嵌入式软件工程师。
一、MCU对比
问题:
解答:
参看:STM32开发 – STM32初识
内核不同:F1是Cortex-M3内核,F4是Cortex-M4内核;
主频不同:F1主频72MHz,F4主频168MHz;
浮点运算:F1无浮点运算单位,F4有;
功能性能:F4外设比F1丰富且功能更强大,比如GPIO翻转速率、上下拉电阻配置、ADC精度等;
内存大小:F1内部SRAM最大64K,F4有192K(112+64+16)。
二、STM32 启动过程
问题:
解答:
参看:STM32开发 – 启动流程
通过Boot引脚设定,寻找初始地址
初始化栈指针 __initial_sp
指向复位程序 Reset_Hander
设置异常中断 HardFault_Handler
设置系统时钟 SystemInit
调用C库函数 _main
三、GPIO
问题:
解答:
参看:STM32开发 – GPIO详解
GPIO 8种工作模式(gpio_init.GPIO_Mode):
(1) GPIO_Mode_AIN 模拟输入
(2) GPIO_Mode_IN_FLOATING 浮空输入
(3) GPIO_Mode_IPD 下拉输入
(4) GPIO_Mode_IPU 上拉输入
(5) GPIO_Mode_Out_OD 开漏输出
(6) GPIO_Mode_Out_PP 推挽输出
(7) GPIO_Mode_AF_OD 复用开漏输出
(8) GPIO_Mode_AF_PP 复用推挽输出
APB2负责 AD,I/O,高级TIM,串口1。
APB1负责 DA,USB,SPI,I2C,CAN,串口2345,普通TIM,PWR
四、UART
问题:
- 问题一:串行通信方式介绍?
同步通信:I2C 半双工,SPI 全双工
异步通信:RS485 半双工、RS232 全双工
- 问题二:串口配置?
串口设置的一般步骤可以总结为如下几个步骤:
(1)串口时钟使能,GPIO时钟使能
(2)串口复位
(3)GPIO端口模式设置
TX的GPIO工作模式为:GPIO_Mode_AF_PP;//复用推挽输出
RX的GPIO工作模式为:GPIO_Mode_IN_FLOATING;//浮空输入

(4)串口参数初始化
主要包含:波特率设置(115200)、8个数据位、1个停止位、无奇偶校验位、无硬件数据流控制、收发模式。
(5)开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)
(6)使能串口
(7)编写中断处理函数
解答:
参看:STM32开发 – 串口详解
应用场景:GPS、蓝牙、4G模块
五、I2C
问题:
- 问题一:I2C 总线在传送数据过程中共有三种类型信号?
(1)开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。
(2)结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。
(3)应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据。CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。
- 问题二:I2C配置主机模式端口该怎么配置?
硬件模式:复用开漏输出、既不上拉也不下拉。(快速模式:400 Kbit/s)
软件模拟:推挽输出、配置上拉电阻。
解答:
参看:STM32开发 – PMIC、I2C详解
硬件模式: 是有通信速率设置的
/* STM32 I2C 快速模式 */
#define I2C_Speed 400000
/* 通信速率 */
I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;
软件模拟: 没有设置通信速率,该怎么计算呢?
通过I2C总线位延迟函数 i2c_Delay:
static void i2c_Delay(void)
{
uint8_t i;
for (i = 0; i < 10; i++);
}
应用场景:PMIC、加速度计、陀螺仪
六、SPI
问题:
- 问题一:SPI需要几根线?
SPI 接口一般使用 4 条线通信:
MISO 主设备数据输入,从设备数据输出。
MOSI 主设备数据输出,从设备数据输入。
SCLK 时钟信号,由主设备产生。
CS 从设备片选信号,由主设备控制。
- 问题二:SPI通信的四种模式?
SPI 有四种工作模式,各个工作模式的不同在于 SCLK 不同, 具体工作由 CPOL,CPHA 决定。
(1)CPOL: (Clock Polarity),时钟极性:
当CPOL为0时,时钟空闲时电平为低;
当CPOL为1时,时钟空闲时电平为高;
(2)CPHA:(Clock Phase),时钟相位:
当CPHA为0时,时钟周期的上升沿采集数据,时钟周期的下降沿输出数据;
当CPHA为1时,时钟周期的下降沿采集数据,时钟周期的上升沿输出数据;

- 问题三:该如何确定使用哪种模式?
(1)先确认从机需求的 SCLK 极性,不工作时是在低电位还是高电位,由此确认 CPOL 为 0 或 1。
看原理图,我们设置串行同步时钟的空闲状态为高电平所以我们选择 SPI_CPOL_High。
也就是CPOL为1
(2)再由slave芯片 datasheet 中的时序图确认 slave 芯片是在 SCLK 的下降沿采集数据,还是在SCLK的上升沿。
翻译一下:
W25Q32JV通过SPI兼容总线访问,包括四个信号:串行时钟(CLK),芯片选择(/CS),串行数据输入(DI)和串行数据输出(DO)。标准SPI指令使用DI输入引脚串行地将指令、地址或数据写入CLK上升沿上的设备。DO输出引脚用于从CLK下降沿上的设备读取数据或状态。支持模式0(0,0)和3(1,1)的SPI总线操作。模式0和
模式3关注的是当SPI总线主端处于待机状态,数据没有被传输到串行Flash时CLK信号的正常状态。对于模式0,在下降和上升时,CLK信号通常是低的
边缘/ CS。对于模式3,在/CS的下降和上升边缘上CLK信号通常是高的。
既然串行同步时钟的空闲状态为高电平,这里我们选择第二个跳变沿,所以选择 SPI_CPHA_2Edge。
也就是CPHA为1
即,我们选择的是模式3(1,1)。
解答:
参看:STM32开发 – W25Q32JV SPI FlASH详解
应用场景:SPI Flash
七、CAN
问题:
- 问题一:CAN总结介绍一下?
CAN控制器根据 CAN_L 和 CAN_H上 的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者比居其一。发送方通过使总线电平发生变化,将消息发送给接收方。
- 问题二:CAN初始化配置步骤?
(1)配置相关引脚的复用功能,使能CAN时钟
(2)设置CAN工作模式及波特率等(CAN初始化环回模式,波特率500Kbps )
(3)设置滤波器
- 问题三:CAN发送数据格式?
CanTxMsg TxMessage;
TxMessage.StdId=0x12; // 标准标识符
TxMessage.ExtId=0x12; // 设置扩展标示符
TxMessage.IDE=CAN_Id_Standard; // 标准帧
TxMessage.RTR=CAN_RTR_Data; // 数据帧
TxMessage.DLC=len; // 要发送的数据长度 发送8个字节
for(i=0;i TxMessage.Data[i]=msg[i]; //数据
解答:
参看:STM32开发 – CAN总线详解
八、DMA
问题:
- 问题一:DMA介绍?
直接存储器存取(DMA) 用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。
- 问题一:DMA传输模式有几种?
DMA_Mode_Circular 循环模式
DMA_Mode_Normal 正常缓存模式
应用场景:GPS、蓝牙,都是用的循环采集,DMA_Mode_Circular模式。
解答:
参看:STM32开发 – DMA详解
一个比较重要的函数,获取当前剩余数据量大小,根据设置的接收buff大小减去当前剩余数据量 ,得到当前接收数据大小。
九、中断
问题:
解答:
参看:STM32开发 – 外部中断详解
(1)初始化中断,设置触发方式是上升沿/下降沿/双沿触发。
(2)触发中断,进入中断服务函数
十、时钟系统
问题:
- 问题一:STM32有几个时钟源?
STM32 有5个时钟源:HSI、HSE、LSI、LSE、PLL。
①、HSI是高速内部时钟,RC振荡器,频率为8MHz,精度不高。
②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。
③、LSI是低速内部时钟,RC振荡器,频率为40kHz,提供低功耗时钟。
④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。
⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。
解答:
参看:STM32开发 – 时钟系统详解
十一、UCOSII任务调度
问题:
- 问题一:RTOS的任务是怎么写的?如何切出这个任务?
解答:
UCOS有一个任务调度机制,根据任务的优先级进行调度。
一个是硬件中断, 那么系统会将当前任务有关变量入栈,然后执行中断服务程序,执行完成后出栈返回.
另一个是任务之间的切换,使用的方法就是任务调度,每一个任务有自己的栈,顺度也是一样的入栈,然后执行另一个程序,然后出线返回。
并非是每一任务按优先级顺序轮流执行的,而是高优先级的任务独占运行,除非其主动放弃执行,否则低优先级任务不能抢占,同时高优先级可以把放出去给低优先级任务使用的CPU占用权抢回来。所以ucos的任务间要注意插入等待延时,以便ucos切出去让低优先级任务执行。
十二、UCOSII中任务间的通信
问题:
解答:
在UCOSII中,是使用信号量、邮箱(消息邮箱)和消息队列这些被称作事件的中间环节来实现任务间的通信的。
信号量:
参看:ucosII 信号量使用总结(举例讲解)
信号量用于:
1.控制共享资源的使用权(满足互斥条件)
2.标志某时间的发生
3.使2个任务的行为同步
应用实例:互斥信号量
作为互斥条件,信号量初始化为1。
实现目标:调用串口发送命令,必须等待返回“OK”字符过后,才能发送下一条命令。每个任务都有可能使用到此发送函数,不能出现冲突!
邮箱(消息邮箱):
消息队列:
概念:
(1)消息队列实际上就是邮箱阵列。
(2)任务和中断都可以将一则消息放入队列中,任务可以从消息队列中获取消息。
(3)先进入队列的消息先传给任务(FIFO)。
(4)每个消息队列有一张等待消息任务的等待列表,如果消息列中没有消息,则等待消息的任务就被挂起,直到消息到来。
应用场景:
串口接收程序中的接收缓冲区。
储存外部事件。
十三、通信协议
问题:
解答:
了解过Modbus协议。
结构为:帧头(SDTC)+帧长度+指令+流水号+数据+CRC校验。