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

news2024/12/28 20:21:41

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位定时器2(TIM2)用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();

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

2)MX_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)总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/160836.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Git】GitHub 操作

6、GitHub 操作 GitHub 网址&#xff1a;https://github.com/ Ps:全球最大同性交友网站&#xff0c;技术宅男的天堂&#xff0c;新世界的大门&#xff0c;你还在等什么? 账号姓名验证邮箱atguiguyueyue岳不群atguiguyueyuealiyun.comatguigulinghuchong令狐冲atguigulinghu…

72、PaletteNeRF: Palette-based Appearance Editing of Neural Radiance Fields

简介 官网:https://palettenerf.github.io/ 以(a)多视图照片为训练输入&#xff0c;重建NeRF并将其外观分解为一组(b)基于3D调色板的色基&#xff0c;实现了©直观和逼真的场景重新着色&#xff0c;在任意视图之间具有3D一致性&#xff0c;如(d)所示&#xff0c;该方法支…

人工智能与Python的渊源

人工智能起源与发展 文章目录人工智能起源与发展前言一、达特茅斯会议与人工智能起源二、人工智能发展的高峰与低谷Python与人工智能构建Python人工智能编程环境1.Python版本2.Anaconda编程环境数据处理常用算法2.1傅里叶变换2.1.1傅里叶分析的由来2.1.2傅里叶变换原理及应用傅…

MODBUS协议下,组态王与S7-1200能否建立无线通讯?

MODBUS协议下&#xff0c;想要组态王与S7-1200之间的无线通讯其实很容易。可采用了西门子PLC专用无线通讯终端DTD434MC&#xff0c;作为实现无线通讯的硬件设备&#xff0c;使用简单方便&#xff0c;不必深入理解 MODBUS 协议细节&#xff0c;无需更改网络参数直接替换有线连接…

波士顿房价预测—随机梯度下降法优化

根据我上一篇关于波士顿房价预测一文可以知道&#xff0c;如果使用梯度下降法&#xff0c;需要将所有的样本对梯度的贡献取平均&#xff0c;根据梯度更新参数。 但是面对海量样本的数据集&#xff0c;如果每次计算都使用全部的样本来计算损失函数和梯度&#xff0c;性能会很差&…

如何创建商用照明 App SDK 应用?

商用照明 App SDK 是专为照明行业的物联网应用提供的移动端开发工具。通过商用照明 SDK&#xff0c;大家可以形成完整的商用照明物联网控制系统&#xff0c;多协议兼容&#xff0c;完美满足绿色建筑的设备管理及能源管理要求。 什么是涂鸦商用照明&#xff1f; 涂鸦商用照明解…

python基础语法(1)

专栏&#xff1a;python 每日一句&#xff1a;人生&#xff0c;无非只有三天&#xff0c;昨天&#xff0c;今天&#xff0c;明天。昨天很长&#xff0c;说不清有多少天&#xff0c;但不管有多少天&#xff0c;不管是受到挫折&#xff0c;还是取得辉煌&#xff0c;都只能代表过去…

Feign

文章目录Http客户端Feign1、Feign替代RestTemplate1.1、RestTemplate方式调用存在的问题1.2、Feign介绍1.3、定义和使用Feign客户端2、Feign的自定义配置2.1、修改日志级别3、Feign的性能优化3.1、Feign的性能优化-连接池配置4、Feign的最佳实践4.1、方式一&#xff08;继承&am…

TypeScript类型 : any,unknown

1.any类 在某些情况下&#xff0c;我们确实无法确定一个变量的类型&#xff0c;并且可能它会发生一些变化&#xff0c;这个时候我们可以使用any类型&#xff08;类似 于Dart语言中的dynamic类型&#xff09;。 any类型有点像一种讨巧的TypeScript手段&#xff1a; 1.我们可以…

【23届秋招总结】本科小学弟成功签约滴滴后端开发offer

大家好&#xff01;我是路飞&#xff0c;最近工作太忙啦&#xff0c;断更很久&#xff0c;今天给大家分享一位本科23届小学弟的秋招历程&#xff5e; 在今年整体上就业困难&#xff0c;各大公司校招HC收缩的情况下&#xff0c;这位小学弟也历经坎坷成功拿到了滴滴后端开发岗位…

【安卓学习笔记】安卓的事件处理

安卓提供了两种方式的事件处理&#xff1a;基于回调的事件处理和基于监听的事件处理。 基于监听的事件处理 基于监听的事件处理一般包含三个要素&#xff0c;分别是&#xff1a; Event Source&#xff08;事件源&#xff09;&#xff1a;事件发生的场所&#xff0c;通常是各个…

c++11 标准模板(STL)(std::forward_list)(六)

定义于头文件 <forward_list> template< class T, class Allocator std::allocator<T> > class forward_list;(1)(C11 起)namespace pmr { template <class T> using forward_list std::forward_list<T, std::pmr::polymorphic_…

动态内存管理详解(malloc、calloc、realloc)

文章目录 一、什么是动态内存 二、为什么要存在动态内存分配 三、动态内存函数的介绍 3、1 malloc和free的介绍 3、2 calloc的介绍 3、3 reallco的介绍 四、常见的动态内存错误 4、1 对NULL指针的解引用操作 4、2 对动态开辟空间的越界访问 4、3 对非动态开辟内存使用free释放 …

rcu锁原理以及rcu example学习

rcu参考资料&#xff1a; https://airekans.github.io/c/2016/05/10/dive-into-liburcu https://lwn.net/Articles/262464/ https://cloud.tencent.com/developer/article/1684477 https://www.cnblogs.com/LoyenWang/p/12681494.html userspace rcu: https://github.com/urcu…

PHP 过滤器

PHP 过滤器用于验证和过滤来自非安全来源的数据&#xff0c;比如用户的输入。什么是 PHP 过滤器&#xff1f;PHP 过滤器用于验证和过滤来自非安全来源的数据。测试、验证和过滤用户输入或自定义数据是任何 Web 应用程序的重要组成部分。PHP 的过滤器扩展的设计目的是使数据过滤…

目标检测、实例分割、旋转框样样精通!详解高性能检测算法 RTMDet

1. 简介 近几年来&#xff0c;目标检测模型&#xff0c;尤其是单阶段目标检测模型在工业场景中已经得到广泛应用。对于检测算法来说&#xff0c;模型的精度以及运行效率是实际使用时最受关注的指标。因此&#xff0c;我们对目前的单阶段目标检测器进行了全面的改进&#xff1a…

超参数、划分数据集、

目录1.超参数(hyperparameters)参数(Parameters)&#xff1a;&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;...超参数&#xff1a;能够控制参数W,b的参数&#xff0c;是在开始学习之前设置的参数。比如&#xff1a;学习率、梯度下降循环的数量#iterations、隐…

【阶段三】Python机器学习23篇:机器学习项目实战:XGBoost分类模型

本篇的思维导图: XGBoost算法可以说是集成学习方法中的王牌算法。在著名的数据挖掘比赛平台Kaggle上,众多获胜者都使用了XGBoost算法,它在绝大多数回归问题和分类问题上的表现都十分不错。 XGBoost算法的核心思想 XGBoost算法在某种程度上可以说是GBDT算法…

蓝桥杯:超级质数

目录 题目链接 问题描述 答案提交 本题答案为&#xff1a;373。 思路&#xff1a; 模拟代码(Java)&#xff1a; 问题描述 如果一个质数 P 的每位数字都是质数, 而且每两个相邻的数字组成的两位 数是质数, 而且每三位相邻的数字组成的三位数是质数, 依次类推, 如果每相 邻…

【Node.js实战】一文带你开发博客项目之日志(文件读写、stream流、写日志)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端 &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿多个前端 offer&#xff08;秋招&#xff09; &#x1f680;未…