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

2024-04-13 00:32

本文主要是介绍【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

这篇关于【TOLIN】第七章|移植WS2812FX库(下)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/898665

相关文章

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

RT-Thread(Nano版本)的快速移植(基于NUCLEO-F446RE)

目录 概述 1 RT-Thread 1.1 RT-Thread的版本  1.2 认识Nano版本 2 STM32F446U上移植RT-Thread  2.1 STM32Cube创建工程 2.2 移植RT-Thread 2.2.1 安装RT-Thread Packet  2.2.2 加载RT-Thread 2.2.3 匹配相关接口 2.2.3.1 初次编译代码  2.2.3.

Java基础入门 【第七章 抽象、接口、内部类、枚举】(二)

匿名内部类书写格式: 父类或接口类型变量名=new父类或接口(构造方法实参列表){ //重写所有的抽象方法 @Override public返回值类型method1(形参列表){ 方法体实现 } @Override public返回值类型method2(形参列表){ 方法体实现 } //省略... }; //匿名内部类对象调用方法 变量名.重写方法(实参列表); 匿名

libmad音频解码库-Linux交叉编译移植

下载并解压libmad-0.15.1b.tar.gz 下载链接:https://downloads.sourceforge.net/mad/libmad-0.15.1b.tar.gz $tar -xvf libmad-0.15.1b.tar.gz$cd libmad-0.15.1b 1、先执行下面的命令:这条命令是为了适配高版本的gcc,因为高版本的gcc已经将-fforce-mem去除了:

arm linux lua移植

lua: lua home 1.下载lua源码 lua下载 lua-5.3.4.tar.gz 2.解压: tar xvf lua-5.3.4.tar.gz 3.修改makefile and luaconf.h $修改 lua-5.3.4/Makefile #INSTALL_TOP= /usr/local INSTALL_TOP= $(shell pwd)/out #修改安装目录(当前目录/o

第七章 软件编码

第七章  软件编码 编码阶段的任务:将详细设计的阶段的过程描述转换成用程序设计语言来实现的源程序。 程序语言的特性: 1.心理特性 1)二义性 2)简洁性 3)局部性和顺序性 4)传统性 2.工程特性 1)源代码的可移植性 2)配套的开发工具 3)可维护性 4)可重用性 将设计变换为源程序的便利程度以及编译器的有效性

s3c2440---PWM使用之蜂鸣器驱动移植

一、蜂鸣器驱动介绍 1.1.什么是蜂鸣器               蜂鸣器是一种简单的声响发生器,常用于电子产品中作为警示或提醒作用。其基本原理是通过交替改变直流电的电压方向来产生声音,一般使用交替电流产生声音会比较稳定。 1.2.蜂鸣器的类别 1.有源蜂鸣器 1)结构原理 有源蜂鸣器内部自带振荡源,只需接通电源即可发声。内部电路会自动产生一定频率的振荡信号,从而驱动蜂鸣器发声。

25版王道数据结构课后习题详细分析 第七章 7.5 散列表

一、单项选择题 ———————————————————— ———————————————————— 解析:顺序查找可以是顺序存储或链式存储;折半查找只能是顺序存储且要求关键字有序;树形查找法要求采用树的存储结构,既可以采用顺序存储也可以采用链式存储;散列查找中的链地址法解决冲突时,采用的是顺序存储与链式存储相结合的方式。 正确答案: ————————————————————

《数据结构(C语言版)第二版》第七章-查找(算法设计题)

习题1 试写出折半查找的递归算法。 #include <stdio.h>#include <stdlib.h>#define Maxsize 100typedef int KeyType;typedef char InfoType;typedef struct{KeyType Key;InfoType OtherInfo;}elem;typedef struct{elem *R;in