软件STM32cubeIDE下STM32F1xx使用定时器(TIM8)+DMA+PWM点亮灯带WS2812-基础样例

news2024/11/22 23:25:59

软件STM32cubeIDE下STM32F1xx使用定时器(TIM8)+DMA+PWM点亮灯带WS2812-基础样例

  • (1)前言
  • (2)环境说明
  • (3)先行了解
    • 本次调到坑里的两个点问题点
      • (1)TIM3_ch2,在STM32F103没有对照DMA请求映射
      • (2)时钟频率出现误差。
      • (3)软件下载代码失败
  • (4)实验过程
      • 1)基础配置:配置下载和时钟
      • 3)==时钟配置==
      • 2)==定时器配置==
      • 4)加入后续灯带功能代码
  • (5)代码链接
  • (6)实验效果
    • (7)总结

(1)前言

好长时间不调试灯带ws2812了,最近项目上,要在STM32F1上进行点灯带ws2812,虽然自己之前做了很多了,但是人有个性质,一旦某个事情做完了,你不在去惦记它了,基本会完全抛在脑后。所以才体现记录的重要性,本次在做STM32F1上验证时,即使之前有经验的情况下,还是掉坑里去了,虽然爬的很快,但是觉得有必要记录下来。

(2)环境说明

  • 软件环境:STM32cubeIDE 1.8.0
  • 硬件芯片:STM32F103VET6(野火:指南者)
  • 其它硬件:ws2812灯带,下载器,逻辑分析仪等。

需求:本次需求比较确定,是使用PC7这个引脚输出pwm,带动灯带。
目标:我们的目标也比较明确,当然,可以不一定非要灯带ws2812,有逻辑分析仪,也可以看最后结果,都有就更好了。

(3)先行了解

关于灯带原理,如需要的灯带频率是800Khz这些,其实网上资料是非常多的,本篇主要是具体操作过程,偏重动手实验,具体原理,自己的其它文章和网上文章挺多的,就不在这上花时间。

本次调到坑里的两个点问题点

(1)TIM3_ch2,在STM32F103没有对照DMA请求映射

调试前没有看手册,直接看到PC7上有TIM3_ch2了,以为就是有这个请求映射,如下图,在软件选择时,发现了异样,但是没有在意,因为开始时选择的时TIM3_ch2,这里选择DMA时,发现没有TIM3_ch2,出现TIM3_ch4。
在这里插入图片描述
后来一查手册“STM32F10x中文参考手册”,发现DMA1请求映射里没有TIM3_ch2,所以咋调,灯带都不亮。
在这里插入图片描述
还有有个定时8,调试后可以使用,所以在PC7引脚上,使用TIM8的TIM8_ch2,做的本实验。
在这里插入图片描述

(2)时钟频率出现误差。

使用定时器8进行调试,然后用逻辑分析仪一分析,发现时间周期不对,如下图,不是1.25us左右,而是1.5us
在这里插入图片描述
后来想到,F1和F4系统时钟频率是不一样的,如下图。
在这里插入图片描述
在这里插入图片描述

所以调试的应该注意一下。

调整后,如下图,
在这里插入图片描述
再次使用逻辑分析仪就可以。
在这里插入图片描述

(3)软件下载代码失败

使用ST-link,或者j-link,会碰见下载失败情况,这种多尝试吧,尝试两个工具交替使用,
在这里插入图片描述

要不还其它下载软件尝试。

在这里插入图片描述

(4)实验过程

1)基础配置:配置下载和时钟

(1)时钟:基本配置
在这里插入图片描述
(2)下载口:基本配置
在这里插入图片描述

3)时钟配置

原本这个因为放在前面配置的,但实际上,我们都是后配置时钟的,为了方便理解我先配置时钟,因为TIM8在APB2上,所以是72Mhz。
在这里插入图片描述

2)定时器配置

因为定时3的TIM3_ch2无法使用,就选择了TIM8的。因为挂载的总线是APB2 上的,如下图,可以看到在APB2上,我们配置的时钟是72Mhz由此,才有我们后续算式,为啥填写的90,因为72Mhz/800Khz=90,但是IDE这款软件,是让我们后配置时钟界面,无奈,我只能将时钟界面提前,好承上启下。
在这里插入图片描述

(1)定时器频率配置
在这里插入图片描述
(2)DMA配置,由此保存代码,然后生成。
在这里插入图片描述

4)加入后续灯带功能代码

加入灯带功能代码,着需要注意的是,因为时钟84Mhz到72Mhz的改变,相应1和0的实际时间也要改变。
在这里插入图片描述

增加的代码段。

#define ONE_PULSE        (60)                           //1 Âë¼ÆÊý¸öÊý
#define ZERO_PULSE       (30)                           //0 Âë¼ÆÊý¸öÊý
#define RESET_PULSE      (48)                           //80 ¸´Î»µçƽ¸öÊý£¨²»ÄܵÍÓÚ40£©
#define LED_NUMS         (4)                            //led ¸öÊý
#define LED_DATA_LEN     (24)                           //led ³¤¶È£¬µ¥¸öÐèÒª24¸ö×Ö½Ú
#define WS2812_DATA_LEN  (LED_NUMS*LED_DATA_LEN)        //ws2812µÆÌõÐèÒªµÄÊý×鳤¶È

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

void ws2812_set_RGB(uint8_t R, uint8_t G, uint8_t B, uint16_t num)
{
    //Ö¸ÕëÆ«ÒÆ:ÐèÒªÌø¹ý¸´Î»ÐźŵÄN¸ö0
    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 HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *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);
}




void ws2812_example(void)
{
    //#1.Ìî³äÊý×é
    ws2812_set_RGB(0xFF, 0x06, 0x06, 0);
    ws2812_set_RGB(0xFF, 0x06, 0x06, 1);
    ws2812_set_RGB(0xFF, 0x06, 0x06, 2);
    ws2812_set_RGB(0xFF, 0x06, 0x06, 3);


    HAL_TIM_PWM_Start_DMA(&htim8,TIM_CHANNEL_2,(uint32_t *)RGB_buffur,176);

    HAL_Delay(5000);

    ws2812_set_RGB(0x03, 0xF4, 0x00, 1);
    ws2812_set_RGB(0x03, 0xF4, 0x00, 2);
    ws2812_set_RGB(0x03, 0xF4, 0x00, 3);
    ws2812_set_RGB(0x03, 0xF4, 0x00, 0);
//    ws2812_set_RGB(0x22, 0x00, 0x00, 1);
//     ws2812_set_RGB(0x00, 0x22, 0x00, 2);
//     ws2812_set_RGB(0x00, 0x00, 0x22, 3);
//     ws2812_set_RGB(0x22, 0x22, 0x22, 0);

//    HAL_TIM_PWM_Start_DMA(&htim3,TIM_CHANNEL_1,(uint32_t *)RGB_buffur,176);
    HAL_TIM_PWM_Start_DMA(&htim8,TIM_CHANNEL_2,(uint32_t *)RGB_buffur,176);

    HAL_Delay(5000);
}

(5)代码链接

样例代码链接:https://download.csdn.net/download/qq_22146161/87741426

(6)实验效果

如下图,本次实验效果截图
在这里插入图片描述

(7)总结

再熟悉的东西,也有可能翻车,但好处是,爬坑非常快。

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

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

相关文章

真题详解(极限编程)-软件设计(六十一)

真题详解&#xff08;二分查找平均值&#xff09;-软件设计&#xff08;六十)https://blog.csdn.net/ke1ying/article/details/130417464 VLANtag属于 数据链路层实现。 数据链路层&#xff1a;网桥交换机。 网络层&#xff1a;路由器。 物理层&#xff1a;中继器。 Telent…

1694_week1_MIT使用Python编程学习手记1

全部学习汇总&#xff1a; GreyZhang/python_basic: My learning notes about python. (github.com) 首先说明一下&#xff0c;这部分信息的整理只是我个人的理解。由于自己的知识功底以及英语水准&#xff0c;很可能会有大量的疏漏。再此&#xff0c;我只想把自己学习时候的一…

Linux进程通信:信号 信号集 信号集函数

1. 信号的概念 Linux进程间通信的方式之一。信号也称为“软件中断”。 信号特点&#xff1a; 简单&#xff1b;携带信息有限&#xff1b;满足特定条件才发送信号&#xff1b;可进行用户空间和内核空间进程的交互&#xff1b; 信号4要素&#xff1a; &#xff08;1&#xf…

抓马,互联网惊现AI鬼城:上万个AI发帖聊天,互相嗨聊,人类被禁言

近日又有一个社区迷惑走红 上万个AI发帖聊天&#xff0c;人类不得入内&#xff1f; 据红星新闻报道 近日&#xff0c;一个名为Chirper的AI网络社区突然爆火 上万个AI聊天机器人在其中 激烈地聊天、互动、分享 社区主页右上角明确写着&#xff1a; “这是一个人工智能的社交…

《斯坦福数据挖掘教程·第三版》读书笔记(英文版) Chapter 1 Data Mining

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 1 Data Mining Now, statisticians view data mining as the construction of a statistical model, that is, an underlying distribution from which the visible data is drawn. However, ma…

docker上部署程序后无法连接数据库的问题

咱就是说&#xff0c;这个问题差点给我劝退docker。下面说下环境情况。 装了个javaweb程序容器&#xff0c;装了个数据库容器&#xff0c;javaweb容器就是链接不上数据库。 咱也是跟着菜鸟教程的容器互联步骤简历网络链接&#xff1a; 并且启动时增加--networkxxx 都加入到了…

socket通信之select

多线程版本的的socket的server端 #include "socket.hpp" #include <iostream> #include <string> #include <memory>DWORD WINAPI threadProc(LPVOID lp) {SOCKET sClient *(SOCKET*)(lp);while (true) {char buff[1024] { 0 };int result rec…

数据结构初阶 —— 树(堆)

目录 一&#xff0c;堆 堆的概念 向下调整法&#xff08;数组&#xff09; 向上调整法&#xff08;数组&#xff09; 堆的创建&#xff08;建堆&#xff09; 堆的实现 一&#xff0c;堆 堆的概念 如有个关键码的集合K{&#xff0c;&#xff0c;&#xff0c;...&#xf…

Anaconda你不得不知道的若干知识点

Anaconda你不得不知道的若干知识点 1. 查看所有的环境变量2. 加载tensorflow在jupyter中会挂掉怎么办&#xff1f;3. Excel xlsx file&#xff1b; not supported两种解决办法4. (unicode error)5. 统计pandas二维表中的某列的重复值法一&#xff1a;df.loc[:,col_name].value_…

Fabric测试与基础

Fabric官网:Introduction — hyperledger-fabricdocs main documentation 1.测试网络 ./network.sh up #启动./network.sh down #关闭 2.Fabric核心模块 peer:主节点模块&#xff0c;负责存储区块链数据&#xff0c;运行维护链码 orderer:交易打包、排序模块 cryptogen:组织…

【机器学习分支】重要性采样(Importance sampling)学习笔记

重要性采样&#xff08;importance sampling&#xff09;是一种用于估计概率密度函数期望值的常用蒙特卡罗积分方法。其基本思想是利用一个已知的概率密度函数来生成样本&#xff0c;从而近似计算另一个概率密度函数的期望值。 想从复杂概率分布中采样的一个主要原因是能够使用…

uniapp 抖音授权登录、发布、分享 Ba-Aweme

简介&#xff08;下载地址&#xff09; Ba-Aweme 是一个集成抖音的uniapp插件&#xff0c;支持抖音授权登录&#xff0c;发布图片、视频&#xff0c;分享到联系人群组&#xff0c;直接拍摄等。自带选择图片和选择视频方法。 注意&#xff1a; 使用前&#xff0c;先到抖音开放…

LabVIEW CompactRIO 开发指南 3 选择CompactRIO编程模式

第二章 选择CompactRIO编程模式 第一章中介绍的CompactRIO架构为我们提供了通过LabVIEW FPGA定制FPGA硬件或使用NI CompactRIO扫描模式来实现I/O的选项。如果计算机上有LabVIEW Real-Time和LabVIEW FPGA&#xff0c;那么当向LabVIEW项目添加CompactRIO目标时&#xff0c;将提…

BM48-数据流中的中位数

题目 如何得到一个数据流中的中位数&#xff1f;如果从数据流中读出奇数个数值&#xff0c;那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值&#xff0c;那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流&…

【软考网络管理员】2023年软考网管初级常见知识考点(3)- 网络体系结构

【写在前面】也是趁着五一假期前再写几篇分享类的文章给大家&#xff0c;希望看到我文章能给软考网络管理员备考的您带来一些帮助&#xff0c;5月27号也是全国计算机软件考试统一时间&#xff0c;也就不用去各个地方找资料和代码了。紧接着我就把我整理的一些资料分享给大家哈&…

【Python】selenium工具

目录 1. 安装 2. 测试 3. 无头浏览器 4. 元素定位 5. 页面滑动 6. 按键、填写登录表单 7. 页面切换 Selenium是Web的自动化测试工具&#xff0c;为网站自动化测试而开发&#xff0c;Selenium可以直接运行在浏览器上&#xff0c;它支持所有主流的浏览器&#xff0c;可以接…

【Linux - Shell常用命令】- 判断文件是否存在、去掉文件后缀

目录 一、判断文件是否存在1.1 判断目录是否存在1.2 判断文件是否存在1.3 其他文件类型判断 二、字符串截取&#xff08;去掉文件后缀&#xff09;2.1 获取文件后缀2.2 获取文件前缀 一、判断文件是否存在 1.1 判断目录是否存在 将下面代码保存为dirExist.sh &#xff0c;运行…

隐私权限是什么

导读&#xff1a; 隐私权在现代社会对于人们而言是重要的人格权&#xff0c;而随着互联网技术的发展&#xff0c;实践中侵犯隐私权的行为很常见。那么隐私权限是什么&#xff1f;侵犯隐私权的行为有哪些&#xff1f;侵犯他人隐私权要负什么法律责任&#xff1f;接下来将由找法…

Linux-修改虚拟机为静态IP 和 主机名

一、设置虚拟机的IP为静态的 一般情况下&#xff0c;NAT网络连接模式下&#xff0c;DHCP动态分配IP地址的&#xff0c;但这样在每次访问连接Linux虚拟机时&#xff0c;都要先去查询ip地址&#xff0c;很麻烦&#xff0c;干脆就将虚拟机IP地址写死&#xff0c;也就是设置为静态…

数据结构初阶 —— 树(二叉树)

目录 一&#xff0c;二叉树 特殊二叉树 二叉树的性质 二叉树的存储结构 二&#xff0c;二叉树链式结构 二叉树的遍历&#xff08;四种&#xff09; 二叉树接口 试题 一&#xff0c;二叉树 由一个根节点&#xff0c;加上两颗左二叉树和右二叉树组成&#xff0c;可以为空…