三、实战小例程 基于STM32F103C8T6最小系统板和STM32CubeMX驱动WS2812B光立方
系列文章目錄
一、基于STM32F103C8T6最小系統板和STM32CubeMX實現LED燈循環閃爍
二、基于STM32F103C8T6和STM32CubeMX實現UART串口通信數據收發
三、實戰小例程 基于STM32F103C8T6最小系統板和STM32CubeMX驅動WS2812B光立方
四、基于STM32F103C8T6最小系統板HAL庫CubeMX驅動HC-SR501紅外人體傳感模塊
五、基于STM32F103C8T6(HAL庫)的HC-SR501紅外人體傳感及HC-SR04超聲波測距
文章目錄
- 系列文章目錄
- 前言
- 一、配置CubeMX
- 1.1 時鐘樹配置
- 1.2 配置DMA
- 二、代碼部分
- 三、現象
- 四、后記
前言
完整工程下載鏈接:
基于STM32F103C8T6最小系統板(HAL庫)和STM32CubeMX驅動WS2812B光立方.rar
RGB顏色值與十六進制顏色碼轉換工具鏈接:
https://www.sioe.cn/yingyong/yanse-rgb-16/
參考博文:
ws2812 程序設計與應用(1)DMA 控制 PWM 占空比原理及實現(STM32)
5X5X5光立方電路工程:
立創開源廣場5X5X5光立方
本文開發環境:
MCU型號:STM32F103C8T6最小系統板
IDE環境: MDK V5.36
代碼生成工具:STM32CubeMx 6.3.0
電路板實拍:
一、配置CubeMX
新建工程,選擇芯片,配置SYS,RCC略
1.1 時鐘樹配置
這里直接把時鐘開到最高72MHz
讀數據手冊,可以發現只有TIM1是掛載在APB2總線上的
1.2 配置DMA
周期計算:
WS2812B需要800kb的周期,系統時鐘是72MHz,TIM1是掛在APB2總線上的,它的時鐘也是72MHz,
因此,有:72 * 1000 / 800 = 90 (89+1),因此自動裝載值設為 89 ;
這樣cubeMX的配置就完畢了,打開生成的工程文件。
最終引腳配置圖:
可以發現,PWM輸出引腳為PA8。
二、代碼部分
在main.c里添加:
此函數實現了燈效的控制,可以通過用戶傳入的RGB參數,來自動填充數組:
int fputc(int ch,FILE *f) {ITM_SendChar(ch);return (ch); }#define ONE_PULSE (60) //1 碼計數個數 #define ZERO_PULSE (30) //0 碼計數個數 #define RESET_PULSE (48) //80 復位電平個數(不能低于40) #define LED_NUMS (25) //led 個數 #define LED_DATA_LEN (24) //led 長度,單個需要24個字節 #define WS2812_DATA_LEN (LED_NUMS*LED_DATA_LEN) //ws2812燈條需要的數組長度 #define DMA_LED_LEN (RESET_PULSE+WS2812_DATA_LEN) //傳輸數據長度uint16_t static RGB_buffur[RESET_PULSE + WS2812_DATA_LEN] = { 0 };void ws2812_set_RGB(uint8_t R, uint8_t G, uint8_t B, uint16_t num) {//指針偏移:需要跳過復位信號的N個0uint16_t* p = (RGB_buffur + RESET_PULSE) + (num * LED_DATA_LEN);for (uint16_t i = 0;i < 8;i++){//填充數組p[i] = (G << i) & (0x80)?ONE_PULSE:ZERO_PULSE;p[i + 8] = (R << i) & (0x80)?ONE_PULSE:ZERO_PULSE;p[i + 16] = (B << i) & (0x80)?ONE_PULSE:ZERO_PULSE;}}這里寫2個小函數,方便對連續的一組燈進行控制
void LED_ON_Purple(int Num_Start,int Num_End) {int Num_flag;for(Num_flag=Num_Start;Num_flag<=Num_End;Num_flag++) ws2812_set_RGB(0x94, 0x00, 0xD3, Num_flag); }void LED_OFF(int Num_Start,int Num_End) {int Num_flag;for(Num_flag=Num_Start;Num_flag<=Num_End;Num_flag++) ws2812_set_RGB(0x00, 0x00, 0x00, Num_flag); }此函數設置了燈的顏色情況,并通過延時來控制燈的閃爍:
void ws2812_example(void) { LED_ON_Purple(0,4);LED_OFF(5,24);HAL_TIM_PWM_Start_DMA(&htim1,TIM_CHANNEL_1,(uint32_t *)RGB_buffur,DMA_LED_LEN); //#2.傳輸數據HAL_Delay(500);//#3.延時:使效果可以被觀察LED_OFF(0,4);LED_OFF(10,24);LED_ON_Purple(5,9); HAL_TIM_PWM_Start_DMA(&htim1,TIM_CHANNEL_1,(uint32_t *)RGB_buffur,DMA_LED_LEN); HAL_Delay(500);LED_OFF(0,9);LED_ON_Purple(10,14);LED_OFF(15,24);HAL_TIM_PWM_Start_DMA(&htim1,TIM_CHANNEL_1,(uint32_t *)RGB_buffur,DMA_LED_LEN); HAL_Delay(500);LED_OFF(0,14);LED_ON_Purple(15,19);LED_OFF(20,24);HAL_TIM_PWM_Start_DMA(&htim1,TIM_CHANNEL_1,(uint32_t *)RGB_buffur,DMA_LED_LEN); HAL_Delay(500);LED_OFF(0,19);LED_ON_Purple(20,24);HAL_TIM_PWM_Start_DMA(&htim1,TIM_CHANNEL_1,(uint32_t *)RGB_buffur,DMA_LED_LEN); HAL_Delay(500); } while (1){ws2812_example();/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}三、現象
(角落里有個燈沒焊好,回頭改一下)
四、后記
我是在立創開源廣場看到的5X5X5光立方工程,然后就想復現一下,理論上有五層(光立方),目前只做了一層(光平方)做測試,后續我會把五塊都做出來然后連起來。
然后WS2812的具體原理和代碼邏輯,在前言里的那篇大佬寫的博文里寫的很清楚,在這里我也只是做一些小補充,然后移植到一個實例中來。
另外,單片機給的3.3V供電不能保證電路能正常工作,燈少好像還行,但多了的話經過實測,至少要到3.5V的供電電壓,這可能與具體元器件有關系,如果亮滅情況有問題的話,大家也可以從供電的角度查一查。
總結
以上是生活随笔為你收集整理的三、实战小例程 基于STM32F103C8T6最小系统板和STM32CubeMX驱动WS2812B光立方的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(2685):重读vue电商网站
- 下一篇: 工作100:v-model自定义是父亲组