【软件STM32cubeIDE下STM32F4xx使用DMA+定时器推PWM+灯带WS2812-进阶-综合汇总(讲解移植相关)】

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

2@TOC

1前言

做灯带ws2812其实有一段时间了中间遇到很多问题从开始的学习到后来慢慢熟悉再到后来尝试点很多灯带做过非常多的实验了自己新建工程几乎尝试过很多条道路并且每个选择都有尝试这篇是一个汇总篇将为给各位讲述移植时注意的函数共享这些知识为其绕过一些坑。

写在前面其实自己之前写过很多文章了里面有很多“细节点”对应新手而言非常建议注意下这些点。

本次实验非常重要的两个表你要是做相关实验可能会反复看这两张表。
—DMA1请求映射表
在这里插入图片描述
—DMA2请求映射表
在这里插入图片描述

2环境

  • 软件环境STM32cubeIDE 1.8.0
  • 硬件芯片STM32F407ZGT6
  • HAL库版本stm32cube_fw_f4_v1262
  • 灯带型号WS2812

3综合汇总

1作为最基础的这其实是我最早调试成功的也是最先使用双缓存的并且是最开始发现函数顺序的重要性的点算是开始吧。
【关于STM32F4xx使用DMA+TIM3_PWM调试灯带WS2812过程记录】

2作为基础的这篇讲述了使用TIM2点亮灯带这里同时遇到最早的问题32位寄存器与TIM3的16位寄存器
【软件STM32cubeIDE下STM32F4xx使用32位定时器2TIM2用DMA+PWM点亮灯带WS2812-基础样例

3如果你已经会了基本的点灯带那么当你想让你的灯带颜色更漂亮些那么可以推荐看下列文章。
【关于STM32F4xx使用DMA+PWM调试灯带WS2812过程记录+进阶】

4后来我做个其它尝试希望可以复用同一数据流其实这种方式不是很推荐请教大佬后才实现但需要在回调函数不断初始化。
【关于STM32F4 使用DMA数据流-冲突下-复用输出PWM操作问题的记录以及解决办法】

5再后来因为需求变更自己也想知道一些边界的存在所有尝试所有数据流点灯的。
【软件STM32cubeIDE下STM32F4xx使用DMA+定时器+推PWM+点亮灯带WS2812相关-进阶全数据流版】

4移植相关讲解

写在前面我们看一些基础案例最终希望能运用在我们自己的项目上的而不是说以基础样例为基础这就会涉及弄明白了样例后将相应代码添加到自己的工程里同时不与现有自己项目工程冲突而且移植时一定是你自己基础样例能跑起来了不要没跑起来就移植这样你都不知道基础样例问题还是移植中产生问题。

本次实验我将选取我以前一个样例同时也会上传其代码以此代码为样例来说明要移植哪些代码。

1第一步MX_GPIO_Init()与 MX_DMA_Init();

这两函数里面内容其实挺少的的但是稍微不注意灯带就可能跑不起来。
1MX_GPIO_Init()内容如下主要是RCC的使能。
在这里插入图片描述

2MX_DMA_Init()内容如下主要是数据流优先级以及中断使能。
在这里插入图片描述

2第二步定时器组初始化函数例如void MX_TIM2_Init(void);

1无论STM32cubeIDE软件还是STM32cubeMX软件通过配置软件都会为你自动生成好这些函数只要你设置没错但是移植时要注意有时候我们不只是使用一组定时器这里也用通道分配只要你确定选择使用一下通道了就不要随意更改移植时主要将里面内容复制。

  1. 注意函数顺序
  2. 移植目标要是有系统时注意是否自动初始化这样会打乱原本函数顺序
  3. 注意里面内容

如下图所示
在这里插入图片描述

3第三步在stm32f4xx_hal_msp.c文件下一些函数以及结构体声明;

1主要是这几个函数圈出来这几个为啥不说是三个呢因为我见过有些编译器生成出来的不叫这个名字的类似名字但带base这样。
在这里插入图片描述
2加入结构体声明
在这里插入图片描述

4第四步在stm32f4xx_it.c文件下数据流函数加入中断函数以及结构体声明;

1有时候可能其他比如串口SPI占用了这个数据流是不能共存的我们要去掉相应使能并且更换我们需要的。
在这里插入图片描述

2结构体声明
在这里插入图片描述

5第五步灯带驱动编写以及移植。

1这块弄过很多次了主要是功能是往数组里赛灯带数据的功能和一些声明


uint32_t tim2_ccr1_value[]={10,20,30,40,50,60,70,80,90};
uint16_t tim3_ccr1_value[]={10,20,30,40,50,60,70,80,90};
#define ONE_PULSE        (59)                           //1
#define ZERO_PULSE       (29)                           //0
#define RESET_PULSE      (48)                           //80 ¸
#define LED_NUMS         (22)                            //led ¸
#define LED_DATA_LEN     (24)                           //led
#define WS2812_DATA_LEN  (LED_NUMS*LED_DATA_LEN)        //ws2812

uint16_t  RGB_buffur[RESET_PULSE + WS2812_DATA_LEN] = { 0 };
uint32_t  RGB_buffur1[RESET_PULSE + WS2812_DATA_LEN] = { 0 };


void ws2812_set_RGB(uint8_t R, uint8_t G, uint8_t B, uint16_t num)
{

    uint16_t * p = (RGB_buffur + RESET_PULSE) + (num * LED_DATA_LEN);

    for (uint16_t i = 0;i < 8;i++)
    {

        p[i]      = (G << i) & (0x80)?ONE_PULSE:ZERO_PULSE;
        p[i + 8]  = (R << i) & (0x80)?ONE_PULSE:ZERO_PULSE;
        p[i + 16] = (B << i) & (0x80)?ONE_PULSE:ZERO_PULSE;
    }

}

void ws2812_set_RGB1(uint8_t R, uint8_t G, uint8_t B, uint16_t num)
{

    uint32_t * p = (RGB_buffur1 + RESET_PULSE) + (num * LED_DATA_LEN);

    for (uint16_t i = 0;i < 8;i++)
    {

        p[i]      = (G << i) & (0x80)?ONE_PULSE:ZERO_PULSE;
        p[i + 8]  = (R << i) & (0x80)?ONE_PULSE:ZERO_PULSE;
        p[i + 16] = (B << i) & (0x80)?ONE_PULSE:ZERO_PULSE;
    }

}



void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
	//if(htim)
 __HAL_TIM_SetCompare(htim, TIM_CHANNEL_1,0); //占空比清0若不清会导致灯珠颜色不�???
    HAL_TIM_PWM_Stop_DMA(htim,TIM_CHANNEL_1);
    __HAL_TIM_SetCompare(htim, TIM_CHANNEL_2,0); //占空比清0若不清会导致灯珠颜色不�???
       HAL_TIM_PWM_Stop_DMA(htim,TIM_CHANNEL_2);
       __HAL_TIM_SetCompare(htim, TIM_CHANNEL_3,0); //占空比清0若不清会导致灯珠颜色不�???
          HAL_TIM_PWM_Stop_DMA(htim,TIM_CHANNEL_3);
          __HAL_TIM_SetCompare(htim, TIM_CHANNEL_4,0); //占空比清0若不清会导致灯珠颜色不�???
             HAL_TIM_PWM_Stop_DMA(htim,TIM_CHANNEL_4);
}

6第六步生成想要的灯带颜色。

1这部分因为之前说过如何生成好看的彩灯这一步其实是可以单独列出一个部分
我这部分是找到网上资料然后自己工程调优过的细节也说了如下文章。

如果你已经会了基本的点灯带那么当你想让你的灯带颜色更漂亮些那么可以推荐看下列文章。
【关于STM32F4xx使用DMA+PWM调试灯带WS2812过程记录+进阶】

7第七步函数输出。

1这块也比较明确就一个函数直接DMA推送优点是不耗费CPU资源。
在这里插入图片描述

6实验代码

实验代码连接https://download.csdn.net/download/qq_22146161/87383562

7细节点

细节点还是零零散散将一些的这里有可能有之前说过的。

1移植目标为带有系统时要注意函数初始化顺序。

个人案例真实写照当时移植是RT-thread,虽然系统为我们带来方便但是有时候调试是真摸不到头脑。
这块因为系统原因定时器先初始化了结果就是跑不起来样例一上就行一移植就废。

2一些容易误导名字无法使用数据流-边界问题

这属于边界问题当时为了探究F4边界想把所有数据流都点灯带结果16个通道只是点了14个想TIM_TRIG和TIM1_UP这种是不能用的。另外TIM1_CH1N也尝试过不能用
在这里插入图片描述

9总结

更多的测试有些我可能无法传递也许是我忘了也许是文字表达有限我这些文章是你的辅助一定要动手自己尝试下同时也非常欢迎讨论。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

“【软件STM32cubeIDE下STM32F4xx使用DMA+定时器推PWM+灯带WS2812-进阶-综合汇总(讲解移植相关)】” 的相关文章