STM32串口接收不定长数据(空闲中断+DMA)
#include "stm32f4xx_hal.h"
// 假设这是在某处定义的UART句柄
UART_HandleTypeDef huart;
// 接收缓冲区和计数器
uint8_t RxBuffer[1024];
__IO uint16_t RxCounter = 0;
// 空闲中断服务程序
void UART_IDLE_IRQHandler(void) {
// 清除标志位
__HAL_UART_CLEAR_FLAG(&huart, UART_CLEAR_IDLEF);
// 确定DMA传输是否完成
if ((huart.Instance->CR3 & USART_CR3_DMAR) != 0) {
// 完成传输的数据长度
uint16_t Size = __HAL_DMA_GET_COUNTER(huart.hdmarx);
// 更新接收计数器
RxCounter += Size;
// 重新配置DMA的目标地址和长度
HAL_DMA_Start_IT(&huart.hdmarx, (uint32_t)RxBuffer + RxCounter, Size);
}
// 处理接收完毕的数据
// ...
}
// 初始化函数
void UART_Init(void) {
// 配置UART参数
// ...
// 使能空闲中断
__HAL_UART_ENABLE_IT(&huart, UART_IT_IDLE);
// 初始化DMA
// ...
// 使能DMA
// ...
// 使能UART
// ...
}
// 主程序
int main(void) {
// 初始化
UART_Init();
// 主循环
while (1) {
// 其他处理
}
}
这个例子展示了如何配置STM32的UART接收不定长数据。当UART进入空闲状态时,将触发空闲中断,在中断服务程序中,我们通过检查DMA传输的长度来更新接收计数器,并重新配置DMA以继续接收数据。这种方法可以有效地处理不定长的数据接收,并且不会因为FIFO满而丢失数据。
评论已关闭