繼上一篇 使用單晶片EFM8UB2控制WS2812-12 LED模組(C語言) 後,我覺得可以使用C語言完成那個控制,應該是因為EFM8UB2的系統頻率可以高達48MHz 才做到的,所以我想使用系統頻率較低的EFM8BB1(24.5MHz)搭配組合語言來做做看。

單晶片型號:EFM8BB10F8I-QSOP24

開發環境:Keil uVision V5.38.0.0

參考資料:單晶片組合語言

以下是程式碼

程式碼1

程式碼2

在C語言裡插入組合語言,必須在開頭加上 #pragma asm 的指令;而結束時必須鍵入 #pragma endasm 指令。

在編譯過程中出現如下錯誤:

使用單晶片EFM8BB1控制WS2812LED模組(組合語言

上網找的解決方法:在組合語言位於的檔案按滑鼠右鍵,點"Options for File 'xxx'...

使用單晶片EFM8BB1控制WS2812LED模組(組合語言

將下圖中的兩個選項致能(變成黑色勾勾)

使用單晶片EFM8BB1控制WS2812LED模組(組合語言

執行的結果:

T0H = 410nS        T0L = 820nS

T1H = 820nS        T1L = 450nS

而在每8bit傳完之後與下一個8bit之間,T0L(e)會變為 940nS;T1L(e)則為 570nS (還在WS2812B可接受的誤差範圍內)

上面的程式碼中,這三個 //NOP; 如果使用則T0L = 940nS;T1L = 570nS,與每8bit間較慢的時間相同。

這邊提供一個學習組語的好方法,因為上面這樣操作,Keil會生成一個 .src的檔案,裡面就是將你寫的C語言轉成的組語內容,可以對照C與轉成的ASM,加上組合語言指令介紹,蠻好理解的。

使用單晶片EFM8BB1控制WS2812LED模組(組合語言

文章標籤
全站熱搜
創作者介紹
創作者 肯特王 的頭像
肯特王

肯特王的簿