繼上一篇 使用單晶片EFM8UB2控制WS2812-12 LED模組(C語言) 後,我覺得可以使用C語言完成那個控制,應該是因為EFM8UB2的系統頻率可以高達48MHz 才做到的,所以我想使用系統頻率較低的EFM8BB1(24.5MHz)搭配組合語言來做做看。
單晶片型號:EFM8BB10F8I-QSOP24
開發環境:Keil uVision V5.38.0.0
參考資料:單晶片組合語言
以下是程式碼


在C語言裡插入組合語言,必須在開頭加上 #pragma asm 的指令;而結束時必須鍵入 #pragma endasm 指令。
在編譯過程中出現如下錯誤:

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

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

執行的結果:
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,加上組合語言指令介紹,蠻好理解的。

文章標籤
全站熱搜
