【TOLIN】第七章|移植WS2812FX库(下)
↑ 点击上方,关注“Tkwer望远镜”作者:Tkwer
公众号:Tkwer望远镜
移植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}
在main中修改以下:
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, 0, 0);
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(0, 120); // Speed of segment 0
35 WS2812BFX_SetColorRGB(0, 53,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);
调用上述每个函数的效果是相同的。 注意 - 这些函数将颜色分配给临时变量。为了将它们应用于特定段,必须在启动给定段上的选定操作模式的函数之前调用它们,即在setmode
改变单个段的模式似乎是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/
END
公众号ID:Tkwer望远镜
扫码关注最新动态
提供TOLIN核心板软件工程,公众号内回复即可获取:TOLIN_Template4