[技术问答] M480系列,uart PDMA接收,怎么产生接收超时中断?

[复制链接]
 楼主| 海滨消消 发表于 2025-8-4 16:07 | 显示全部楼层 |阅读模式
M480系列,uart PDMA接收,怎么产生接收超时中断?
huangcunxiake 发表于 2025-8-15 09:12 | 显示全部楼层
库函数里好像就有这个参数。
huangcunxiake 发表于 2025-8-15 09:14 | 显示全部楼层
首先需要配置UART的接收超时控制寄存器:
  1. /* 使能UART接收超时功能 */
  2. UART_ENABLE_TOUT(UARTx);
  3.    
  4. /* 设置超时时间,通常以字符时间为单位 */
  5. UART_SetTimeoutCnt(UARTx, timeout_value);  // timeout_value通常设为3-5个字符时间
huangcunxiake 发表于 2025-8-15 09:14 | 显示全部楼层
配置PDMA接收
  1. /* 配置PDMA用于UART接收 */
  2. PDMA_Open(PDMA, (1 << uartdma_rx_ch));  // 打开PDMA通道
  3. PDMA_SetTransferMode(PDMA, uartdma_rx_ch,
  4.     PDMA_UARTx_RX, 1, 0);  // 设置为UART接收模式
  5.    
  6. /* 设置PDMA传输属性 */
  7. PDMA_SetTransferCnt(PDMA, uartdma_rx_ch,
  8.     PDMA_WIDTH_8, buffer_size);  // 8位数据,缓冲区大小
  9.    
  10. PDMA_SetBufAddr(PDMA, uartdma_rx_ch,
  11.     (uint32_t)rx_buffer, (uint32_t)rx_buffer);  // 设置缓冲区地址
  12.    
  13. PDMA_EnableInt(PDMA, uartdma_rx_ch,
  14.     PDMA_INT_TRANS_DONE);  // 使能传输完成中断
huangcunxiake 发表于 2025-8-15 09:14 | 显示全部楼层
启用UART接收超时中断
  1. /* 使能UART接收超时中断 */
  2. UART_EnableInt(UARTx, UART_INTEN_RXTOIEN_Msk);
  3.    
  4. /* 在NVIC中使能UART中断 */
  5. NVIC_EnableIRQ(UARTx_IRQn);
huangcunxiake 发表于 2025-8-15 09:14 | 显示全部楼层
中断服务程序处理
  1. void UARTx_IRQHandler(void)
  2. {
  3.     /* 检查接收超时中断标志 */
  4.     if(UART_GET_INT_FLAG(UARTx, UART_INTSTS_RXTOIF_Msk)) {
  5.         UART_CLR_INT_FLAG(UARTx, UART_INTSTS_RXTOIF_Msk);  // 清除中断标志
  6.         
  7.         // 处理接收超时事件
  8.         // 可以在这里处理接收到的数据或设置标志
  9.     }
  10.    
  11.     // 其他中断处理...
  12. }
huangcunxiake 发表于 2025-8-15 09:14 | 显示全部楼层
启动UART和PDMA接收
  1. /* 启动UART接收 */
  2. UART_ENABLE_RX(UARTx);
  3.    
  4. /* 启动PDMA接收 */
  5. PDMA_Trigger(PDMA, uartdma_rx_ch);
huangcunxiake 发表于 2025-8-15 09:15 | 显示全部楼层
接收超时时间需要根据波特率合理设置,通常为3-5个字符的传输时间

PDMA和UART中断需要正确配置优先级

在超时中断中处理数据时,可以通过PDMA获取当前接收到的数据量

确保在超时中断处理完成后重新配置PDMA以继续接收
您需要登录后才可以回帖 登录 | 注册

本版积分规则

252

主题

1765

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部