[单片机芯片] 如何配置CH32V103的TIM PWM DMA 模式驱动WS2812B

[复制链接]
 楼主| lilijin1995 发表于 2022-3-22 14:25 | 显示全部楼层 |阅读模式
以下代码是我们在STM32F103下驱动的代码,定时器是72M,分频系数为0,周期系数为89;代码如下
  1. /**
  2.   ******************************************************************************
  3.   * [url=home.php?mod=space&uid=288409]@file[/url]           : ws281x.c
  4.   * [url=home.php?mod=space&uid=247401]@brief[/url]          : ws281x LED Driver
  5.   ******************************************************************************
  6.   * @attention
  7.   *
  8.   * <h2><center>© Copyright (c) 2020 SYEtronix Inc.
  9.   * 未经作者许可,不得用于其它任何用途
  10.   * 创建日期:2020/2/18
  11.   * 版本:V1.0
  12.   * 版权所有,盗版必究。
  13.   * Copyright(C) 广州市胜意游乐设备有限公司 SYEtronix Inc.
  14.   * All rights reserved               
  15.   *
  16.   ******************************************************************************
  17.   */

  18. #include "ws281x.h"
  19. #include "IR_Switch.h"
  20. #include <string.h>
  21. #include "tim.h"
  22. #include "delay.h"

  23. extern TIM_HandleTypeDef htim3;








  24. uint16_t send_Buf[NUM];

  25. #define PROCESS_DELAY 5
  26. #define SECTION_DELAY 100

  27. void WS_Load(void) { HAL_TIM_PWM_Start_DMA(&htim3, TIM_CHANNEL_1, (uint32_t*)send_Buf, NUM); }
  28. void WS_CloseAll(void)
  29. {
  30.         uint16_t i;
  31.         for (i = 0; i < PIXEL_NUM * 24; i++)
  32.                 send_Buf[i] = WS0;    // 写入逻辑0的占空比
  33.         for (i = PIXEL_NUM * 24; i < NUM; i++)
  34.                 send_Buf[i] = 0;    // 占空比比为0,全为低电平
  35.         WS_Load();
  36. }

  37. void WS_WriteAll_RGB(uint8_t n_R, uint8_t n_G, uint8_t n_B)
  38. {
  39.         uint16_t i, j;
  40.         uint8_t dat[24];
  41.         // 将RGB数据进行转换
  42.         for (i = 0; i < 8; i++)
  43.         {
  44.                 dat[i] = ((n_G & 0x80) ? WS1 : WS0);
  45.                 n_G <<= 1;
  46.         }
  47.         for (i = 0; i < 8; i++)
  48.         {
  49.                 dat[i + 8] = ((n_R & 0x80) ? WS1 : WS0);
  50.                 n_R <<= 1;
  51.         }
  52.         for (i = 0; i < 8; i++)
  53.         {
  54.                 dat[i + 16] = ((n_B & 0x80) ? WS1 : WS0);
  55.                 n_B <<= 1;
  56.         }
  57.         for (i = 0; i < PIXEL_NUM; i++)
  58.         {
  59.                 for (j = 0; j < 24; j++)
  60.                 {
  61.                         send_Buf[i * 24 + j] = dat[j];
  62.                 }
  63.         }
  64.         for (i = PIXEL_NUM * 24; i < NUM; i++)
  65.                 send_Buf[i] = 0;    // 占空比比为0,全为低电平
  66.         WS_Load();
  67. }

  68. uint32_t WS281x_Color(uint8_t red, uint8_t green, uint8_t blue) { return green << 16 | red << 8 | blue; }

  69. void WS281x_SetPixelColor(uint16_t n, uint32_t GRBColor)
  70. {
  71.         uint8_t i;
  72.         if (n < PIXEL_NUM)
  73.         {
  74.                 for (i = 0; i < 24; ++i)
  75.                         send_Buf[24 * n + i] = (((GRBColor << i) & 0X800000) ? WS1 : WS0);
  76.         }
  77. }

  78. void WS281x_SetPixelRGB(uint16_t n, uint8_t red, uint8_t green, uint8_t blue)
  79. {
  80.         uint8_t i;

  81.         if (n < PIXEL_NUM)
  82.         {
  83.                 for (i = 0; i < 24; ++i)
  84.                         send_Buf[24 * n + i] = (((WS281x_Color(red, green, blue) << i) & 0X800000) ? WS1 : WS0);
  85.         }
  86. }

  87. uint32_t Wheel(uint8_t WheelPos)
  88. {
  89.         WheelPos = 255 - WheelPos;
  90.         if (WheelPos < 85)
  91.         {
  92.                 return WS281x_Color(255 - WheelPos * 3, 0, WheelPos * 3);
  93.         }
  94.         if (WheelPos < 170)
  95.         {
  96.                 WheelPos -= 85;
  97.                 return WS281x_Color(0, WheelPos * 3, 255 - WheelPos * 3);
  98.         }
  99.         WheelPos -= 170;
  100.         return WS281x_Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  101. }

  102. void rainbow(uint8_t wait)
  103. {
  104.         uint32_t timestamp = HAL_GetTick();
  105.         uint16_t i;
  106.         static uint8_t j;
  107.         static uint32_t next_time = 0;

  108.         uint32_t flag = 0;
  109.         if (next_time < wait)
  110.         {
  111.                 if ((uint64_t)timestamp + wait - next_time > 0)
  112.                         flag = 1;
  113.         }
  114.         else if (timestamp > next_time)
  115.         {
  116.                 flag = 1;
  117.         }
  118.         if (flag)    // && (timestamp - next_time < wait*5))
  119.         {
  120.                 j++;
  121.                 next_time = timestamp + wait;
  122.                 for (i = 0; i < PIXEL_NUM; i++)
  123.                 {
  124.                         WS281x_SetPixelColor(i, Wheel((i + j) & 255));
  125.                 }
  126.         }
  127.         WS_Load();
  128. }

  129. void rainbowCycle(uint8_t wait)
  130. {
  131.         uint32_t timestamp = HAL_GetTick();
  132.         uint16_t i;
  133.         static uint8_t j;
  134.         static uint32_t next_time = 0;

  135.         static uint8_t loop = 0;
  136.         if (loop == 0)
  137.                 next_time = timestamp;
  138.         loop = 1;    //首次调用初始化

  139.         if ((timestamp > next_time))    // && (timestamp - next_time < wait*5))
  140.         {
  141.                 j++;
  142.                 next_time = timestamp + wait;
  143.                 for (i = 0; i < PIXEL_NUM; i++)
  144.                 {
  145.                         WS281x_SetPixelColor(i, Wheel(((i * 256 / (PIXEL_NUM)) + j) & 255));
  146.                 }
  147.         }
  148.        
  149.         WS_Load();
  150. }












  1. #ifndef _WS281X_H
  2. #define _WS281X_H

  3. #include "sys.h"







  4. #define PIXEL_NUM                18
  5. #define NUM                                (24*PIXEL_NUM + 300)        // Reset 280us / 1.25us = 224
  6. #define WS1                                61
  7. #define WS0                                28

  8. extern uint16_t send_Buf[NUM];

  9. void WS_Load(void);
  10. void WS_WriteAll_RGB(uint8_t n_R, uint8_t n_G, uint8_t n_B);
  11. void WS_CloseAll(void);

  12. uint32_t WS281x_Color(uint8_t red, uint8_t green, uint8_t blue);
  13. void WS281x_SetPixelColor(uint16_t n, uint32_t GRBColor);
  14. void WS281x_SetPixelRGB(uint16_t n ,uint8_t red, uint8_t green, uint8_t blue);

  15. uint32_t Wheel(uint8_t WheelPos);
  16. void rainbow(uint8_t wait);
  17. void rainbowCycle(uint8_t wait);



  18. #endif



想请教大佬如何移植到ch32v103

59、TIM-DMA.rar

476.54 KB, 下载次数: 9

WCHTech2 发表于 2022-3-22 15:07 | 显示全部楼层
您好,下面链接为F103到V103的移植说明,可参考一下:
https://bbs.21ic.com/icview-3129028-1-1.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则

56

主题

165

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部