【TOLIN】第七章|移植WS2812FX库(下)

【TOLIN】第七章|移植WS2812FX库(下)

作者:Tkwer

公众号:Tkwer望远镜

 

嫁接WS2812FX程序

    传送门上篇:【TOLIN】第六章|移植WS2812FX库(上)

 

    我把相关的文件移到放在WS2812FX这个文件夹下,在工程中添加文件和头文件路径即可。

 

    在stm32f4xx_it.c中:

 1void SysTick_Handler(void)
 2{
 3  /* USER CODE BEGIN SysTick_IRQn 0 */
 4
 5  /* USER CODE END SysTick_IRQn 0 */
 6  HAL_IncTick();
 7  HAL_SYSTICK_IRQHandler();
 8  /* USER CODE BEGIN SysTick_IRQn 1 */
 9
10  /* USER CODE END SysTick_IRQn 1 */
11}

 

    在主要中修改以下:

 1void SystemClock_Config(void)
 2{
 3  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
 4  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
 5
 6  /** Configure the main internal regulator output voltage 
 7  */
 8  __HAL_RCC_PWR_CLK_ENABLE();
 9  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);
10  /** Initializes the CPU, AHB and APB busses clocks 
11  */
12  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
13  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
14  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
15  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
16  RCC_OscInitStruct.PLL.PLLM = 4;
17  RCC_OscInitStruct.PLL.PLLN = 96;
18  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
19  RCC_OscInitStruct.PLL.PLLQ = 4;
20  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
21  {
22    Error_Handler();
23  }
24  /** Initializes the CPU, AHB and APB busses clocks 
25  */
26  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
27                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
28  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
29  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
30  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
31  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
32
33  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
34  {
35    Error_Handler();
36  }
37    /*若没生成以下代码,请手动添加*/
38        /**Configure the Systick interrupt time 
39    */
40  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
41
42    /**Configure the Systick 
43    */
44  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
45
46  /* SysTick_IRQn interrupt configuration */
47  HAL_NVIC_SetPriority(SysTick_IRQn, 00);
48}

    这个很重要!所植入的库的操作基于软件计时器,该计时器在SysTick中断时递减。如果重置了计时器,则WS2812BFX_Callback()函数将调用先前选择的效果模式。

1/* USER CODE BEGIN 4 */
2void HAL_SYSTICK_Callback(void)
3{
4    WS2812BFX_SysTickCallback();    // FX effects software timers
5}
6/* USER CODE END 4 */

 

开始使用WS2812FX!

    如果一切顺利,恭喜你,可以开始愉悦使用WS2812FX。接下来我们要介绍的是初始化函数,配置函数!

 1int main(void)
 2{
 3  /* USER CODE BEGIN 1 */
 4  /* USER CODE END 1 */
 5
 6
 7  /* MCU Configuration--------------------------------------------------------*/
 8
 9  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
10  HAL_Init();
11
12  /* USER CODE BEGIN Init */
13  /* USER CODE END Init */
14
15  /* Configure the system clock */
16  SystemClock_Config();
17
18  /* USER CODE BEGIN SysInit */
19    delay_init(72);
20    uart_init(115200);
21//    MPU6050_Init();
22//    OLED_Init();
23  /* USER CODE END SysInit */
24
25  /* Initialize all configured peripherals */
26  MX_GPIO_Init();
27  MX_DMA_Init();
28  MX_USB_DEVICE_Init();
29  MX_TIM4_Init();
30  MX_SPI1_Init();
31  /* USER CODE BEGIN 2 */
32  WS2812B_Init(&hspi1);
33  WS2812BFX_Init(1);  // Start 1 segments
34  WS2812BFX_SetSpeed(0120); // Speed of segment 0
35  WS2812BFX_SetColorRGB(053,0,0);   // Set color 0
36
37  WS2812BFX_SetMode(0, FX_MODE_WHITE_TO_COLOR);    // Set mode segment 0
38  WS2812BFX_Start(0); // Start segment 0
39
40
41  HAL_Delay(200);
42  while (1)
43  {
44    /* USER CODE END WHILE */
45
46    /* USER CODE BEGIN 3 */
47        WS2812BFX_Callback();
48
49  }
50  /* USER CODE END 3 */
51}

 

    SPI初始化函数

WS2812B_Init(&hspi1);

 

    Segments分段参数的意思是分段成多少段的意思,有时你控制的是一条灯带,你可以将其分段成几段,不同段配置不同的颜色和运行不同的模式。

FX_STATUS WS2812BFX_Init(uint8_t Segments);

 

    该函数是设置第几段的更新的速度,注意speed的单位是毫秒。

FX_STATUS WS2812BFX_SetSpeed(uint16_t Segment, uint16_t Speed)

 

    每种模式至少需要一种颜色才能发挥作用。一种模式所需的最大颜色数为3。每种模式都有其自己的ID,可通过该ID进行引用。可以通过多种方式设置颜色。有些模式只用到一种颜色,设置其他的无效,或者需要三种颜色,只设置一种,其他会以黑色填充。

void WS2812BFX_SetColorStruct(uint8_t id, ws2812b_color c);
void WS2812BFX_SetColorRGB(uint8_t id, uint8_t r, uint8_t g, uint8_t b);
void WS2812BFX_SetColorHSV(uint8_t id, uint16_t h, uint8_t s, uint8_t v);
void WS2812BFX_SetColor(uint8_t id, uint32_t c);

注意-这些函数将颜色分配给临时变量。为了将它们指定特定段,必须在启动给定段上的替换操作模式的函数,然后调用它们,即在设置模式

    改变各个段的模式似乎是WS2812B LED灯条整个操作中最重要的功能。

FX_STATUS WS2812BFX_SetMode(uint8_t Segment, fx_mode Mode);
FX_STATUS WS2812BFX_NextMode(uint8_t Segment);
FX_STATUS WS2812BFX_PrevMode(uint8_t Segment);
FX_STATUS WS2812BFX_SetReverse(uint8_t Segment, uint8_t Reverse);

像往常一样,名字不言自明。我们可以为扩展的细分选择特定的模式,也可以选择下一个和上一个模式。该功能可以互换可用模式列表。(一共58种)最后两个功能适用于于为某些模式在一个方向或另一个方向上设置动画的方向。

模式列表:

 1typedef enum {
 2  FX_MODE_STATIC,
 3  FX_MODE_WHITE_TO_COLOR,
 4  FX_MODE_BLACK_TO_COLOR,
 5  FX_MODE_BLINK,
 6  FX_MODE_BLINK_RAINBOW,
 7  FX_MODE_STROBE,
 8  FX_MODE_STROBE_RAINBOW,
 9  FX_MODE_BREATH,
10  FX_MODE_COLOR_WIPE,
11  FX_MODE_COLOR_WIPE_INV,
12  FX_MODE_COLOR_WIPE_REV,
13  FX_MODE_COLOR_WIPE_REV_INV,
14  FX_MODE_COLOR_WIPE_RANDOM,
15  FX_MODE_COLOR_SWEEP_RANDOM,
16  FX_MODE_RANDOM_COLOR,
17  FX_MODE_SINGLE_DYNAMIC,
18  FX_MODE_MULTI_DYNAMIC,
19  FX_MODE_RAINBOW,
20  FX_MODE_RAINBOW_CYCLE,
21  FX_MODE_FADE,
22  FX_MODE_SCAN,
23  FX_MODE_DUAL_SCAN,
24  FX_MODE_THEATER_CHASE,
25  FX_MODE_THEATER_CHASE_RAINBOW,
26  FX_MODE_RUNNING_LIGHTS,
27  FX_MODE_TWINKLE,
28  FX_MODE_TWINKLE_RANDOM,
29  FX_MODE_TWINKLE_FADE,
30  FX_MODE_TWINKLE_FADE_RANDOM,
31  FX_MODE_SPARKLE,
32  FX_MODE_FLASH_SPARKLE,
33  FX_MODE_HYPER_SPARKLE,
34  FX_MODE_MULTI_STROBE,
35  FX_MODE_CHASE_WHITE,
36  FX_MODE_CHASE_COLOR,
37  FX_MODE_CHASE_RANDOM,
38  FX_MODE_CHASE_RAINBOW,
39  FX_MODE_CHASE_FLASH,
40  FX_MODE_CHASE_FLASH_RANDOM,
41  FX_MODE_CHASE_RAINBOW_WHITE,
42  FX_MODE_CHASE_BLACKOUT,
43  FX_MODE_CHASE_BLACKOUT_RAINBOW,
44  FX_MODE_RUNNING_COLOR,
45  FX_MODE_RUNNING_RED_BLUE,
46  FX_MODE_RUNNING_RANDOM,
47  FX_MODE_LARSON_SCANNER,
48  FX_MODE_COMET,
49  FX_MODE_FIREWORKS,
50  FX_MODE_FIREWORKS_RANDOM,
51  FX_MODE_MERRY_CHRISTMAS,
52  FX_MODE_FIRE_FLICKER,
53  FX_MODE_FIRE_FLICKER_SOFT,
54  FX_MODE_FIRE_FLICKER_INTENSE,
55  FX_MODE_CIRCUS_COMBUSTUS,
56  FX_MODE_HALLOWEEN,
57  FX_MODE_BICOLOR_CHASE,
58  FX_MODE_TRICOLOR_CHASE,
59  FX_MODE_ICU
60} fx_mode;

 

    除了更改模式之外,该库还允许您控制给定段的操作。

FX_STATUS WS2812BFX_Start(uint8_t Segment);
FX_STATUS WS2812BFX_Stop(uint8_t Segment);

这些功能可在初始的片段上启动或停止动画。在开始时,将重置模式计时器并分配临时的临时颜色设置中的颜色-该段重置头开始运行,并且从停止那一刻起就不会继续。

    根据实际灯的数量,在ws2812_spi.h中修改宏大小。

#define WS2812B_LEDS 12

 

演示效果

 

 

参考链接:https : //github.com/lamik/WS2812B_STM32_HAL

https://msalamon.pl/adresowalne-diody-ws2812b-na-stm32-cz-2/

结束

 

公众号ID:Tkwer望远镜

 

扫码关注最新动态

提供TOLIN核心板软件工程,公众号内回复即可获取:TOLIN_Template4

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值