STM32F103+HAL+PWM+DMA+WS2812

最新更新时间:2019-04-09来源: eefocus关键字:STM32F103  HAL  PWM  DMA  WS2812 手机看文章 扫描二维码
随时随地手机看文章

如题:用HAL库,通过stm32f103r8的PWM的DMA模式控制WS2812


硬件使用的是TIM3的CHANNEL1硬件配置如下:



时钟为常规时钟配置



定时器3产生1.25us周期需要的arr为89(计算略)



DMA配置如下:



几个需要注意的地方,


1.DMA


  1.1DMA方向    Memory To Peripheral (默认为Peripheral  To Memory)


  1.2DMA传输位宽 Half Word


2.定义数组



2.1一定要定位为16bit,


3.定义高低位


#define BIT_1                   61u //1比较值为61 850us

#define BIT_0                   28u //0比较值为28 400us 


4. //发送函数


void TM7812_show(void)

{

    uint8_t i, j;



    for(i = 0; i < PIXEL_MAX; i++)

    {

        for(j = 0; j < 8; j++)

        {

            frame.data[24 * i + j]     = (rBuffer[i] & (0x80 >> j)) ? BIT_1 : BIT_0; //将高低位扩展到16bit

            frame.data[24 * i + j + 8]   = (gBuffer[i] & (0x80 >> j)) ? BIT_1 : BIT_0;

            frame.data[24 * i + j + 16]  = (bBuffer[i] & (0x80 >> j)) ? BIT_1 : BIT_0;



        }

    }

    HAL_TIM_PWM_Start_DMA(&htim3, TIM_CHANNEL_1, (uint32_t *)&frame, 3 + 24 * PIXEL_MAX + 1);  //虽然传的是16bit但是要先转为32bit指针,


//貌似是函数要求为32位无符号指针,但实际传输时,因为之前定义的为half word,所以还是16bit传输;


//不对还请指正


}


5.PWM的DMA完成中断回调函数


 因为HAL库自身清楚DMA标志的时候并没有停止PWM所以需要手动停止


void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)

{

    HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_1);

}


关键字:STM32F103  HAL  PWM  DMA  WS2812 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/2019/ic-news040943746.html

上一篇:STM32之使用PWM控制多路舵机
下一篇:【STM32F103】按键检测(GPIO输入)

推荐阅读

STM32F103以SPI 驱动128*128的TFT彩屏
0.  关于本文:其实我一直都比较懒,不喜欢写博客。但网上关于详细讲解SPI驱动LCD的文章比较少,虽然也能下载到一些案例程序,但对于初学者来说,如果不懂LCD驱动的原理,不懂如何对文字和图片取模,即便拿到了别人的代码,也是一脸懵很难移植。所以写下本文,大家有不明白的,欢迎留言区一起交流,谢谢!1.  实验任务:本实验使用 STM32F103R6 芯片,通过软件SPI的方式,控制128*128分辨率的LCD,实现在液晶屏上显示汉字,英文,数字,图片等内容。2. 实验效果展示:   3.  硬件设计4. 硬件SPI和软件SPI的比较本实验用的是软件SPI的方式来控制LCD。好处是可以使
发表于 2022-01-25
<font color='red'>STM32F103</font>以SPI 驱动128*128的TFT彩屏
STM32F103单片机使用内部RC振荡器做时钟源
平时在做项目的时候都用的是外部晶振做为时钟源,想试试用内部RC振荡器做为时钟源,在网上搜了一下如何设置内部时钟,发现资料比较少的。决定将设置内部RC振荡器做为时钟源的方法记录下来。用的单片机是STM32F103C8T6,项目工程是在正点原子的示例代码上修改来的。用一个LED工程测试,在主程序中闪烁LED灯。#include "sys.h"#include "delay.h"#include "usart.h"#include "led.h"int main ( void ){    delay_init();   
发表于 2022-01-06
STM32F103单片机生成16路PWM波
单片机输出pwm波在项目中是恨常用的一个功能,今天就总结一下用STM32F103C8T6单片机输出16路 pwm波。使用keil5软件,用标准库函数来实现。首先看定时器初始化void TIM1_PWM_Init(u16 arr, u16 psc){    GPIO_InitTypeDef GPIO_InitStructure;    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;    TIM_OCInitTypeDef TIM_OCInitSturcture;     RCC_APB2Pe
发表于 2022-01-06
<font color='red'>STM32F103</font>单片机生成16路PWM波
STM32F103单片机输出相位可调PWM波
STM32定时器功能如下通常使用的是PWM模式,可以通过PWM功能可以生成频率和占空比可调的方波信号,有时候需要生成初始相位可调的方波,PWM功能就就不能满足要求了。可以通过输出比较模式来实现。输出比较模式是将计数器CNT的值和捕获比较寄存器CCR的对比,当CNT值等于CCR的值时,翻转输出电平。通过捕获比较寄存器CCMR模式设置位的描述可以看出,输出比较模式只有当 CCR = CNT时,输出电平才会翻转。而PWM模式下 CNT < CCR 时输出一个电平,CNT > CCR时输出相反的电平。通过一个示意图来看看PWM输出模式上图中是PWM输出的示意图,可以看出CNT的值从变化范围是 0---ARR,之间,CNT的值在C
发表于 2022-01-06
<font color='red'>STM32F103</font>单片机输出相位可调PWM波
STM32F103输出互补PWM波
STM32F103单片机定时器自带互补PWM波形输出功能,利用定时器输出比较模式,不仅可以输出互补的 PWM波,还可以设置输出方波的起始相位和死区时间。下面就总结一下如何实现PWM互补输出。void TIM1_PWM_DeadtimeInit( u16 arr, u16 psc, u16 ccr1, u16 ccr2, u16 deadtime ){    GPIO_InitTypeDef GPIO_InitSturcture;    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;    TIM_OCInitTypeDe
发表于 2022-01-06
<font color='red'>STM32F103</font>输出互补PWM波
STM32F103单片机JTAG端口重映射
STM32单片机复位后,JTAG口默认是被占用的。如果想将JTAG占用的几个IO口设置为普通IO口,就需要进行端口重映射。复位后端口默认功能可以在STM32参考手册上看到要将JTAG占用的这些口设置为普通IO口时,需要用复用功能重映射,在程序开始执行时将JTAG口重映射为普通IO口。将JTAG要设置为普通 IO口时,需要设置AFIO_MAPR寄存器的SWJ_CFG位。如果用寄存器操作的话,就直接设置这个寄存器的值就行。如果用库函数操作的话,可以直接调用库函数void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)。这个库函数的具体实现可以在stm3
发表于 2022-01-05
<font color='red'>STM32F103</font>单片机JTAG端口重映射
小广播
设计资源 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved