项目做到一半,碰到个尴尬问题:PWM使用的DMA通道与串口接收的DMA通道撞车了,咋办?
考虑一下,决定放弃idle中断+dma的串口不定长数据接收方案,回到中断接收去。
中断接收函数HAL_UART_RECEIVE_IT函数是个定长接收函数,除非把接收长度设为1。由于我使用freertos系统,打断系统的时间应尽可能少,频率尽可能低。每个字节都进一次hal库的接收处理函数,进行各种判断实在是不友好,因此考虑跳过hal的串口处理部分,直接判断uart_flag_rxne标志位与uart_flag_idle标志位,存入接收缓冲。触发idle中断后认为不定长数据接收完毕,进行处理。
代码:
中断使能与初始化,不启用hal_uart_receive_it。
中断处理部分,跳过hal中断处理函数
注意:__hal_uart_clear_flag函数不能清除idle标志位,需要用古老的读取方法清空。否则会卡死在中断处理结束之后。
优点:中断处理内容尽可能简化,降低对系统内核的打断;
缺点:只适用于8位数据位,无校验位等最常规通信方式,对于更复杂参数的串口通信有待测试,省掉的hal库会不会造成运行不稳定有待于继续测试。
版权声明:本文转自CSDN,博主fox0815
遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/fox0815/article/details/106461788
审核编辑:何安
-
PWM
+关注
关注
116文章
5652浏览量
220486 -
串口
+关注
关注
15文章
1593浏览量
80487 -
dma
+关注
关注
3文章
576浏览量
103727
发布评论请先 登录
STM32F405RGT6 ADC2+TIM4触发+DMA(DMA2_Stream2_CH1)+DMA中断会死机,怎么解决?
求助,关于stm32H7多DMA数据流问题求解
STM32407使用串口闲时中断+DMA方式接收最大接收字节是多少?
无法配置 ADC1 来触发 DMA 传输,怎么解决?
Cyusb3014修改DMA大小为大于4KB时,将不会在HOST端接收到任何数据,为什么?
为什么在“PWM Adc Dma 344 S32CT”示例中使用ISR块来读取dma adc通道?
STM32G030F6 ADC+DMA多通道非连续采样无法正常工作怎么解决?
STM32H743 UART DMA接收不到数据,为什么?
CKS32F107xx系列的DMA控制器简介

ZYNQ基础---AXI DMA使用

雅特力AT32F402/F405 DMA使用指南

评论