目录
一、简介
1.1、开发环境
IED软件:STM32CubeIDE V1.9。
单片机型号:STM32F103。
1.2、实现功能
使用STM32的串口1,接收不定长数据,并返回接收数据。
二、步骤解析
2.1、配置串口
打开“Device Configuration Tool”(即STM32CubeMX),配置串口1。
打开串口接收中断,在“NVIC Settings”栏勾选“USART1 global interrupt”。
2.2、初始化
初始化过程中,调用函数“HAL_UARTEx_ReceiveToIdle_IT”。
HAL库中对该函数的定义:
HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)。
huart:定义串口,一般填写 &huartx(x为串口号,取1、2、3……)。本案例使用串口1,则填写&huart1;
pData:接收数据存放的首地址,一般填写一维数组名;
Size:定义接收的字节长度,填写接收数据的最大字节数。
返回值为4种HAL State中的1种,HAL库中定义如下:
typedef enum
{
HAL_OK = 0x00U,
HAL_ERROR = 0x01U,
HAL_BUSY = 0x02U,
HAL_TIMEOUT = 0x03U
} HAL_StatusTypeDef;
2.3、回调函数
调用函数“HAL_UARTEx_ReceiveToIdle_IT”后,当接收长度等于Size,或者串口接收数据过程中产生空闲时,会执行回调函数"HAL_UARTEx_RxEventCallback"。
HAL库中对该函数的定义:
__weak void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
huart:回调串口号;
Size:实际接收的字节长度。
注:该回调函数为空的弱函数,函数主体需自己重新定义。
三、示例
从串口1接收不定长数据,存放在数组array[50]中,并返回所接收的数据。
3.1、定义
定义一维数组array:
uint8_t array[50]; //定义array
3.2、主函数
在主函数的初始化过程,调用函数“HAL_UARTEx_ReceiveToIdle_IT”:
void main()
{
HAL_UARTEx_ReceiveToIdle_IT(&huart1, array, 50); //初始化开启串口接收
while(1);
}
3.3、重新定义回调函数
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if(huart == &huart1) //判定:串口1接收
{
HAL_UART_Transmit_IT(&huart1, array, Size); //返回接收数据
HAL_UARTEx_ReceiveToIdle_IT(&huart1, array, 50) ; //重新开启串口接收
}
}
初始化打开串口接收中断,当串口接收满50字节,或串口产生空闲时,会执行回调函数。回调函数里判断串口后正确后,执行对应的功能函数,并再次开启串口接收中断。
四、补充DMA方式
上述为中断配置和使用方式,它和DMA方式的主要区别:使用中断方式,串口每接收一个字节,需要进入串口中断,将串口接收寄存器的数据转存到数组中,会占用单片机资源;使用DMA方式,串口每接收一个字节,都是通过DMA将串口接收寄存器的数据转存到数组中,无需占用CPU资源。
4.1、配置DMA
在2.1的基础上,在“DMA Settings”栏目,通过按钮“Add”增加串口收发DMA。
4.2、串口接收函数
使用函数“HAL_UARTEx_ReceiveToIdle_DMA”替换“HAL_UARTEx_ReceiveToIdle_IT”。
使用函数“HAL_UART_Transmit_DMA”替换“HAL_UART_Transmit_IT”。