
测试条件:安富莱v7开发板,cubemx-6.13.0,hal库-1.11.2配置项:时钟 定时器 dma 使用情况:本来是在学**富莱的用dma往gpio-》bsrr寄存器写值,实现自由控制pwm的功能。想要尝试重新用cubemx生成新工程实现这个功能,然后碰到了一些问题,抓头了好几天。感觉可能很多人会碰到类似的问题,于是想要写下来,免得后面的人走弯路。 第一种情况:DMA访问不了TCM的内容在他自动生成程序的时候,h7默认用了DTCM和AXI SRAM,写的程序使用的变量就放在了DTCM中,但是看数据手册,dma是没法访问tcm的 使能定时器和dma传输之后,所以用debug看,会发现定时器正常工作,但是dma的NDTR(dma要传输数据数)根本不动,解决办法是用__attribute()(keil下)给变量放到axi ram或者其他dma能访问到的ram中。 第二种情况:TIM的dma请求信号没有使能解决方法: 如果定时器中的trgo设置成下面这样 可以使用__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位没有自动使能可以调用HAL_DMAEx_EnableMuxRequestGenerator(如果我没记错的话),来使能对应的生成器通道。 这个也是很容易忽视的问题 结尾:我也只是stm32刚入门的一个爱好者,可能还有一些其他我没碰到的,但是还存在的一些情况,希望大家可以在下面补充一下 |
经验分享 | STM32 DAC+TIMER+DMA应用演示
经验分享 | 常被误解的开、关总中断话题
经验分享 | 更改STM32定时器周期后的输出疑问分析
兔哥的边缘AI【001】——DIY-STM32N6全IO扩展板
兔哥的BLE【002】-WB09最小系统板PCB设计
兔哥的L4【001】——32脚的小板
经验分享 | 为何实现不了定时器DMA Burst传输?
经验分享|STM32 DMA编程时的一个应用小提醒
新版STM32Cube for Visual Studio Code开发体验
【STM32C0测评】Nucleo-C092开发板驱动DS1302实验