STM32配置注意事项
1 定时器
1.1 定时器中断配置
定时器中断配置步骤
1)使能定时器时钟
HAL 中定时器使能是通过宏定义标识符来实现对相关寄存器操作的,方法如下:__HAL_RCC_TIMx_CLK_ENABLE(); /* x=1~14 */
2)初始化定时器参数,设置自动重装值,分频系数,计数方式等
定时器的初始化参数是通过定时器初始化函数 HAL_TIM_Base_Init 实现的。
注意:该函数会调用: HAL_TIM_Base_MspInit 函数,我们可以通过后者存放定时器时钟和中断等初始化的代码。
3)使能定时器更新中断,开启定时器计数,配置定时器中断优先级
通过 HAL_TIM_Base_Start_IT(该函数调用了__HAL_TIM_ENABLE_IT 和__HAL_TIM_ENABLE 两个函数宏定义,分别是更新定时器中断和使能定时器的宏定义) 函数使能定时器更新中断和开启定时器计数。
通过 HAL_NVIC_EnableIRQ 函数使能定时器中断,通过 HAL_NVIC_SetPriority 函数设置中断优先级。
4)编写中断服务函数
定时器中断服务函数为:TIMx_IRQHandler,当发生中断的时候,程序就会执行中断服务函数。 HAL 库为了使用方便,提供了一个定时器中断通用处理函数 HAL_TIM_IRQHandler,该函数又会调用 HAL_TIM_PeriodElapsedCallback 等一些回调函数, 需要用户根据中断类型选择重定义对应的中断回调函数来处理中断程序。
通过cubemx配置:
MX_TIM1_Init --> HAL_TIM_Base_Init(配置定时器基本时基单元) --> HAL_TIM_Base_MspInit(开启定时器时钟,配置定时器NVIC中断初始化及其使能),可在MX_TIM1_Init函数末尾通过使能定时器更新中断和开启定时器计数( HAL_TIM_Base_Start_IT )
更新中断(Update Interrupt) 是定时器最基本和常用的中断类型,也称为溢出中断或周期结束中断。
1.2 高级定时器
1.2.1 死区互补输出
高级定时器配置可以参考正点原子高级定时器配置
注意事项:
1、勾选使能刹车输入,将对应引脚改为下拉模式,浮空输入可能导致pwm波形不能正常输出。

1.2.2 参数说明
CHN Polarity 用于配置互补输出通道电平极性,这里我们选择为 Low,即低电平有效;
CH Polarity 输出极性,这里我们选择 Low,即低电平有效;
CH Idle State 用于配置通道的空闲状态的电平,这里默认选择 Set 为低电平;
CHN Idle StateSet 用于配置互补输出通道的空闲状态的电平,这里默认选择 Reset 为高电平。
刹车输入接高电平后通道输出状态对应这里的空闲状态。

2 ADC配置
通过 EOC 位的状态来判断 ADC 转换是否完成


连续转换模式配合DMA使用
扫描模式在多通道中使用
3、串口配置步骤
串口中断配置步骤:
1) 串口参数初始化(波特率、字长、奇偶校验等)
HAL库通过调用串口初始化函数 HAL_UART_Init 完成对串口参数初始化。
注意:该函数会调用:HAL_UART_MspInit 函数来完成对串口底层的初始化,包括:串口及 GPIO 时钟使能、 GPIO 模式设置、中断设置等。
2)使能串口和 GPIO 口时钟
使用 USART1 串口,则 PA9 和 PA10 作为串口的 TX 和 RX 脚,因此需要先使能USART1 和 GPIOA 时钟。参考代码如下:
__HAL_RCC_USART1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
3) GPIO 模式设置(速度,上下拉,复用功能等)
GPIO 模式设置通过调用 HAL_GPIO_Init 函数实现,详见本例程源码。
4)开启串口相关中断,配置串口中断优先级
使用 HAL _UART_Receive_IT 函数开启串口中断接收,并设置接收 buffer 及其长度。通过 HAL_NVIC_EnableIRQ 函数使能串口中断,通过HAL_NVIC_SetPriority 函数设置中断优先级。5)编写中断服务函数
串口 1 中断服务函数为: USART1_IRQHandler,当发生中断的时候,程序就会执行中断服务函数。 HAL 库为了使用方便,提供了一个串口中断通用处理函数 HAL_UART_IRQHandler,该函数在串口接收完数据后,又会调用回调函数 HAL_UART_RxCpltCallback ,用于给用户处理串口接收到的数据。
需要在 HAL_UART_RxCpltCallback 函数实现数据接收处理
6)串口数据接收和发送
最后我们可以通过读写 USART_DR 寄存器,完成串口数据的接收和发送, HAL 库也给我们提供了: HAL_UART_Receive 和 HAL_UART_Transmit 两个函数用于串口数据的接收和发送
大家可以根据实际情况选择使用那种方式来收发串口数据。
注意:串口接受buffer接受到一个字节触发中断
硬件中断↓ USARTx_IRQHandler()↓ HAL_UART_IRQHandler(&huart1)↓ huart->RxISR(huart) -> HAL_UART_RxCpltCallback(huart)
由于一开始通过HAL_UART_Receive_IT 开启接收中断,该函数内部将huart->RxISR函数指针指向HAL_UART_RxCpltCallback。
在实际中可以重写 HAL_UART_IRQHandler 完成串口接收,可以将HAL_UART_IRQHandler与HAL_UART_RxCpltCallback 写成一个函数。
串口中断类型:STM32的串口(USART)常见的中断类型及其功能
串口详细介绍:https://www.cnblogs.com/artlessist/p/18926038
空闲中断:从最后一个字节的停止位开始计时,如果线路保持高电平(空闲状态)达到1个完整字节的传输时间,则触发空闲中断(用于检测数据帧的结束,常用于接收不定长数据。)
4、SPI配置步骤
注意:HAL_SPI_Transmit内部调用了__HAL_SPI_ENABLE使能SPI外设(同串口一样)
