单片机学习小组
登录
直播中
周必镜
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配置:
串口超时中断配置:
华大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配置:
串口超时中断配置:
举报
更多回帖
rotate(-90deg);
回复
相关问答
HC32F460
是什么?
HC32F460
有什么功能?
2021-07-07
2168
怎样
去修改
HC32F460
串口
DMA
的接收方式
呢
2022-12-05
696
GD32
串口
dma
接收
空闲
中断
配置
流程是
怎样
的?
2023-11-03
476
如何将现有代码一点点移植到
HC32F460
上
呢
2021-11-25
1799
如何去使用
HC32F460
看门狗
2021-09-18
2739
如何对stm32
f
4
串口
空闲
中断
函数
进行
配置
呢
2021-11-16
1394
请问一下STM32
F
407
串口
空闲
中断
+
DMA
接收有何应用
呢
2021-11-16
1270
如何去实现stm32
f
405
串口
DMA
+
空闲
中断
不定长数据
收发
代码
2021-12-08
1585
请问华大单片机
HC32F460
怎么样?
2021-10-28
2812
怎么能够使
HC32F460
与
HC32F
4A0程序跑出实际CPU的频率
呢
2022-02-24
2102
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分