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

华大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配置:
在这里插入图片描述
串口超时中断配置:
在这里插入图片描述

  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值