欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 美景 > STM32串口DMA 空闲中断使用笔记

STM32串口DMA 空闲中断使用笔记

2025/6/9 8:11:34 来源:https://blog.csdn.net/jiangcy2008/article/details/138812987  浏览:    关键词:STM32串口DMA 空闲中断使用笔记

这里只记录注意要点:

1,要开启串口 全局中断 和对应的接收DMA 中断,两个中断必须同时开

2,裸机程序需要在主循环外调用一次 这个函数

 HAL_UARTEx_ReceiveToIdle_DMA(&huart2, rx_buff, BUFF_SIZE);

3,要在串口中断处理函数中 添加这个函数 

HAL_UARTEx_ReceiveToIdle_DMA(&huart2, rx_buff, BUFF_SIZE);

4,重写空闲中断回调函数 ,它是个弱函数,需要程序员自己实现

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef * huart, uint16_t Size)

在这个函数中,可以做一些事情,比如记录收到了多少个字节数据,或者对接收数据处理。

5,HAL_UARTEx_ReceiveToIdle_DMA 函数的作用:

        1,把接收类型设置成HAL_UART_RECEPTION_TOIDLE,
        2,调用开启DMA接收函数;
        3,调用完再清除一次IDLEF标志位
        4,然后再设置IDLEIE标志位

6,上面第5点可以看出,这个函数需要反复调用,一般放在串口中断函数里面就可以了,不能放在回调函数里,因为一旦出现异常没有进中断,那么在没有其它地方调用HAL_UARTEx_ReceiveToIdle_DMA的话 ,就再也不进空闲中断了,DMA 也不接收了

7,如果是了 OS , 那么可以用这种办法:在任务中反复调用这个函数:HAL_UARTEx_ReceiveToIdle_DMA ,而无需在中断函数里调用 ,不过本质上还是一样的 :

while(1)
{status = HAL_UARTEx_ReceiveToIdle_DMA(&huart4, uart4_rx_buffer, UART_BUFFER_SIZE);while (status != HAL_OK) {osDelay(1);status =     HAL_UARTEx_ReceiveToIdle_DMA(&huart4,uart4_rx_buffer,UART_BUFFER_SIZE);}osSemaphoreAcquire(sem_uart4_rxHandle, osWaitForever); //这里是等待空闲中断到来HAL_UART_AbortReceive(&huart4);//do sometings }...可以在 空闲中断函数中添加 发送信号量if(huart->Instance == UART4) {uart4_rx_len = Size;osSemaphoreRelease(sem_uart4_rxHandle);}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词