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

这篇具有很好参考价值的文章主要介绍了软件STM32cubeIDE下STM32F1xx使用定时器(TIM8)+DMA+PWM点亮灯带WS2812-基础样例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

(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。
软件STM32cubeIDE下STM32F1xx使用定时器(TIM8)+DMA+PWM点亮灯带WS2812-基础样例
后来一查手册“STM32F10x中文参考手册”,发现DMA1请求映射里没有TIM3_ch2,所以咋调,灯带都不亮。
软件STM32cubeIDE下STM32F1xx使用定时器(TIM8)+DMA+PWM点亮灯带WS2812-基础样例
还有有个定时8,调试后可以使用,所以在PC7引脚上,使用TIM8的TIM8_ch2,做的本实验。
软件STM32cubeIDE下STM32F1xx使用定时器(TIM8)+DMA+PWM点亮灯带WS2812-基础样例

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

使用定时器8进行调试,然后用逻辑分析仪一分析,发现时间周期不对,如下图,不是1.25us左右,而是1.5us
软件STM32cubeIDE下STM32F1xx使用定时器(TIM8)+DMA+PWM点亮灯带WS2812-基础样例
后来想到,F1和F4系统时钟频率是不一样的,如下图。
软件STM32cubeIDE下STM32F1xx使用定时器(TIM8)+DMA+PWM点亮灯带WS2812-基础样例
软件STM32cubeIDE下STM32F1xx使用定时器(TIM8)+DMA+PWM点亮灯带WS2812-基础样例

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

调整后,如下图,
软件STM32cubeIDE下STM32F1xx使用定时器(TIM8)+DMA+PWM点亮灯带WS2812-基础样例
再次使用逻辑分析仪就可以。
软件STM32cubeIDE下STM32F1xx使用定时器(TIM8)+DMA+PWM点亮灯带WS2812-基础样例

(3)软件下载代码失败

使用ST-link,或者j-link,会碰见下载失败情况,这种多尝试吧,尝试两个工具交替使用,
软件STM32cubeIDE下STM32F1xx使用定时器(TIM8)+DMA+PWM点亮灯带WS2812-基础样例

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

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

(4)实验过程

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

(1)时钟:基本配置
软件STM32cubeIDE下STM32F1xx使用定时器(TIM8)+DMA+PWM点亮灯带WS2812-基础样例
(2)下载口:基本配置
软件STM32cubeIDE下STM32F1xx使用定时器(TIM8)+DMA+PWM点亮灯带WS2812-基础样例

3)时钟配置

原本这个因为放在前面配置的,但实际上,我们都是后配置时钟的,为了方便理解我先配置时钟,因为TIM8在APB2上,所以是72Mhz。
软件STM32cubeIDE下STM32F1xx使用定时器(TIM8)+DMA+PWM点亮灯带WS2812-基础样例

2)定时器配置

因为定时3的TIM3_ch2无法使用,就选择了TIM8的。因为挂载的总线是APB2 上的,如下图,可以看到在APB2上,我们配置的时钟是72Mhz由此,才有我们后续算式,为啥填写的90,因为72Mhz/800Khz=90,但是IDE这款软件,是让我们后配置时钟界面,无奈,我只能将时钟界面提前,好承上启下。
软件STM32cubeIDE下STM32F1xx使用定时器(TIM8)+DMA+PWM点亮灯带WS2812-基础样例

(1)定时器频率配置
软件STM32cubeIDE下STM32F1xx使用定时器(TIM8)+DMA+PWM点亮灯带WS2812-基础样例
(2)DMA配置,由此保存代码,然后生成。
软件STM32cubeIDE下STM32F1xx使用定时器(TIM8)+DMA+PWM点亮灯带WS2812-基础样例

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

加入灯带功能代码,着需要注意的是,因为时钟84Mhz到72Mhz的改变,相应1和0的实际时间也要改变。
软件STM32cubeIDE下STM32F1xx使用定时器(TIM8)+DMA+PWM点亮灯带WS2812-基础样例

增加的代码段。

#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)实验效果

如下图,本次实验效果截图
软件STM32cubeIDE下STM32F1xx使用定时器(TIM8)+DMA+PWM点亮灯带WS2812-基础样例

(7)总结

再熟悉的东西,也有可能翻车,但好处是,爬坑非常快。文章来源地址https://www.toymoban.com/news/detail-428532.html

到了这里,关于软件STM32cubeIDE下STM32F1xx使用定时器(TIM8)+DMA+PWM点亮灯带WS2812-基础样例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于STM32CubeIDE HAL库利用基本定时器实现串口接收不定长数据

    ✨申明:本文章仅发表在 CSDN 网站,任何其他网见此内容均为盗链和爬取,请多多尊重和支持原创! 🍁对于文中所提供的相关资源链接将作不定期更换。 📌相关参考《HAL库教程9:串口接收不定长数据》 🎉对于串口接收不定长数据的处理方案网上有很多,个人觉得采用定时

    2024年02月09日
    浏览(53)
  • STM32F105RBT6 使用定时器TIM3输出PWM波

    2.1 相关函数 RCC_APB1PeriphClockCmd、GPIO_Init、TIM_TimeBaseInit、TIM_OC4Init、TIM_OC4PreloadConfig、NVIC_Init、TIM_ITConfig、TIM_Cmd、 3.1 在启动文件里面找到TIM3 对应的中断入口函数,也就是中断服务函数 TIM3_IRQHandler 4.1 中断服务函数需要快速地执行完毕。中断服务函数应该避免执行太多的计算复

    2024年02月08日
    浏览(46)
  • STM32F4使用高级定时器(TIM1和TIM8)输出PWM问题

    STM32F4使用高级定时器(TIM1和TIM8)输出PWM时要使用TIM_CtrlPWMOutputs使能PWM输出,否则不会输出PWM波形,这一点是和通用定时器输出PWM不一样的地方,通用定时器是不用配置TIM_CtrlPWMOutputs函数的。、

    2024年02月15日
    浏览(40)
  • STM32F407 滴答定时器

    介绍STM32F407滴答定时器配置方法、使用方式,封装延时函数得到精确的时间。 STM32F407参考手册中第10章介绍了滴答定时器的校准值。 M4权威指南介绍滴答定时器的章节,M3权威指南中与M4权威指南中的介绍一样。 在sys.c文件中增加滴答定时器的代码 在delay.c文件增加以下代码

    2024年02月11日
    浏览(49)
  • STM32F4X 定时器中断

    定时器(Timer)最基本的功能就是定时,比如定时翻转LED灯,定时向串口发送数据等。除此之外,定时器还可以跟GPIO结合使用,利用定时器产生PWM波形,利用定时器捕捉电平信号等。本章先来讲解定时器的最基本的用法,定时功能。 STM32F4X将定时器分成3类,分别是基本定时器,

    2024年02月12日
    浏览(43)
  • STM32F407高级定时器-死区时间研究-STM32CubeMX

    距离上次写笔记,已经过去好长时间了 中间也折腾过不少东西,但是都没咋整理,主要是这中间都是在干活儿,不是自己想要研究的,也没想着要写。 从去年10月份开始想要学习FOC,10月份研究了一个月,到11月初,实现了SVPWM驱动BLDC电机,使用串口实现开环下转速和力矩调

    2023年04月23日
    浏览(53)
  • STM32f103入门(5)定时器中断

    STM32 TIM(定时器/计数器)模块的中断流程如下: 配置TIM寄存器:首先,通过配置TIM相关的寄存器来设置计时器的基本参数,例如预分频系数、计数模式、计数器周期等。 使能TIM中断:使用TIM_ITConfig函数或者直接操作TIM的相关寄存器,将所需的中断使能位置1。可以选择使能不

    2024年02月11日
    浏览(34)
  • STM32F407 ADC+DMA+定时器 定时采样模拟量

    项目中需要对多个通道的电压进行一定频率的AD采样,由于采样过程贯穿整个任务,为了使采样过程尽可能不占用CPU资源,采用定时器触发的多通道ADC扫描采样,且采样数据由DMA传到RAM中的缓存。 这样做有以下几个好处:1、由定时器触发ADC采样,这样采样的频率可控,且定时

    2024年02月14日
    浏览(47)
  • 【单片机】STM32单片机的各个定时器的定时中断程序,标准库,STM32F103

    高级定时器和普通定时器的区别(https://zhuanlan.zhihu.com/p/557896041): TIM1是高级定时器,使用的时钟总线是RCC_APB2Periph_TIM1,和普通定时器不一样。 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用

    2024年02月07日
    浏览(55)
  • STM32F系列项目定时器配置-中断触发源详解

    1.以高级定时器为例:  2.触发源选择与极性选择:   3.触发源介绍 (282条消息) 【STM32技巧】(1)STM32定时器8种触发源之ITR0~ITR3说明_stm32 定时器触发定时器_小石头有大内涵的博客-CSDN博客 ITR0 内部触发0 ITR1 内部触发1 ITR2 内部触发2 ITR3 内部触发3 ITR3  

    2024年02月11日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包