我正在使用 F413,我正在使用 USART3 通过 UART 接收和传输数据。因为我需要接收未知大小的数据,所以我为 RX 编写了自己的中断处理程序。但是我想在 DMA 的帮助下传输数据。
如果我调用常规轮询 UART_Transmit(...) 函数,设备将发送数据并且来自目标的响应将被 RX IRQ 处理程序拾取到缓冲区而不会出现问题。我不想摆脱阻塞 UART_Transmit() 功能。出于这个原因,我配置和设置 DMA,以便我可以使用非阻塞 UART_Transmit_DMA(...) 函数。
使用逻辑分析器,我可以看到正确形成的传出和传入流量。我会说 DMA 传输工作正常......但现在我的 RX IRQ 处理程序有问题......
我的接收 IRQ 处理程序如下所示:
- /* USART3 RX handler */
- UART_RX_INTERRUPT_HANDLER_DECLARAtiON(USART3)
- {
- /* Check if receive register is not empty status */
- if __HAL_UART_GET_FLAG(&UARTS_Instance()->consts[UART_INSTANCE_3].huart, USART_SR_RXNE)
- {
- /* Disable/ clear flag */
- __HAL_UART_CLEAR_FLAG(&UARTS_Instance()->consts[UART_INSTANCE_3].huart, USART_SR_RXNE);
- /* Process received data */
- UARTS_Instance()->rx_irq_callback(UARTS_Instance()->consts[UART_INSTANCE_3].index ,__HAL_UART_FLUSH_DRREGISTER(&UARTS_Instance()->consts[UART_INSTANCE_3].huart));
- /* Flush register*/
- __HAL_UART_FLUSH_DRREGISTER(&UARTS_Instance()->consts[UART_INSTANCE_3].huart);
- /* Re-enable interrupt */
- __HAL_UART_ENABLE_IT(&UARTS_Instance()->consts[UART_INSTANCE_3].huart, UART_IT_RXNE);
- }
- }
现在发生的是我被困在这个处理程序中并且它被反复调用,因此我的程序“冻结”。如果我在处理程序中放置断点并检查外围寄存器,我会看到有 TCIE 寄存器启用....虽然我从来没有在我的代码中的任何地方手动启用它(我已经检查了好几次)...所以现在我在想 DMA 是否可以对此有任何影响,以及我应该如何正确处理该处理程序中的标志和中断(而 DMA Stream 有它自己的处理程序 - HAL_DMA_IRQHandler(&dma) )。
- void DMA1_Stream3_IRQHandler(void)
- {
- HAL_DMA_IRQHandler(&UARTS_Instance()->consts[UART_INSTANCE_3].hdma);
- }