你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法

[复制链接]
ㄇㄨㄇ 发布时间:2024-12-17 00:55

测试条件:安富莱v7开发板,cubemx-6.13.0,hal库-1.11.2

配置项:

时钟

image.png

定时器

image.png

dma

image.png

使用情况:

本来是在学**富莱的用dma往gpio-》bsrr寄存器写值,实现自由控制pwm的功能。想要尝试重新用cubemx生成新工程实现这个功能,然后碰到了一些问题,抓头了好几天。感觉可能很多人会碰到类似的问题,于是想要写下来,免得后面的人走弯路。

第一种情况:DMA访问不了TCM的内容

image.png

在他自动生成程序的时候,h7默认用了DTCM和AXI SRAM,写的程序使用的变量就放在了DTCM中,但是看数据手册,dma是没法访问tcm的

image.png

使能定时器和dma传输之后,所以用debug看,会发现定时器正常工作,但是dma的NDTR(dma要传输数据数)根本不动,解决办法是用__attribute()(keil下)给变量放到axi ram或者其他dma能访问到的ram中。

第二种情况:TIM的dma请求信号没有使能

image.png

解决方法:

image.png

如果定时器中的trgo设置成下面这样

image.png

可以使用__HAL_TIM_ENABLE_DMA(htim, TIM_DMA_UPDATE);来使能对应的dma请求,其他的触发也类似。

这是让我最蛋疼的一个问题,稍微吐槽一下,我想用hal库原因就是不用过多关注底层的寄存器到底怎么配置,但是用hal_dma_start和hal_tim_pwm_start代码在这种情况就是不能直接用,然后抓头了好几天才发现这里没有使能,然后全局搜索__HAL_TIM_ENABLE_DMA,发现hal库包含这个宏定义的函数,没有能满足我这种情况的。在我设置trgo触发方式,并且把定时器的信号给dma用的时候,可不可以hal库在内部帮我使能。基础不好的碰到这个问题头疼死了。

第三种情况:cubemx生成代码,使用dmamux生成器,生成信号触发dma,dmamux->RGxCR的GE位没有自动使能

image.png

可以调用HAL_DMAEx_EnableMuxRequestGenerator(如果我没记错的话),来使能对应的生成器通道。

这个也是很容易忽视的问题

结尾:

我也只是stm32刚入门的一个爱好者,可能还有一些其他我没碰到的,但是还存在的一些情况,希望大家可以在下面补充一下

image.png
收藏 评论0 发布时间:2024-12-17 00:55

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版