某stm32用户反映,他目前使用stm32f407ve的芯片开发产品,在使用cubemx做初始化配置时发现没法给uart5配置基于该外设事件的dma请求。他觉得很奇怪,坚信uart5是可以申请dma传输的,而且他还基于早期cubemx 版本配置过、使用过。
他刚好最近对cubemx升级到5.5.0了,怀疑是不是stm32cubemx5.5以上版本的bug。
说到这里,可能有人还不是没完全明白具体怎么回事。我们结合他给过来得截图一起来看看。他在对uart5做配置时出现的界面是下面这样的,连那个dma配置的菜单都没有。
基于他的反馈,我用目前最新的cubemx版本5.6.1进行验证,同样对stm32f407ve的uart5进行配置并试着为其申请dma传输。经过测试并没有碰到他所说的问题。
那问题出在哪儿呢?
我的测试工程只是单纯使用到uart5,并未使用其它外设及相关dma应用。我结合他反馈过来的配置截图,隐约发现他的工程应用中并不仅仅使用一个uart5外设,还用到了其它外设。会不会是他在配置其它外设并申请dma请求时,把uart5可以申请的dma流占用了呢?
我们先不妨打开stm32f4系列参考手册的dma章节,看看有关外设事件与dma传输流的映射关系图。从手册中我们可以看到,uart5的tx/rx事件能申请dma毫无疑问,但只能申请dma1_s0和dma1_s7。
然而呢,可以申请dma1_s0和dma1_s7的外设事件又有很多,比方tim4_ch1和tim4_ch3就可以分别申请dma1_s0和dma1_s7。如果说,在做uart5事件的dma配置之前,若有别的外设事件已经将dma1_s0和dma1_s7申请走了,这时uart5就应该没得申请了。
基于上面分析,我们可以进一步验证下。
我们使用上面提到得tim4_ch1和tim4_ch3先将dma1_s0和dma1_s7申请走,再来尝试为uart5申请dma,看看会怎么样。结果cubemx提示该外设请求无效,不能申请dma了。如下图所示:
提示界面跟客户反馈的不太一样,应该是cubemx版本的差异所致。表达的基本意思还是相同的,即此时没法为uart5事件申请dma传输。
到此,客户反馈的问题原因也基本清晰。像这种情况,由于uart5的tx/rx事件要申请的dma流固定了,我们可以看看目前占用uart5欲申请的dma流的外设,他们是否可以做调整去申请别的dam流,从而避免竞争。因为有些外设事件可能申请的dma流不只一条,当然这要结合具体的芯片。以stm32f4芯片为例,下图中的tim1_ch1,spi1_rx,spi1_tx可申请的dma传输流都不只一条。
或许有人知道,stm32家族中有些系列支持dmamux,如果有它做dma配置就更方便、高效。但不管怎样,dma请求事件肯定要远远多于具体实施传输的dma流,所以具体应用中并不能保证有申请dma资格的事件就一定申请得到相应的dma传输。就像你有钱也有资格坐飞机坐高铁,但并不能保证你时刻可以买到你期望的机票或火车票而成行。
再结合到本案例,遇到两个外设事件对一个dma传输流发生竞争不可避免的时候,若两个外设对dma的使用在时间上可以错开的话,也还是有办法解决的。我们可以使用cubemx分别基于两个外设的dma请求事件生成两套配置,然后手动调整代码,需要使用哪个外设事件的dma传输时就启用相应的dma配置及应用函数。总之,搞清了怎么回事,结合具体应用灵活处理就好。
最后小结下。针对上面的客户问题,如果对cubemx工具的使用不熟或者说只是机械地使用该工具做配置,心里没有些基本原理做支撑的话,遇到该问题时恐怕一时也的确难以找到方向。在此分享,权作提醒。
你对于物联网有没有什么误解
详细剖析RFID识别技术常见的应用场景案例
SMA天线连接器是什么它有什么用
百度Apollo Day:2023年将打造全球最大全无人自动驾驶运营服务区
采用ARM的嵌入式的可编程芯片系统的设计方案介绍
使用CubeMx怎么配置不了UART的DMA?
电感线圈有很多种类,具体的种类介绍(一)
国产电子管2A3参数
集成灶怎么选?参考2021年度金选奖
针管刚性试验检测仪器 GB/T 18457-2015
网络音视频实时传输技术Ethernet AVB
51系列单片机定时器的实用方法
激光器在水下无线传输超高清视频
全彩OLED显示屏LPSF096064A00
人形机器人主要环节及产业链分析
特斯拉因显示字体错误召回219万辆汽车
重复接地的规范_重复接地和保护接地区别
如何确认晶振电路和MCU是否匹配
如何选择会议室音响系统
4G+时代骁龙全网通是怎样的?