测试条件:安富莱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刚入门的一个爱好者,可能还有一些其他我没碰到的,但是还存在的一些情况,希望大家可以在下面补充一下 |
【狂欢三】STM32C031使用TIM定时器PWM输出
X-NUCLEO-IKS4A1实现手势滑动
【Wio Lite AI视觉开发套件】+cube.ai与食物识别
刘氓兔的杂谈【001】-片上USB 高速PHY
【STM32H7S78-DK】汽车仪表系统
【STM32H7S78-DK】基于 rtthread 适配 lcd 驱动移植 lvgl
【STM32H7S78-DK评测】TouchGFX (QR Code)二维码生成器
【STM32H7S78-DK】rtthread 增加 psram 内存管理
【STM32H7S78-DK】开箱与rtthread工程初体验
【STM32H7S78-DK评测】-5 LVGL&DMA2D DEMO测试