什么是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.回环代码接收功能演示

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐