STM32Cube 串口UART实现DMA+IDLE空闲接收中断实现不定长数据接收
当接收器连续接收到一个完整的数据帧后(例如在8N1模式下,即1个起始位、8个数据位、1个停止位),如果接收线上没有立即出现下一个起始位,且信号保持空闲状态(逻辑高电平)超过至少一个字符的传输时间(即“帧时间”),则会触发IDLE中断。4.usart.h文件编写全局接收发送外部变量声明和接收发送大小宏定义。6.使能IDLE中断,并开启IDLE空闲中断DMA传输。调用回调函数时必须要调用以下函数重启D
·
什么是IDLE中断?
当接收器连续接收到一个完整的数据帧后(例如在8N1模式下,即1个起始位、8个数据位、1个停止位),如果接收线上没有立即出现下一个起始位,且信号保持空闲状态(逻辑高电平)超过至少一个字符的传输时间(即“帧时间”),则会触发IDLE中断。

下面开始配置和实现代码:
1.配置串口模式

2.DMA配置

3.开启中断

4.usart.h文件编写全局接收发送外部变量声明和接收发送大小宏定义
#define RX_BUFF_SIZE 256
#define TX_BUFF_SIZE 256
extern uint8_t rx_buff[RX_BUFF_SIZE];
extern uint8_t tx_buff[TX_BUFF_SIZE];

5.1.uart.c中声明接收发送变量
uint8_t rx_buff[RX_BUFF_SIZE];
uint8_t tx_buff[TX_BUFF_SIZE];

5.2:接收数据回调函数编写
调用回调函数时必须要调用以下函数重启DMA
HAL_UART_DMAStop(&huart1); // 停止DMA传输
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, rx_buff, RX_BUFF_SIZE); // 继续接收数据
完整接收回调函数代码:
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) {
if (huart->Instance == USART1) {
HAL_UART_DMAStop(&huart1); // 停止DMA传输
// 业务代码
HAL_UART_Transmit_DMA(&huart1, rx_buff, Size);
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, rx_buff, RX_BUFF_SIZE); // 继续接收数据
}
}

6.使能IDLE中断,并开启IDLE空闲中断DMA传输
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); // 使能串口IDLE中断
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, rx_buff, RX_BUFF_SIZE);
HAL_UART_Transmit_DMA(&huart1, "OK\r\n", 4); // 测试DMA发送

7.回环代码接收功能演示

更多推荐



所有评论(0)