0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用CubeMx怎么配置不了UART的DMA?

茶话MCU 来源:ST MCU 信息交流 2020-07-05 10:34 次阅读

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工具的使用不熟或者说只是机械地使用该工具做配置,心里没有些基本原理做支撑的话,遇到该问题时恐怕一时也的确难以找到方向。在此分享,权作提醒。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    454

    文章

    50480

    浏览量

    422195
  • uart
    +关注

    关注

    22

    文章

    1230

    浏览量

    101208
  • dma
    dma
    +关注

    关注

    3

    文章

    559

    浏览量

    100458

原文标题:使用CubeMx怎么配置不了UART的DMA?

文章出处:【微信号:stmcu832,微信公众号:茶话MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    在rtt studio使用qspi dma就是进不了中断,为什么?

    的while循环语句中死等: 后来我在cubeMx如下配置dma: 然后用cubeMx生成mdk工程,在main()函数调用以下库函数,能读取w25q64的id, 证明其实
    发表于 09-27 07:03

    MSPM0 UART通信中DMA和Ring Buffer环形缓冲的应用

    电子发烧友网站提供《MSPM0 UART通信中DMA和Ring Buffer环形缓冲的应用.pdf》资料免费下载
    发表于 09-05 11:01 0次下载
    MSPM0 <b class='flag-5'>UART</b>通信中<b class='flag-5'>DMA</b>和Ring Buffer环形缓冲的应用

    STM32CUBEMX(2)--USART通过DMA方式接收不定长数据

    。 本篇文章主要介绍如何使用STM32CubeMX实现串口DMA读取,并且打印出去。QQ群:615061293。 硬件准备 首先需要准备一个开发板,这里我准备的是NUCLEO-F030R8的开发板
    发表于 09-04 11:48

    RL78系列MCU DMAUART中的使用

    对于RL78系列的MCU,为了提高运行效率,减少CPU的占用,建议UART数据收发使用DMA功能。DMA(Direct Memory Access)是RL78 MCU内置的一个控制器,能在支持
    的头像 发表于 07-17 14:24 567次阅读
    RL78系列MCU <b class='flag-5'>DMA</b>在<b class='flag-5'>UART</b>中的使用

    想在PWM的中点触发ADC采样,使用Cubemx配置一直实现不了,为什么?

    您好! 我现在遇到个问题,就是想在PWM的中点触发ADC采样,使用Cubemx配置一直实现不了,还请大神指点
    发表于 06-03 07:47

    stm32L051用cubemx配置不了CMOP是怎么回事?

    求教stm32L051用cubemx配置不了CMOP? 我用STM32CUBEMX配置了COMP1,程序里运行了初始化函数MX_COMP1
    发表于 05-06 07:07

    STM32F030F4上使用CubeMX配置ADC+DMA循环采集无法提取数据的原因?

    如题,使用STM32CubeMX配置了F030的ADC+DMA循环采集,ADC启动后OVR一直处于置为状态,但是DR寄存器输出的数据又是正常的,我使用std库已经配置并实现了功能,使用
    发表于 04-16 08:20

    STM32CubeMX配置STM32L4R9ZI的硬件SDMMC缺少DMA Settings配置是怎么回事?

    STM32CubeMX配置STM32L4R9ZI的硬件SDMMC1,缺少DMA Settings配置
    发表于 04-08 07:25

    STM32G071串口1无法使用DMA收发是为什么?

    单片机有UID(G030没有UID),所以更换单片机为G071CB,使用CUBEMX配置,串口1和串口2都使用DMA收发数据,结果串口2的收发没有任何问题,串口1发不出去数据,也接收不了
    发表于 04-01 07:46

    使用CubeMX生成STM32F103C8T6的DMA ADC代码为什么无效?

    请问各位,我使用CubeMX生成STM32F103C8T6的DMA ADC代码,工程配置请看附件,我运行如下代码为什么无效: /* USER CODE BEGIN Includes
    发表于 03-29 06:08

    使用CubeMX配置STM32F407VGT6的SPI DMA发送16位数据,时钟有波形的原因?

    使用CubeMX配置STM32F407VGT6的SPI DMA发送16位数据,时钟有波形,MOSI无数据,上电就是高电平,其他CLK有波形的时候也还是高电平,发送的数据是0x0001和0x0000
    发表于 03-28 07:40

    关于STM32L051C8T6芯片LPUART+DMA接收问题求解

    ,其中UART2的接收是能够回显的。但是LPUART就无法做到回显。两者之间除了中断优先级之外其他基本都一样。我也查阅了文档,看是否是STM32CUBEMX生成程序配置错误的原因,结果也不是。 是LPUART不支持
    发表于 03-28 07:05

    STM32F103使用cubemx配置ADC和DMA导致delay函数无法使用怎么解决?

    CUBEMX配置完adc和dma后在主函数中调用函数HAL_ADC_Start_DMA( hadc1,(uint32_t *) DMA_v
    发表于 03-28 06:21

    STM32U575VGT6 standard request mode配置之后用不了是怎么回事?

    这个standard request mode 配置了之后用不了,会有hard fault error define printf_dma(...)HAL_UART_Transmit_DMA
    发表于 03-12 06:19

    STM32F405 uart DMA收发数据输出乱码怎么解决?

    利用dma+ldle接收数据,使用STM32cubemx生成driver,使用hal库发现仅能接收一次数据,然后串口busy无法再次触发中断,然后使用标准库编写测试代码,数据接收问题解决,数据输出
    发表于 03-08 07:38