STM32傳送單極性歸零碼驅動WS2812(二)

2021-10-18 18:17:38 字數 2549 閱讀 5867

(形容我的心情)

時間匆匆過去,也到了該著手準備畢業設計的階段了。我早早就向老師確定了選題,我想做乙個智慧型燈光控制系統。

在燈光選型的問題上,我又想到了幾個月前令我頭疼好長時間的ws2812,但這次我可是有備而來,在主控晶元的選型上,我決定採用自己熟悉的stm32系列晶元,當時我想著之前4m的主頻都可以跑得動,這次使用32晶元,最高72m的主頻難道還會跑不起來嗎?

但是我想著這次肯定不能再採用nop延時的方式了,因為當時在另外一家公司進行實習,畢業設計也就一直停留在設想階段,只是查閱了一定的資料,確定了整個系統的可行性。

1. 準備

真正開始進行畢業設計放在了大四的寒假中,之前採購好了相關的模組和開發板,想著帶回家做。但是我還是不確定ws2812這近乎**的歸零碼驅動方式,所以在放假前幾天專門去找了老師問了一下相應的解決方案,老師說採用定時器的方式傳送,我當時總是認為呼叫函式難以達到相應的時序需求。可能也是我表達的方式有些欠缺,導致我和老師的理解有一些不符。

?唉~~~~ 當時我的關注點一直在呼叫函式帶來的時序問題上,所以有些不同意老師的觀點。

但我還是決定回家試一試再說。

2. 豁然開朗

回到家我便參照老師說的很快就把定時器配置相關的**完成了,因為家裡不像學校,沒有示波器等實驗儀器,接上燈帶後,果不其然沒有任何現象。用keil自帶的波形**看了一下,每一位碼的傳送週期都達到了6us級別以上,這肯定不行,我又選擇了翻轉io+nop的方式(還是走了老路),但是這就不符合我當初的初衷了啊!!!

作為乙個有原則的開發者,我肯定不能就這樣敷衍了事,我又查詢了大量的資料,搜尋了很多關於歸零碼產生的許多大佬的文章和心得。偶然間一位大佬的一篇文章出現在了我的眼前:

stm32f407通過spi+dma的方式驅動ws2812

據大佬的說法,只要呼叫庫函式,執行過程所消耗的指令週期必然會超過歸零碼所要求的時序規則。故不能單純的採用翻轉io的方式,而大佬採用了spi通訊方式來模擬歸零碼的產生。

我在讀到這篇文章之後眼前一亮,不禁讚嘆大佬的腦洞,用通訊匯流排的方式模擬資料波形這種方式確實是可行的,於是我飯也顧不上吃,馬上就把相關的外設spi和dma的初始化搞定了。到了晚上,終於要進入試驗階段了。

我懷著激動的心情連線好相關的裝置,寫入**:

0%--------->100%

什麼鬼?還是沒有產生期望的效果。

我又陷入了泥潭中,回頭去檢查硬體配置**,沒有發現什麼問題,可能是我配置的地方還有一些問題。

於是我又參照了另一位大佬的文章以及它提供的原始碼:

ws2812驅動程式(spi+dma)

3. 查詢問題

本著對問題一**竟的原則,我仔細比較了大佬提供的工程檔案和我自己的工程檔案,我採用的是正點原子提供的工程模板,於是我開始懷疑是不是兩者的啟動檔案有什麼差異。

於是我發現了以下幾點玄機:

這是大佬的模板

startup_stm32f10x_md.s

import  __main

import systeminit ; 注釋掉了systeminit相關

ldr r0, =systeminit ; 注釋掉了systeminit相關

blx r0 ; 注釋掉了systeminit相關

ldr r0, =__main

bx r0

endp

而我的工程模板中卻注釋掉了systeminit的入口位置

進到systeminit函式定義中

void systeminit (

void

)

emmmmm~~~好像並沒有發現什麼不對勁的地方

於是跳到setsysclock函式中去

static

void

setsysclock

(void

) 漸變間隔時間

* @return

*/void

ws2812_all_led_one_color_breath

(uint16_t interval_time, uint32_t grb_color)

ws2812_send_data()

;delay_ms

(interval_time);}

for(i=

100;i>=

1;i--

)ws2812_send_data()

;delay_ms

(interval_time);}

}

whatever is worth doing is worth doing well.

STM32的PWM極性和模式

其實,想通了也很簡單。在說pwm模式之前,我們要知道計數器cnt。比如在向上計數模式時cnt從0計數到設定的週期值。還有乙個用來確定高低電平分割線的ccrx的暫存器。這樣一來就可以知道pwm的週期有定時的週期值確定,高低占空比有crrx值來確定。pwm一共有兩種模式 pwm1模式 cntcrrx為無...

STM32高速脈衝發波方案

對於步進電機,脈衝頻率一般在幾千hz到幾十千hz左右,但是對於伺服電機,由於其轉速高,解析度高,其要求的脈衝頻率可以高達幾百千hz甚至高到幾兆hz。此外對於多軸運動控制器,還需要同時發出多路高頻率的脈衝波形。如何讓微控制器發出高頻率的高速脈衝,有以下幾種方法 1 使用定時器溢位中斷,定時中斷裡翻轉i...

WIN32傳送自定義訊息

在win32訊息機制中,系統會傳送各種訊息到訊息佇列,開發可以呼叫getmessage得到相關訊息。win32的api也提供了對應開發自行的傳送訊息到訊息佇列的功能.sendmessagea直接傳送訊息到對應的視窗處理函式中,直到處理後函式才返回。postmessagea將資訊放入訊息佇列中,立即返...