STH32H743使用DMA+TIM+PWM实现RGB彩灯的控制

首先致敬分享者:

STM32使用HAL_DMA_PWM方式驱动WS2812全彩灯珠_ws2812为什么要输出800khz的方波-CSDN博客

该作者使用的芯片型号不同,尝试使用Cubmux没有成功更换主芯片,最后还是在正点原子提供的DMA串口和TIM+PWM代码下修改成功,记录下学习笔记。再次吐槽HAL库,太难受了。。。。

(1)定时器初始化:选中TIM3_CH4通道作为PWM输出,开始不知道复用的引脚,使用CubeMux界面很方便查询到此通道默认复用PB1,开发板上PB1接的LED灯,所以能理解例程选择TIM3_CH4通道的原因了。定时器初始化psc和arr设置PWM的周期。RGB彩灯的频率建议时800KHz。(驱动WS2812的关键就在于一是要输出800KHz的方波)

对复用的PB1引脚进行初始化,此函数会被HAL_TIM_PWM_Init()调用:

(2)DMA初始化:指定将TIM_CC4与DMA通道建立连接,传输16位数据用HALFWORD。

(3)主程序初始化:200MHz/250=800KHz,250为arr参数,psc为0表示不分频。

(4)1码占空比70%,0码占空比30%,一个周期数250次,对应1码的计数值为250*0.7=175,对应0码的计数值为250*0.3=75;极性问题:代码与下面的参考图片效果相反!?所以极性问题还是要以实际代码测试为准。

(5)RGB时序设计:周期为1250ns的PWM频率为800KHz,这个频率是最符合RGB灯高低电平时序要求的,本项目定时器200MHz,分频250次就是800KHz,因此0码高电平的比较值是250*0.24=60,1码的高电平比较值是250*0.72=180。复位时间>280us,即>280us/1.25us=224个周期,取300个周期的低电平。数据一定要准确计算到符合芯片要求!!!

(6)RGB颜色控制:熄灭所有灯,其实就是给灯送(0,0,0)配色,组合为黑色;其他颜色由三色组合(b,r,g),每个数大小从0到255,灯的亮度由数字大小决定,数字10就可以看到颜色,太大的数字亮度太大,非常刺眼。复位总是由一个问题,就是第1个灯珠总是不听使唤的亮着不同的亮度和颜色,在第二条指令后就好了。

使用HAL库在这个地方就特别难受了,调试了快3天了,灯的颜色问题和切换问题,终于试出来了,但是很难从理论上说服自己!!!真的不喜欢HAL库!!

问题1:DMA控制的两条语句必须在每次更改RGB值之前调用一次,不懂为什么,试出来的!            dma_init(DMA2_Stream7);
    HAL_TIM_PWM_Stop_DMA(&g_timx_pwm_chy_handle, TIM_CHANNEL_4);

问题2: DMA传输结束的标志位判断语句不能添加,否则会陷入while等待出不来!!也许是初始化配置的问题。

到此RGB灯终于可以在HAL库上跑起来了!!DMA+TIM+PWM模式,实践是检验学习效果的必备之路!感谢众多分享的网友指导!

  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值