0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于STM32G070RB的七彩星空燈教程

airX嵌入式 ? 來源:airX嵌入式 ? 作者:airX嵌入式 ? 2022-11-17 11:07 ? 次閱讀


今天我們用STM32G070RB NUCLEO開發(fā)板 和WS2812燈帶制作一個七彩星空燈。

工作原理

1,上電時,WS2812數(shù)據(jù)IO為低電平保持。

2,空閑時,IO為低電平。

3,數(shù)據(jù)發(fā)送完畢后,保持電平,超過規(guī)格書上定義的RESET時間(只有低電平時間超過280us,就可以認為是RESET.)

先看下數(shù)據(jù)的時序

9812e0f2-6622-11ed-8abf-dac502259ad0.png

如下是每24bit的組成。注意,順序不是RGB888,而是GRB888。一般我們?nèi)☆伾臄?shù)值,都是RGB順序,所以這里在代碼里實現(xiàn)的時候,會需要做一下移位。另外,需要注意的是,需要高位先發(fā)(MSB)。

982f4490-6622-11ed-8abf-dac502259ad0.png

時序波形圖。關(guān)鍵在于用什么方法去表示Bit的波形,網(wǎng)絡上的方法有很多。例如PWM,也有用SPI。今天我們就先用一種簡單方法實行吧,IO口模擬是不錯的選擇。

9846258e-6622-11ed-8abf-dac502259ad0.png

《新建工程》

1、萬事從新建工程開始,打開STM32CubeMX

986a0ca6-6622-11ed-8abf-dac502259ad0.png


2、在搜索框內(nèi)搜索 我們的開發(fā)板型號,也就是STM32G070RB,好的這樣工程就新建好的,

9896d09c-6622-11ed-8abf-dac502259ad0.png


3、配置時鐘樹,如下圖所示。

98c6ee9e-6622-11ed-8abf-dac502259ad0.png


4、接下來配置引腳 ,這里我們采用的是PWM+DMA的方式來驅(qū)動WS2812,通過WS2812的手冊可以得知驅(qū)動需要800KHZ的頻率好的我們現(xiàn)在來配置定時器,這里以定時器1為例來配置。如下圖所示。計算方法79=(64M/800K)-1得出。下面的Pulse是指一個周期的脈沖數(shù)

98ebcfde-6622-11ed-8abf-dac502259ad0.png

5、下面我們開始配置DMA,如下圖所示配置

99134fe6-6622-11ed-8abf-dac502259ad0.png


6、好的到這里就可以生成代碼

993a6374-6622-11ed-8abf-dac502259ad0.png

好的到這里我們就已經(jīng)把我們需要用到的資源初始化完成了

《開始寫代碼》

1、打開我們上次教程生成的代碼;我們打開工程,將一下代碼復制到下圖所在位置

#define ONE_PULSE        (59)                           //1 碼計數(shù)個數(shù)
#define ZERO_PULSE       (29)                           //0 碼計數(shù)個數(shù)
#define RESET_PULSE       (80)                          //80 復位電平個數(shù)(不能低于40)
#define LED_NUMS         (12)                            //led 個數(shù)
#define LED_DATA_LEN     (24)                           //led 長度,單個需要24個字節(jié)
#define WS2812_DATA_LEN  (LED_NUMS*LED_DATA_LEN)        //ws2812燈條需要的數(shù)組長度
uint16_t static RGB_buffur[RESET_PULSE + WS2812_DATA_LEN] = { 0 };

99660524-6622-11ed-8abf-dac502259ad0.png


2、接下來就是DMA傳輸完成回調(diào)函數(shù)(根據(jù)你使用的定時器配置),以下函數(shù)都復制到main.c 的/* USER CODE BEGIN 4 */代碼區(qū)

void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
   HAL_TIM_PWM_Stop_DMA(&htim1,TIM_CHANNEL_1);
}

3、下面就是今天的最后一步WS2812的驅(qū)動函數(shù)了,以下函數(shù)的作用是根據(jù)WS2812的數(shù)量將燈的GRB顏色數(shù)據(jù)寫到需要DMA傳送的數(shù)組中

void WS281x_SetPixelColor(uint16_t n, uint32_t GRBColor)
{
   uint8_t i;
   if (n < LED_NUMS)
   {
      for (i = 0; i < 24; ++i)
      RGB_buffur[24 * n + i] = (((GRBColor << i) & 0X800000) ? ONE_PULSE : ZERO_PULSE);
   }
}

4、將三個顏色的數(shù)據(jù)合并成GRB數(shù)據(jù)

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

5、這是一個簡單的顏色漸變算法 ,感興趣的可以研究研究

uint32_t Wheel(uint8_t WheelPos)
{
   WheelPos = 255 - WheelPos;
   if (WheelPos < 85)
   {
      return WS281x_Color(255 - WheelPos * 3, 0, WheelPos * 3);
   }
   if (WheelPos < 170)
   {
      WheelPos -= 85;
      return WS281x_Color(0, WheelPos * 3, 255 - WheelPos * 3);
   }
   WheelPos -= 170;
   return WS281x_Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

6、這里我簡單的寫了兩個演示程序

void Mode2_LED(uint8_t wait)
{
   uint32_t timestamp = HAL_GetTick();
   uint16_t i;
   static uint8_t j;
   static uint32_t next_time = 0;
   uint32_t flag = 0;
   if (next_time < wait)
   {
      if ((uint64_t)timestamp + wait - next_time > 0)
         flag = 1;
   }
   else if (timestamp > next_time)
   {
      flag = 1;
   }
   if (flag)
   {
      j++;
      next_time = timestamp + wait;
      for (i = 0; i < LED_NUMS; i++)
      {
         WS281x_SetPixelColor(i, Wheel((i + j) & 255));
      }
   }
   HAL_TIM_PWM_Start_DMA(&htim1,TIM_CHANNEL_1,(uint32_t *)RGB_buffur,RESET_PULSE + WS2812_DATA_LEN);
}
void Mode1_LED(uint8_t wait)
{
   uint32_t timestamp = HAL_GetTick();
   uint16_t i;
   static uint8_t j;
   static uint32_t next_time = 0;
   static uint8_t loop = 0;
   if (loop == 0)
      next_time = timestamp;
   loop = 1; //首次調(diào)用初始化
 
   if ((timestamp > next_time)) // && (timestamp - next_time < wait*5))
   {
      j++;
      next_time = timestamp + wait;
      for (i = 0; i < LED_NUMS; i++)
      {
         WS281x_SetPixelColor(i, Wheel(((i * 256 / (LED_NUMS)) + j) & 255));
      }
   }
   HAL_TIM_PWM_Start_DMA(&htim1,TIM_CHANNEL_1,(uint32_t *)RGB_buffur,RESET_PULSE + WS2812_DATA_LEN);
}

7、在主函數(shù)中直接調(diào)用Mode1_LED和Mode2_LED函數(shù)即可。

OK 到這里就結(jié)束了,點亮之后相當炫酷。,大家可以借鑒 ,修改出自己獨特的風格。



審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10915

    瀏覽量

    356754
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    5093

    瀏覽量

    97802

原文標題:基于STM32G070RB的七彩星空燈教程

文章出處:【微信號:airX嵌入式,微信公眾號:airX嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    七彩虹發(fā)布未來主義設計游戲本EVOL G系列新品

     五月十七日,七彩虹電子宣布推出全新一代的EVOL G系列游戲筆記本電腦,裝載了英特爾第13代酷睿處理核心及英偉達RTX 4060獨立顯卡。該系列分為白、灰兩色,鍵盤背光具備RGB效。
    的頭像 發(fā)表于 05-17 15:03 ?671次閱讀
    <b class='flag-5'>七彩</b>虹發(fā)布未來主義設計游戲本EVOL <b class='flag-5'>G</b>系列新品

    求助,關(guān)于STM32G070RB復位引腳定義問題求解

    大家好,我現(xiàn)在正在使用STM32G070RBT6。 使用CUBE MX 配置的時候發(fā)現(xiàn),這個芯片的復位引腳NRST可以配置為輸出,并且擁有自己的IO編號PG10 看了下datasheet,可以做
    發(fā)表于 04-10 06:32

    如何用Arduino開發(fā)STM32G070?

    如何用Arduino開發(fā)STM32G070,各位大神有相關(guān)教程嗎。我如何在Arduino的開發(fā)板管理器中添加STM32G070開發(fā)板,如何把程序下載到CPU中?
    發(fā)表于 04-07 08:22

    STM32G070RB部分代碼不運行是什么原因?qū)е碌模?/a>

    STM32G070RB 部分代碼不運行 主循環(huán)代碼運行一會就不運行了,但定時器、串口都正常在工作。 單片機沒有死機,就是主循環(huán)代碼里的代碼不運行了 請問誰知道這個是什么情況?
    發(fā)表于 04-02 06:55

    STM32G070RB使用jlink命令行下載無法識別芯片怎么解決?

    STM32G070RB 使用jlink命令行下載無法識別芯片,想手動添加芯片,請問哪里可以下載驅(qū)動.elf文件 或者有什么方法能夠?qū)崿F(xiàn)jlink命令行下載
    發(fā)表于 04-02 06:15

    stm32G070 GPIO的輸出能力很弱的原因?

    stm32G070 GPIO的輸出能力似乎很弱,GPIO配置如下 在配置GPIO輸出高電平的時候無法輸出,去掉R128就可以輸出高電平
    發(fā)表于 03-29 09:10

    stm32g0外部晶振不工作的原因?

    stm32g0外部晶振不工作 使用cubemx,如果配置成外部8M,pll設置為64M,示波器觀察有波形,程序卻無法運行,使用內(nèi)部晶振,配置為64M,無問題,不知道怎么解決了。 具體型號stm32g070rb
    發(fā)表于 03-29 07:27

    stm32g070怎么調(diào)試才能降低功耗?

    stm32g070,單芯片的最小系統(tǒng)板使用官方例程進入standy 模式后電量70ua左右,和手冊的1,2個ua不符,已經(jīng)確定是芯片的功耗的,不知道該怎么調(diào)試才能降低功耗
    發(fā)表于 03-28 06:46

    STM32G070 ADC如何禁用內(nèi)部基準?

    STM32G070 :使用ADC時,不想使用MCU自帶的VREF電壓源,但只要使能ADC的ADEN位(CR寄存器),內(nèi)部的電壓源自動被使能(ADVREGEN=1),似乎是同步的。ADEN位置1后,ADVREGEN位就不能修改了。手冊中說明,可以使用外部的基準 求幫助呀?。。。。。。。?!
    發(fā)表于 03-27 06:50

    STM32G070RB在FreeRTOS系統(tǒng)中,如何通過Tickless 來進入LPSleep模式或Stop模式?

    STM32G070RB在FreeRTOS系統(tǒng)中,如何通過Tickless 來進入LPSleep模式或Stop模式, 以達到降低睡眠功耗的目的?
    發(fā)表于 03-21 07:55

    STM32G070串口卡死怎么解決?

    mcu:STM32G070RB,驅(qū)動庫:hal版本1.6.1 目前會遇到串口2與外部芯片的通訊異常,異常表現(xiàn)為串口2不能收發(fā)數(shù)據(jù)了 串口2的配置方式是CubeMX配置的 接收數(shù)據(jù)方法
    發(fā)表于 03-21 07:46

    STM32G070_ADC如何設置參考電壓?

    STM32G070_ADC請教如何設置 參考電壓 Stm32CubeMx沒有設置參考電壓選項 HAL庫代碼里,也找了沒有對應的 比如設置參考電壓 為1.2V 或3V 請教如何設置?
    發(fā)表于 03-21 06:45

    如何設置STM32G070在工作電源降低到2.7V以下就復位停機?

    我有個應用設計,MCU用的是STM32G070rbt6芯片,外擴了一片鐵電存儲器FRAM。STM32G070在2.0V-3.3V工作電壓下都能正常工作,但鐵電存儲器FRAM的工作電壓
    發(fā)表于 03-13 08:04

    七彩化學多個項目順利投產(chǎn),新材料業(yè)務擴展迅猛

    資料顯示,七彩化學山東基地一期各項目已進入設備調(diào)試和部分投產(chǎn)階段,預計第二季度可全部完工。此外,公司二期項目還處于規(guī)劃階段,基于公司產(chǎn)品戰(zhàn)略。值得關(guān)注的是,雖然國內(nèi)有其他廠商擁有百噸或千噸級別的MXD6產(chǎn)能
    的頭像 發(fā)表于 03-06 15:11 ?1026次閱讀

    STM32G070RBT6引腳圖_中文資料

    STM32G070RBT6產(chǎn)品描述 STM32G070RBT6主流微控制器是基于高性能Arm?Cortex-M0 32位RISC核心,工作頻率高達64mhz。它適用于消費、工業(yè)和家電領(lǐng)域的高水平集成
    的頭像 發(fā)表于 01-18 11:56 ?1792次閱讀
    <b class='flag-5'>STM32G070</b>RBT6引腳圖_中文資料