EZH介紹完了之后娩践,咱們介紹如何使用LPC55S69片上雙核機(jī)制實(shí)現(xiàn)驅(qū)動(dòng)WS2812燈帶活翩。
可能有大神說(shuō)了,你完全可以用GPIO模擬WS2812的時(shí)序啊欺矫,何必用SPI和EZH來(lái)做纱新。真么說(shuō)對(duì)的,攻城獅認(rèn)為這么寫(xiě)一篇單獨(dú)的GPIO模擬WS2812的時(shí)序 不太劃算太水了穆趴, 所以結(jié)合雙核的應(yīng)用來(lái)這么一篇。一來(lái)介紹了GPIO模擬WS2812遇汞,二來(lái)雙核的工程建立和應(yīng)用也介紹了未妹,內(nèi)容比較豐富些。
雙核工程創(chuàng)建
LPC55S69的雙核工程可以很方便的用MCUXpresso Config Tool工具創(chuàng)建空入。
新創(chuàng)建的工程络它,由于軟件小bug,incbin.s并沒(méi)有加入core0主核的工程歪赢,incbin.s 是一段匯編化戳,用于把core1 固件的bin文件鏈接到core0的image中。
注意埋凯,Core1的固件是存儲(chǔ)在Flash中的点楼,上電的時(shí)候,由主核Core0搬運(yùn)到RAM中白对,再通知Core1運(yùn)行掠廓。
如何把core1的image 編譯進(jìn) core0的image中
首先還是分散加載文件,在生成好的工程中甩恼,core0的分散加載文件已經(jīng)給core1的image默認(rèn)分配了一個(gè)空間蟀瞧,這個(gè)空間段的名字是m0code沉颂,地址從0x00072000,大小是0x00026000悦污,用戶可以根據(jù)自己的實(shí)際需求修改這個(gè)起始地址和重新分配空間的大小铸屉。
前文我們提別提到了incbin.s,顧名思義incbin是insert binary的縮寫(xiě)切端,這個(gè)匯編文件抬探,會(huì)幫我們把core1工程產(chǎn)生的binary文件core1_image.bin在在core0編譯的過(guò)程中放到core1在分散加載文件中定義的空間段。
當(dāng)然這么設(shè)置完帆赢,還不夠小压。最后關(guān)于雙核的設(shè)置還有一點(diǎn),要在KEIL的工程配置選型卡里椰于,選擇“Asm”配置include的路徑怠益,將core1的image路徑設(shè)置進(jìn)來(lái)。
Core1 用來(lái)做GPIO的控制驅(qū)動(dòng)WS2812
由于Core1的代碼比較直觀且簡(jiǎn)單瘾婿,我們就不用流程圖來(lái)解釋了蜻牢。大概講下Core1作為小核使用的過(guò)程。
第一步偏陪,調(diào)用MCMGR_Init()這個(gè)API抢呆,來(lái)初始化SDK提供的雙核機(jī)制比如通用事件這類(lèi)功能。
第二步笛谦,獲取Core0啟動(dòng)Core1時(shí)傳來(lái)的參數(shù)抱虐,這個(gè)代碼里,Core0傳遞給Core1的是WS2812TxBuf饥脑,這個(gè)Buffer里包含的LED數(shù)據(jù)數(shù)組的長(zhǎng)度和各個(gè)LED顯示的RGB數(shù)據(jù)內(nèi)容恳邀。
第三步,拉低WS2812 Data的IO口灶轰,延時(shí)大于50uS以上
第四步谣沸,按照每個(gè)WS2812TxBuf里實(shí)際RGB數(shù)據(jù)按照bit,翻轉(zhuǎn)GPIO發(fā)出0/1 信號(hào)
第五步笋颤,發(fā)送完成后乳附,調(diào)用MCMGR_TriggerEvent() API觸發(fā)Core0的中斷,通知主核Core1完成了WS2812數(shù)據(jù)的發(fā)送伴澄。
最后赋除,調(diào)用MCMGR_StopCore() 把自己這個(gè)core1關(guān)閉掉。
注意秉版,代碼delay的配置是以96MHz主頻來(lái)定的贤重,如果改變的MCU的主頻,這個(gè)值需要修改清焕。
Core0 用來(lái)做數(shù)據(jù)整理并且通知Core1發(fā)送
這樣做的好處是解放了Core0的資源并蝗,不會(huì)被各種delay函數(shù)浪費(fèi)了資源祭犯。
Core0調(diào)用Core1的資源前,要先初始化SDK的雙核管理機(jī)制
MCMGR_Init()
然后將Core1的Image從Flash 復(fù)制到其本身定義的RAM區(qū)域滚停。
如果需要Core1在完成時(shí)觸發(fā)中斷通知沃粗,則用MCMGR_RegisterEvent()注冊(cè)一個(gè)回調(diào)函數(shù),在Core1中斷發(fā)出的時(shí)候在Core0的中斷處理函數(shù)中調(diào)用這個(gè)回調(diào)函數(shù)
Core0啟動(dòng)Core1發(fā)送數(shù)據(jù)的方式比較簡(jiǎn)單键畴,在整理好數(shù)據(jù)后最盅,直接調(diào)用MCMGR_StartCore() API 即可。這里我們希望Core1和Core0之間是異步執(zhí)行的起惕,所以在第四個(gè)形參里使用的是異步模式涡贱。
實(shí)際的點(diǎn)燈代碼
實(shí)際的點(diǎn)燈代碼的API,我這邊將SPI惹想,EZH问词,雙核,SCT都是統(tǒng)一的嘀粱,main函數(shù)里邊的內(nèi)容一樣激挪,參考EZH那篇(之二)末尾介紹的API即可。