如题:用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
引用地址:
STM32F103+HAL+PWM+DMA+WS2812
推荐阅读最新更新时间:2024-03-16 16:27
STM8输出PWM变频时波形断开解决方法
在使用STM8单片机的PWM功能时,一直没出现过问题。但是在一个项目中需要在PWM波输出的过程中变频,这时候问题来了。在PWM输出过程中,输出的波形是不是的就会有一大段空白的地方,好像波形输出被关闭了一样。 输出波形如下图所示: 放大后查看 可以看到波形输出的过程中突然就消失了,而且还不是偶尔的出现一次。是频繁的出现。这就奇怪了?难道是单片机坏了?换了几个单片机测试都是这样的,那么肯定就是软件代码出问题了。那么到底是什么地方有问题了,于是开启找BUG模式,一行一行代码分析。 代码分析了半天也没找不到哪行代码有问题,输出单一频率的PWM波一直很稳定,只是改变频率的时候就会出现波形断开情况,频率改变的越多,
[单片机]
STC15单片机6路专用PWM
(1)STC例程分析 /* STC15Fxx 系列 输出任意周期和任意占空比的PWM实例*/ #define CYCLE 0x1000L //定义PWM周期(最大值为32767) #define DUTY 10L //定义占空比为10% void pwm() { P0M0 = 0x00; //因PWM模块相关IO口初始状态为高阻,需要将IO口设置为准双向或推挽输出才能正常输出波形; P0M1 = 0x00; P1M0 = 0x00; P1M1 = 0x00; P2M0 = 0x00; P2M1 = 0x00; P3M0 = 0x00; P3M1 = 0x00; P4
[单片机]
stm32f103c8t6最小系统AD工程,封装
7*7厘米大小,稳压用的LM1117s,已经打印焊接过了,可以用。两边的是焊盘不能焊排针。因为是新手画的板子比较大。反正能用,LED灯的焊盘稍微有点问题,焊盘距离有点大,但也能焊上。其他封装都没什么问题。当初画的时候找封装找了好久,在这里发一下,看到的直接用就好了。
[单片机]
基于DPPC2006的数字音频功率放大器
摘要: 采用直接数字放大技术,设计了基于DPPC2006的数字音频功率放大器,该系统采用高速VMOSFET构成H桥互补对称结构,控制功能由AT89S51实现.测试结果表明:该系统最大不失真输出率大于6W,平均效率可达73.24%,性价比较高。 关键词 :数字功放;DPPC2006;PWM;AT89S51 引言 随着电子产品的数字化进程不断演进,音响设备(尤其是其中的关键产品功率放大器)的数字化也提上了日程。目前市场上很多功放产品都打出了“数字”的旗号,但其中有很多只是对产品进行了一些数字化处理,严格意义上只能称作数字化功放,真正的音频信号还是模拟的.数字功放是指在信号的处理过程中采用的是数字音频信号,用
[模拟电子]
STM32CubeMX开发stm32f103rbt6 JLINK(一)
1、新建工程 2、选择芯片 3、管脚配置 4、时钟配置 5、工程生成配置 6、生成工程 7、打开软件工程 8、Keil 下载设置 9、下载 注意:安装好Jlink驱动 常见问题: 1、如图 解决:硬件问题,检查接线,电源以及BOOT0,BOOT1 2、JLINK不识别CPU 原因1、检查是否禁用了SWD:stm32f1xx_hal_msp.c---- void HAL_MspInit(void) __HAL_AFIO_REMAP_SWJ_DISABLE(); 短接复位电容(C7),在断开
[单片机]
MSP实时输出占空比可调的pwm波形
// 占空比可调的PWM, 我没试过, 手里没单片机, 只是记下. #include msp430x14x.h void main(void) { volatile unsigned int i; WDTCTL = WDTPW + WDTHOLD; // Stop WDT BCSCTL1 |= XTS; // ACLK= LFXT1 = HF XTAL do { IFG1 &= ~OFIFG; // Clear OSCFault flag for (i = 0xFF; i 0; i--) { // Time fo
[单片机]
stm32之DMA彻底研究(2)
AD转换之DMA 1、DMA的配置 //DMA的配置 void DMA_Configuration(void) { /* 允许 DMA1 */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /* DMA通道1*/ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr =(u32)( &(ADC1- DR)); //ADC1数据寄存器 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADCCov; //获取ADC的数组 DMA_InitStructure.
[单片机]
LED驱动电路脉冲调制PWM电路设计
本文主要从电子电路、热分析、光学 方面阐述了如何运用LED 特性进行设计。LED照明 作为新一代照明受到了广泛的关注。仅仅依靠LED封装 并不能制作出好的照明灯具。 这次主要针对运用脉冲调制的驱动电路进行说明。 PWM是什么? 脉冲调制英文表示是Pulse Width Modulation,简称PWM。PWM是调节脉冲波占空比的一种方式。如图1所示,脉冲的占空比可以用脉冲周期、On-time、Off-time表示,如下公式: 占空比=On-time(脉冲的High时间)/ 脉冲的一个周期(On-time + Off-time) Tsw(一周期)可以是开关 周期,也可以是Fsw=1/Tsw的开关频率。
[电源管理]