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);
	}
相关推荐
艾芯微科技8 小时前
HR911130C|汉仁 HANRUN 集成变压器千兆 RJ45 网口参数、电路、PCB 布线、替代与采购避坑
网络·单片机·嵌入式硬件·集成测试·51单片机
白搞电子9 小时前
ESP-Mosaico 黑胶轮滑动画与音乐编排:从设备原型到电脑预览工作台
单片机·嵌入式硬件
新晨单片机设计9 小时前
S028C-基于STM32单片机WIFI智能电表(温度)【Proteus仿真+Keil程序+原理图】
stm32·单片机·proteus·wifi智能电表
幼儿园蛋小黑10 小时前
LVGL 入门指南:从零搭建嵌入式 GUI 界面
嵌入式硬件
1234567890@world10 小时前
正点原子 ATK-DLRK3568 嵌入式Linux系统开发手册V1.3 详细总结
linux·stm32·单片机
Young Doro10 小时前
从 DV 表示到 MI 下界,再到“置换技巧“(含“指数倾斜“完整推导)
笔记
女神下凡12 小时前
芯参谋(68):ADC模数转换器电路设计指南
arm开发·单片机·嵌入式硬件·硬件工程·设计规范
Zwawa13 小时前
一盏 LED 不够用了:让同一盏灯说出不同的话
c语言·单片机·嵌入式
ACP广源盛1392462567313 小时前
PCIe Gen3 交换芯片选型笔记:中小通道扩展方案 IX7012@ACP 评估
笔记·硬件架构·硬件工程·pcie·国产芯片
芯岭技术郦13 小时前
入门级 32 位 MCU,PY32F002B
单片机·嵌入式硬件