测试条件:安富莱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开发环境迁移实践:从 CubeMX 生成 CMake 工程到 VS Code 编译与调试
【STM32U3 评测】CAN基本通讯测试
【STM32U3 评测】步进电机驱动
STM32CubeMX 6.17新版本发布
STM32 硬核调试技巧:用 DWT 硬件监控内存读写与函数调用
STM32H750 外扩 QSPI FLASH 跑 2 小时就死机?LAT1151 官方根治方案
STM32H723 多通道序列 ADC 启动不了?寄存器操作必须等 ADRDY 就绪
从 CubeMX 到 MX2:这些关键变化必须知道
经验分享 | STM32H7 LPTIM+DMAMUX+BDMA应用演示
经验分享 | STM32H7系列ADC DMA传输异常案例分享
微信公众号
手机版