STM32F103+HAL+PWM+DMA+WS2812

本文介绍如何使用STM32F103R8的TIM3通道1配合DMA模式来控制WS2812 LED灯带。通过配置1.25us周期的定时器,并设置DMA传输方向为MemoryToPeripheral及传输位宽为HalfWord,实现了RGB颜色数据的有效传输。此外,文章提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如题:用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);
}

程序地址:https://download.youkuaiyun.com/download/ben392797097/11630365

程序是用的Tm7812b,和ws2812类似。

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值