一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

基于STM32G070RB的七彩星空燈教程

airX嵌入式 ? 來(lái)源:airX嵌入式 ? 作者:airX嵌入式 ? 2022-11-17 11:07 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群


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

工作原理

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

2,空閑時(shí),IO為低電平。

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

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

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

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

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

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

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

《新建工程》

1、萬(wàn)事從新建工程開(kāi)始,打開(kāi)STM32CubeMX

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


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

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


3、配置時(shí)鐘樹(shù),如下圖所示。

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


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

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

5、下面我們開(kāi)始配置DMA,如下圖所示配置

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


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

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

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

《開(kāi)始寫(xiě)代碼》

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

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

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


2、接下來(lái)就是DMA傳輸完成回調(diào)函數(shù)(根據(jù)你使用的定時(shí)器配置),以下函數(shù)都復(fù)制到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ū)動(dòng)函數(shù)了,以下函數(shù)的作用是根據(jù)WS2812的數(shù)量將燈的GRB顏色數(shù)據(jù)寫(xiě)到需要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、將三個(gè)顏色的數(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、這是一個(gè)簡(jiǎn)單的顏色漸變算法 ,感興趣的可以研究研究

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、這里我簡(jiǎn)單的寫(xiě)了兩個(gè)演示程序

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é)束了,點(diǎn)亮之后相當(dāng)炫酷。,大家可以借鑒 ,修改出自己獨(dú)特的風(fēng)格。



審核編輯 :李倩


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

    關(guān)注

    2293

    文章

    11032

    瀏覽量

    365027
  • 開(kāi)發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    5682

    瀏覽量

    104815

原文標(biāo)題:基于STM32G070RB的七彩星空燈教程

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    STM32CubeMX配置STM32G070RBT6TR時(shí)為什么無(wú)法使能PVD中斷?

    STM32CubeMX 配置STM32G070RBT6TR時(shí)無(wú)法使能PVD中斷
    發(fā)表于 06-18 07:59

    STM32CubeMX配置STM32G070RBT6TR時(shí)無(wú)法使能PVD中斷怎么辦?

    STM32CubeMX 配置STM32G070RBT6TR時(shí)無(wú)法使能PVD中斷
    發(fā)表于 06-16 06:32

    stm32g070數(shù)據(jù)手冊(cè)和使用手冊(cè)

    電子發(fā)燒友網(wǎng)站提供《stm32g070數(shù)據(jù)手冊(cè)和使用手冊(cè).pdf》資料免費(fèi)下載
    發(fā)表于 06-13 16:21 ?3次下載

    萬(wàn)能七彩充開(kāi)關(guān)電源電器的制作

    手機(jī)萬(wàn)能七彩充電器的制作過(guò)程JC820型手機(jī)萬(wàn)能充電器套件制成后,適合充容量為250~3000mA鋰離子、鎳氫電池;充電時(shí),七彩燈閃爍,指示的顏色依次變化,發(fā)出絢麗多彩的七彩光芒,飽
    發(fā)表于 03-26 14:17

    燈光太普通?快來(lái)試試這款多模式的七彩燈方案!

    爆閃模式:紅、綠、藍(lán)、黃、青、粉、白種顏色交替爆閃;七彩跑馬流水燈:在偶數(shù)流水模式下,偶數(shù)LED依次點(diǎn)亮,奇數(shù)LED熄滅。流水達(dá)到設(shè)定數(shù)后,切換顏色繼續(xù)顯示
    的頭像 發(fā)表于 03-17 18:22 ?381次閱讀
    燈光太普通?快來(lái)試試這款多模式的<b class='flag-5'>七彩</b>燈方案!

    NRK3301離線語(yǔ)音識(shí)別模塊在七彩燈上的應(yīng)用方案

    傳統(tǒng)七彩燈依賴遙控器或APP的操作方式,總在關(guān)鍵時(shí)刻“掉鏈子”。如今,語(yǔ)音控制正成為智能照明的“新寵”——只需一句話,燈光顏色、亮度、模式隨心切換。而實(shí)現(xiàn)這種“聲控”的核心,正是藏在燈帶里
    的頭像 發(fā)表于 03-10 14:04 ?432次閱讀
    NRK3301離線語(yǔ)音識(shí)別模塊在<b class='flag-5'>七彩</b>燈上的應(yīng)用方案

    最新!智慧大應(yīng)用場(chǎng)景案例獨(dú)家匯總

    最新!智慧大應(yīng)用場(chǎng)景案例獨(dú)家匯總
    的頭像 發(fā)表于 03-07 10:10 ?461次閱讀

    STM32G070 UART串口,低波特率傳送數(shù)據(jù)時(shí),TIMER出現(xiàn)嚴(yán)重延時(shí)現(xiàn)象如何解決?

    STM32G070, UART串口,低波特率傳送數(shù)據(jù)時(shí),TIMER出現(xiàn)嚴(yán)重延時(shí)現(xiàn)象,傳送數(shù)據(jù)長(zhǎng)的話,導(dǎo)致系統(tǒng)重啟。如何解決?
    發(fā)表于 03-07 07:07

    燈光太刺眼?太單調(diào)?試試這樣調(diào)!

    七彩流光智能調(diào)光方案你是否也曾為燈光刺眼而煩惱?或是覺(jué)得家里的燈光一成不變,缺乏新意?七彩流光智能調(diào)光方案為你帶來(lái)全新解決方案!核心亮點(diǎn):無(wú)極調(diào)光:通過(guò)長(zhǎng)按(≥500ms)調(diào)節(jié)亮度,從柔和的5%到
    的頭像 發(fā)表于 03-04 18:24 ?237次閱讀
    燈光太刺眼?太單調(diào)?試試這樣調(diào)!

    【敏矽微ME32G070開(kāi)發(fā)板免費(fèi)體驗(yàn)】點(diǎn)亮WS2812B

    [10,0,255] 設(shè)置第2個(gè)珠的RGB顏色為[0,25,12] 則第0個(gè)珠的數(shù)據(jù)表示 (GRB): G[0001 1001]R[0000 1111]B[1000 0000] 則第1個(gè)
    發(fā)表于 01-07 23:58

    【敏矽微ME32G070開(kāi)發(fā)板免費(fèi)體驗(yàn)】使用coremark測(cè)試敏矽微ME32G070 跑分

    收到敏矽微ME32G070分開(kāi)發(fā)板有3天了,一直想知道這個(gè)MCU的性能怎樣?就像平時(shí)買(mǎi)新電腦后,就會(huì)用魯大師來(lái)測(cè)個(gè)分?jǐn)?shù),今天我就使用coremark來(lái)測(cè)試下敏矽微ME32G070這款MCU的分?jǐn)?shù)能力
    發(fā)表于 12-19 12:09

    【敏矽微ME32G070開(kāi)發(fā)板免費(fèi)體驗(yàn)】開(kāi)箱+點(diǎn)燈+點(diǎn)亮OLED

    【開(kāi)箱】 敏矽微 ME32G070 開(kāi)發(fā)板使用 ME32G070RBT6 芯片 基于 ARM Cortex M0 內(nèi)核,主頻 72M,F(xiàn)lash 128K,RAM 12K 片上資源已經(jīng)足夠滿足很多
    發(fā)表于 12-19 00:25

    【敏矽微ME32G070開(kāi)發(fā)板免費(fèi)體驗(yàn)】開(kāi)箱及環(huán)境搭建

    一、開(kāi)箱 上周收到敏矽微官方寄過(guò)來(lái)的ME32G070開(kāi)發(fā)板,使用普通的紙盒包裝,官方還送了三顆ME32G070RBT6 MCU,從外觀上看,主板上的MCU還留有焊接的痕跡,應(yīng)該是剛手動(dòng)焊接
    發(fā)表于 12-17 22:13

    【敏矽微ME32G070開(kāi)發(fā)板免費(fèi)體驗(yàn)】+ADC測(cè)試與LED點(diǎn)亮

    *附件:【敏矽微ME32G070開(kāi)發(fā)板免費(fèi)體驗(yàn)】+ADC測(cè)試與LED點(diǎn)亮.docx【敏矽微ME32G070開(kāi)發(fā)板免費(fèi)體驗(yàn)】+ADC測(cè)試與LED點(diǎn)亮 收到了敏矽微ME32G070開(kāi)發(fā)板,查看了一下板子
    發(fā)表于 12-16 19:00

    【敏矽微ME32G070開(kāi)發(fā)板免費(fèi)體驗(yàn)】\\+Lora通信終端產(chǎn)品開(kāi)發(fā)項(xiàng)目

    CH340N,USB 轉(zhuǎn) TTL 串行芯片。 芯片串口和 CH340N 連接需要學(xué)員自備短路帽實(shí)現(xiàn) UART1 接通 TYPEC。 (3)主控芯片 主控芯片為 ME32G070RB16。 (4)仿真
    發(fā)表于 12-15 18:26