完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
华大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配置: 串口超时中断配置: |
|
|
|
只有小组成员才能发言,加入小组>>
3275 浏览 9 评论
2950 浏览 16 评论
3454 浏览 1 评论
8982 浏览 16 评论
4043 浏览 18 评论
1092浏览 3评论
564浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
561浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2297浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1854浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 09:18 , Processed in 0.974145 second(s), Total 49, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号