STM32 CubeMX 实现 DMA 串口空闲中断
一 前言
二 参考资料
三 实现过程
cubeMX 配置
在 usart.h 中添加
#define U1_RXBUF_SIZE 1024
typedef struct{
u8 buffer[U1_RXBUF_SIZE];
u16 receivedLen; //@ 接收完成的数据长度
u8 recevicedFlag; //@ 接收完成标志位
}UsartReceiver_Stru;
在 usart.c 中定义 UsartReceiver_Stru
UsartReceiver_Stru u1Receiver;
在 xxx_it.c 中修改 USART1_IRQHandler()
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
u32 tmp_flag = 0;
u32 temp;
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
tmp_flag = __HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE);
if ((tmp_flag != RESET))
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
/* 读取串口状态寄存器(芯片型号不同,寄存器名称可能需要修改) */
temp = huart1.Instance->SR;
/* 读取串口数据寄存器(芯片型号不同,寄存器名称可能需要修改) */
temp = huart1.Instance->DR;
HAL_UART_DMAStop(&huart1);
/* 读取DMA剩余传输数量(芯片型号不同,寄存器名称可能需要修改) */
temp = hdma_usart1_rx.Instance->CNDTR;
u1Receiver.receivedLen = U1_RXBUF_SIZE - temp;
u1Receiver.recevicedFlag = 1;
}
/* USER CODE END USART1_IRQn 1 */
}
在 main.c 初始化部分添加
//@ 开启空闲中断
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
//@ 开启串口 DMA 接收
HAL_UART_Receive_DMA(&huart1, u1Receiver.buffer,U1_RXBUF_SIZE);
在 main.c 中添加
while (1)
{
if(u1Receiver.recevicedFlag)
{
printf("%s\r\n",u1Receiver.buffer);
memset(u1Receiver.buffer,0,sizeof(u1Receiver.buffer));
CH_Delay(1000);
u1Receiver.recevicedFlag = 0;
HAL_UART_Receive_DMA(&huart1, u1Receiver.buffer,U1_RXBUF_SIZE);
}
}