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);
	}

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-10 21:32:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-10 21:32:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-10 21:32:04       87 阅读
  4. Python语言-面向对象

    2024-06-10 21:32:04       96 阅读

热门阅读

  1. 第一章 - 第4节-计算机软件系统 - 课后习题

    2024-06-10 21:32:04       29 阅读
  2. 46-5 等级保护2.0主要变化

    2024-06-10 21:32:04       24 阅读
  3. 算法设计与分析(期末复习版4完结版)

    2024-06-10 21:32:04       21 阅读
  4. vue面试题一

    2024-06-10 21:32:04       30 阅读
  5. ChatGPT

    2024-06-10 21:32:04       22 阅读
  6. 【机器学习】使用BART技术自动提取文章内容摘要

    2024-06-10 21:32:04       28 阅读
  7. 大模型日报2024-06-10

    2024-06-10 21:32:04       34 阅读
  8. 【AI】人工智能(AI)的崛起与未来展望

    2024-06-10 21:32:04       32 阅读
  9. 【无标题】

    2024-06-10 21:32:04       26 阅读
  10. 徐州服务器租用该如何维护?

    2024-06-10 21:32:04       28 阅读
  11. Python中的迭代器与生成器

    2024-06-10 21:32:04       34 阅读
  12. 树莓派 linux ARM 如何更新libc库

    2024-06-10 21:32:04       33 阅读
  13. CodeWF.EventBus:轻量级事件总线,让通信更流畅

    2024-06-10 21:32:04       28 阅读
  14. Linux下的samba权限设置示例

    2024-06-10 21:32:04       33 阅读