单片机学习小组
直播中

周必镜

7年用户 942经验值
私信 关注

怎样对HC32F460串口空闲中断+DMA收发进行配置呢

怎样对HC32F460串口空闲中断+DMA收发进行配置呢?在配置过程中遇到了哪些问题?

回帖(1)

阮薇

2022-2-24 09:33:39
华大HC32F460串口空闲中断+DMA收发配置,记录一下自己遇到的坑


华大HC32F460串口空闲中断+DMA收发配置,记录一下自己遇到的坑

注:个人笔记,如有错误,还望谅解。

STM32
在STM32中我们常用DMA外设直接读取内存数据来减轻CPU的工作量,例如在ST32上使用串口空闲中断触发DMA接收一帧数据并转存至预设的BUFF中以方便后续处理,而这个过程并不需要CPU来执行内存拷贝的工作从而减轻了CPU的工作量。

HC32
由于一些特别原因,项目所用的单片机由ST32更换到了华大的HC32,两者使用起来差别不是很大,开发思路基本一致,但是有个别细节存在差异使用起来还是稍稍有些不习惯。在HC32F460中并没有包含空闲中断或者帧中断这一功能,取而代之的是一个叫串口接收超时中断这么一个东西,其实这两者功能基本相同都是在串口超过一段时间没有数据接收之后触发的一个中断功能。
我按照之前配置stm32串口空闲中断+DMA收发的思路去配置HC32,即当串口超时中断之后触发DMA将源地址(USART->DR)中的数据转存到目标地址RxBuffer(uint8_t RxBuffer[256])中,然后我再去printf数组保存的内容发现怎么都不对。HC DMA配置如下

在经过多次测试和对比stm32配置流程之后,找到了一个突破点,ST使用DMA收发完一帧数据之后需要重新执行一次配置DMA的工作才能继续正确接收,那么为什么要重新配置呢?我推测是需要将目标地址重新定位到BUFF的首地址,因为在DMA的配置中源地址选择的是固定模式即一直都是USART->DR,而目标地址选择的是递增模式,即保存完一个字节之后指针向后偏移。那么问题就来了,如果我们将触发DMA传输的触发源设置成串口超时中断,那么一串字符串只触发一次DMA传输而源地址是固定的,这将意味着DMA会将源地址中的那一个数据重复的写到BUFF中,最后得到的是一个存着一样数据的BUFF,这显然不是我们要的。
修改的思路也很简单,在HC中将DMA触发源更改成串口接收中断,即每次串口来一个数据我就触发DMA转存一个数据并且目标地址将自动向后偏移一位,这样我们便将串口发来的字符都存到了BUFF中,然后我们在串口超时中断中(空闲中断或者帧中断)重置DMA让其地址配置又回到BUFF的首地址,以此来实现一个循环操作。

配置如下
DMA配置:

串口超时中断配置:
举报

更多回帖

发帖
×
20
完善资料,
赚取积分