MCU應(yīng)用方案
第六十一期 2025.09.01
項(xiàng)目方案概述
本應(yīng)用來源于前級(jí)效果器面板項(xiàng)目(圖1),由一方案商提供硬件,但沒有原版軟件程序,因此他們自己開發(fā)了一套替代方案,依然是使用雅特力415芯片,此芯片主頻150MHz,SPI傳輸速率最高可達(dá)50Mb/s,經(jīng)計(jì)算,如果使用SPI+DMA傳輸,理論上可以跑40幀左右且不占用太大的系統(tǒng)使用率,但可能受限于技術(shù)水平,方案商的替代方案效果并不理想。
而如果我們想要出替代方案,使用M4系列,其價(jià)格并不是很好的選擇,因此選用了M3大容量的CKS32F103VET6。LCD驅(qū)動(dòng)方面,受限于M3最高18Mb/s的SPI傳輸速率,我們選用了8080作為顯示驅(qū)動(dòng)接口,利用了MCU的FSMC功能,對(duì)比SPI一根線傳輸數(shù)據(jù),F(xiàn)SMC可同時(shí)傳輸8位/16位數(shù)據(jù),其速率實(shí)測(cè)連續(xù)單色刷屏可達(dá)百幀以上,本項(xiàng)目方案商提供了8位并口屏,如果選擇16位速度可提升一倍。
系統(tǒng)菜單方面,原方案使用的是多級(jí)菜單,沒有掛系統(tǒng),多級(jí)菜單優(yōu)劣勢(shì)明顯,優(yōu)勢(shì)是設(shè)計(jì)簡(jiǎn)單,把系統(tǒng)分成一個(gè)個(gè)的層級(jí),通過按鍵輪詢菜單就可以切換不同的界面,其缺點(diǎn)是可靠性不足,不足以承載復(fù)雜的系統(tǒng),基于項(xiàng)目復(fù)雜性及可靠性評(píng)估,選擇了移植LVGL作為本方案的開發(fā)系統(tǒng),兼顧了系統(tǒng)穩(wěn)定性、項(xiàng)目拓展性及成功率。
圖1 前級(jí)效果器面板開發(fā)樣機(jī)
方案主要設(shè)計(jì)核心思路
客戶的核心訴求主要是刷屏效果要達(dá)到原版效果,原版效果應(yīng)該在20幀以內(nèi),速度比較快但刷屏?xí)r依然可以看到刷屏線,另一個(gè)要求是功能跟原版功能一致。
刷屏效果優(yōu)化
刷屏效果主要通過四種方式來優(yōu)化:
(1)提高主頻:我們103大容量運(yùn)行頻率可達(dá)144MHz,因此在軟件的最開始,手動(dòng)配置了升頻函數(shù),主要語句如下,配置PLL倍頻12倍,即12M*12=144MHz,后使能PLL,另外Flash等待時(shí)間必須配置為5,因?yàn)橹黝l增加了,要保證有足夠的等待時(shí)間才能完成配置,實(shí)測(cè)等待時(shí)間2時(shí),最高只能跑到120MHz主頻。
FLASH_SetLatency(0x05);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_12);
RCC_PLLCmd(ENABLE);
(2)優(yōu)化FSMC驅(qū)動(dòng):FSMC硬件連接方式如下表1所示,使用NE1作為片選,A16為寫命令/寫數(shù)據(jù),D0-D7為8位的雙向數(shù)據(jù)線,PD4讀數(shù)據(jù),PD5寫數(shù)據(jù)。LCD的驅(qū)動(dòng)時(shí)序,和FSMC模式A的時(shí)序基本一致,因此配置成模式A即可。為了最大化提高傳輸速率,F(xiàn)SMC的建立時(shí)間和數(shù)據(jù)保持時(shí)間都配置到最小。
表1 MCU與LCD屏接口硬件連接
(3)打點(diǎn)函數(shù)優(yōu)化:MCU通過以上FSMC并口控制LCD顯示芯片,其邏輯是MCU通過特定的地址把數(shù)據(jù)傳到LCD驅(qū)動(dòng)顯示芯片相應(yīng)的顯存里面(需要此芯片的根本原因是MCU SRAM不足),驅(qū)動(dòng)顯示芯片再按照配置好的掃屏順序,在顯示屏上刷新一個(gè)個(gè)像素點(diǎn)(圖2)。
圖2 MCU與LCD屏的關(guān)系
而打點(diǎn)函數(shù)就是MCU用來傳輸數(shù)據(jù)到LCD驅(qū)動(dòng)顯示芯片的橋梁,一般傳輸一個(gè)像素點(diǎn)數(shù)據(jù),都需要先發(fā)送命令,再發(fā)送數(shù)據(jù),LCD驅(qū)動(dòng)顯示芯片才會(huì)知道你這個(gè)數(shù)據(jù)用來干什么,一般的打點(diǎn)函數(shù),會(huì)對(duì)每一個(gè)像素點(diǎn)都進(jìn)行寫命令再發(fā)送數(shù)據(jù),這樣每次都會(huì)浪費(fèi)2次8位數(shù)據(jù)的時(shí)間,整一個(gè)屏320*240個(gè)像素點(diǎn),就會(huì)浪費(fèi)大量的時(shí)間,因此優(yōu)化了打點(diǎn)函數(shù),如下文所示。每次先獲得需要顯示圖像的XY軸開窗大小,然后寫命令一次,就可以將所有像素點(diǎn)連續(xù)寫入,只需要一次循環(huán)結(jié)束就可以完成打點(diǎn)函數(shù)。
void LCD_Draw_Picture(u16 sx,u16 sy,u16 ex,u16 ey,u16 *color)
{
u16 height,width;
u16 i;
width=ex-sx+1; //得到圖片的寬度
height=ey-sy+1; //得到圖片的高度
Lcd_SetRegion(sx,sy,ex,ey);
LCD_WriteRAM_Prepare(); //開始寫入GRAM
for(i=0;i
{
LCD->LCD_RAM=(*color)>>8;//寫入顏色值
LCD->LCD_RAM=(*color)&0XFF;
color++;
}
}
另外因?yàn)橛蠰CD驅(qū)動(dòng)顯示芯片的中轉(zhuǎn)存在,這里會(huì)產(chǎn)生一個(gè)問題,當(dāng)LCD還沒有刷新完屏幕一幀畫面時(shí)(讀顯存),LCD驅(qū)動(dòng)顯示芯片就寫入下一幀的畫面,那這兩幀之間,就會(huì)產(chǎn)生斷紋,對(duì)應(yīng)到人眼視覺上面,就會(huì)產(chǎn)生一個(gè)橫向撕裂的短暫停留(圖3)。 本方案解決這個(gè)問題的方式是通過讀取驅(qū)動(dòng)芯片的更新掃描線,讀取到掃描線在屏幕以外,才開始寫入,當(dāng)然弊端是這個(gè)讀取時(shí)間導(dǎo)致幀數(shù)降低,所以本方案在刷整屏的時(shí)候才會(huì)去等待掃描線,啟用消除橫向撕裂功能,小面積刷屏的時(shí)候幾乎不會(huì)出現(xiàn)撕裂現(xiàn)象,這樣的方案可以有效提高幀數(shù)。
圖3 橫向撕裂產(chǎn)生的原因,讀和寫的不同步
(4)LVGL系統(tǒng)級(jí)優(yōu)化:LVGL作為一個(gè)輕量級(jí)GUI系統(tǒng),并不是想要顯示圖像,就能馬上發(fā)送打點(diǎn)函數(shù),LVGL會(huì)有一個(gè)自己的心跳,根據(jù)顯示區(qū)域的大小及緩存區(qū)域配置,緩存好一塊圖像再通過打點(diǎn)函數(shù)輸出,這個(gè)緩存區(qū)域會(huì)極大的影響幀率,一般默認(rèn)是每次緩存像素點(diǎn)的十分之一,就會(huì)存在10次緩存等待時(shí)間,因此選擇優(yōu)化這個(gè)次數(shù),但是增大緩存區(qū)域會(huì)極大的占用SRAM,目前優(yōu)化配置為緩存總像素點(diǎn)的四分之一,占用38K字節(jié)SRAM,幀數(shù)可達(dá)20幀左右。
當(dāng)然,并不是只有這一種緩存方式,還可以選用雙緩存或者DMA2D+LTDC加速,但前者需要大量的SRAM資源,相當(dāng)于開辟雙倍的緩存區(qū)域,一個(gè)負(fù)責(zé)渲染,一個(gè)負(fù)責(zé)繪制;后者LTDC則需要F429以上芯片才有。很明顯我們不具有LTDC外設(shè),并且實(shí)測(cè)同等SRAM占用下,雙緩存不如單緩存顯示效果好。
方案進(jìn)行到這一步的時(shí)候才發(fā)現(xiàn)LVGL的弊端,并不能完全發(fā)揮我們FSMC傳輸速率,但好處是正因?yàn)檩p量級(jí)系統(tǒng)的存在,令我們系統(tǒng)可靠性大大提升,不需要自行設(shè)計(jì)內(nèi)存管理,配置后系統(tǒng)會(huì)幫你管理。
核心功能開發(fā)
經(jīng)過刷屏效果優(yōu)化后,已經(jīng)能滿足項(xiàng)目需求,接下來進(jìn)行功能項(xiàng)開發(fā)。雖然本項(xiàng)目看起來不大,但涉及的內(nèi)容非常多,共分為7大項(xiàng):
1) 輸入按鍵及旋鈕開發(fā)
本項(xiàng)目所有輸入分兩種,第一種是ADC檢測(cè)的按鍵,由一個(gè)ADC外設(shè),來檢測(cè)由分壓電阻隔開的11個(gè)電平,共分11個(gè)按鍵,不同adc值得到特定按鈕,本功能難點(diǎn)是adc檢測(cè)濾波函數(shù)和無沖突按鍵邏輯,濾波函數(shù)如下文所示,由于要準(zhǔn)確的命中鍵值,這里每次觸發(fā)adc中斷,會(huì)從DMA讀取100個(gè)adc值,然后快速作一個(gè)排序,最后平均第49位和50位adc值,就可以得到可靠的按鍵值,這些設(shè)定在16ms內(nèi)處理一次。能準(zhǔn)確得到按鍵值后,因?yàn)樘幚頃r(shí)間很快,為了使重復(fù)按鍵不沖突,設(shè)定了第一次按鍵鎖定以及鎖定時(shí)間,按下第一個(gè)按鍵后一定時(shí)間內(nèi)失能其他按鍵。
void filter(void)
{
u16 tmp;
u8 i = 0,j = 0;
for(i=0; i<=100/2; i++){
for(j=0; j< 99-i; j++){
if(ADC_ConvertedValue[j+1] < ADC_ConvertedValue[j]){
tmp = ADC_ConvertedValue[j+1];
ADC_ConvertedValue[j+1] = ADC_ConvertedValue[j];
ADC_ConvertedValue[j] = tmp;
}
}
}
After_filter=(ADC_ConvertedValue[49] + ADC_ConvertedValue[50])/2;
}
第二種輸入是三組旋鈕編碼器,旋鈕編碼器比較特殊,正轉(zhuǎn)和反轉(zhuǎn)時(shí),都會(huì)觸發(fā)AB兩個(gè)相的電平(圖4),通過分辨電平觸發(fā)的先后順序來得到正反轉(zhuǎn)。軟件部分使用2個(gè)IO外部中斷線觸發(fā),通過排序AB電平來臨的順序判斷是正反轉(zhuǎn),需要觸發(fā)多次判斷,同時(shí)要兼顧軟件防抖。三組編碼器共用到6個(gè)IO外部線中斷。
圖4 編碼器正反轉(zhuǎn)波形及狀態(tài)圖
2)頁面開發(fā)及頁面切換
為了快速開發(fā)頁面,本項(xiàng)目用到了NXP的一個(gè)軟件GUI-guider,頁面如圖5所示,是一款以圖像設(shè)計(jì)轉(zhuǎn)換為L(zhǎng)VGL代碼的軟件,通過配置模型和觸發(fā)事件,能快速的幫你轉(zhuǎn)化成代碼。有眾多使用方式,如新建文本框并給這個(gè)文本框觸發(fā)事件、按鍵按下后觸發(fā)文本框參數(shù)修改、聚焦時(shí)背景高亮、離焦后背景變回原色或切換下一頁。
使用軟件后,文本框功能只需要放置一個(gè)文本框圖像,設(shè)定大小和文本內(nèi)容,右鍵添加相關(guān)事件,最后會(huì)自動(dòng)生成所有代碼,大大減少開發(fā)難度,但最新版仍有一些bug,要自行按經(jīng)驗(yàn)修改,如內(nèi)存泄露,跳轉(zhuǎn)后沒有及時(shí)清理新建過的模型,導(dǎo)致內(nèi)存一直累積,多次跳轉(zhuǎn)后爆內(nèi)存。本項(xiàng)目使用此軟件快速生成頁面和事件的模版,再按需求修改邏輯和bug,本項(xiàng)目高達(dá)20多個(gè)頁面,200多個(gè)觸發(fā)事件,使用此軟件后工作量依然巨大。
圖5 NXP的GUI-guider頁面
3)參數(shù)切換開發(fā)
本項(xiàng)目參數(shù)切換頁面如圖6所示,這是其中一頁的可調(diào)參數(shù),通過旋鈕來選擇參數(shù)項(xiàng),如選到輸入選擇,按下確認(rèn)按鍵后,進(jìn)入?yún)?shù)切換模式,再次轉(zhuǎn)動(dòng)旋鈕將模擬1切換為模擬2、藍(lán)牙、USB等字樣。
軟件層面來看,我們找到這個(gè)文本框事件,添加按下事件,觸發(fā)這個(gè)事件會(huì)進(jìn)入到修改參數(shù)的狀態(tài),不同參數(shù)切換有不同標(biāo)志位,整個(gè)項(xiàng)目參數(shù)切換標(biāo)志位多達(dá)200個(gè),并且由于要修改參數(shù)的形式都不大一樣,每種參數(shù)都需要一種函數(shù)處理,工作量很大,并且除了參數(shù)本身定義值以外,還要顯示成字符串顯示在屏幕上,占用的FLASH和SRAM也需要非常大,目前沒有太好的方式,功能2和功能3都要花費(fèi)大量的重復(fù)工作。
圖6 MCU與LCD屏的關(guān)系
4)面板鎖開發(fā)
面板功能要求帶有面板鎖,基本邏輯是開啟面板鎖后,一段時(shí)間自動(dòng)回到主頁并顯示上鎖符號(hào),上鎖后不能操作按鍵,僅能用旋鈕調(diào)節(jié)音樂話筒效果等音量,按鍵后會(huì)進(jìn)入解鎖頁面,輸入正確密碼后,回到主頁并解除上鎖符號(hào),但一段時(shí)間不操作依舊會(huì)回到上鎖頁面,除非關(guān)閉面板鎖。
軟件設(shè)計(jì)了2種狀態(tài),一種是開啟面板鎖功能標(biāo)志位,一種是完全上鎖標(biāo)志位,開啟面板鎖并不會(huì)馬上進(jìn)入第二種狀態(tài),不管當(dāng)前是什么頁面,只要一段時(shí)間不操作,就會(huì)跳轉(zhuǎn)主頁并完全上鎖,完全上鎖后只要按鍵,就會(huì)跳轉(zhuǎn)解鎖頁面,密碼匹配后方可退出完全上鎖狀態(tài),然后開始倒數(shù)計(jì)數(shù),每次按鍵都會(huì)復(fù)位計(jì)數(shù)值,倒數(shù)完畢后重回上鎖狀態(tài),邏輯流程圖如圖7所示。
圖7 面板鎖軟件邏輯流程圖
5)保存命名/密碼輸入
本功能主要是對(duì)命名設(shè)計(jì),模式保存后可以添加命名(圖8a),一共可以保存16種配置,配置好后,使用效果器的人員,只需要調(diào)用相應(yīng)序號(hào)及名字的模式,所有參數(shù)會(huì)自動(dòng)切換到上次保存的配置。這個(gè)功能和參數(shù)切換類似,把每一位的名稱都當(dāng)成是獨(dú)立的一個(gè)參數(shù),由A-Z,a-z,0-9還有空格一共63個(gè)數(shù)組成的數(shù)組里面選擇,總共10位組成一段命名,同時(shí)調(diào)整序號(hào),會(huì)馬上顯示相應(yīng)保存好的命名。面板鎖密碼頁面(圖8b)也是類似,只不過是從0-9,10個(gè)數(shù)字變化,另外增加原密碼的對(duì)比,以及密碼修改功能。這部分的難點(diǎn)在于要考慮全面,當(dāng)保存命名/輸入密碼中途,插入其他操作,應(yīng)該復(fù)位和保存相應(yīng)的參數(shù)。
圖8 a保存命名及b面板鎖密碼
6)配置保存讀取/數(shù)據(jù)庫(kù)修改開發(fā)
在項(xiàng)目的初期,原方案商并沒有加入進(jìn)來,沒有獲取到對(duì)方的數(shù)據(jù)庫(kù)設(shè)定,因此設(shè)計(jì)將所有16組配置參數(shù)寫入內(nèi)部Flash,以及讀取的一套驗(yàn)證方式,把寫入內(nèi)部Flash當(dāng)成是發(fā)送到對(duì)方數(shù)據(jù)庫(kù)內(nèi),用于所有參數(shù)的保存和讀取,根據(jù)寫入?yún)?shù)的大小,按順序每8位寫入到一位內(nèi)存數(shù)組里,再?gòu)奶囟ǖ刂?,順序讀回參數(shù)。
為了減少Flash占用空間,參數(shù)都使用數(shù)字簡(jiǎn)化代表字符串,再根據(jù)不同數(shù)字轉(zhuǎn)換回字符串用于顯示。雖然后期加入對(duì)方的數(shù)據(jù)庫(kù),存儲(chǔ)數(shù)據(jù)在DSP內(nèi)部,但這種方式也有效的設(shè)計(jì)了字符串轉(zhuǎn)換的函數(shù),減少了開發(fā)周期。
7) 事務(wù)優(yōu)化
LVGL的特色是按照心跳自行輸出畫面,而眾多的事務(wù)總會(huì)對(duì)畫面做干預(yù),但LVGL本身是不支持多線程操作的,在系統(tǒng)還沒有輸出完畫面時(shí),我們直接去干預(yù),會(huì)造成系統(tǒng)卡死,因此可以利用LVGL的軟件定時(shí)器,將所有事務(wù)都運(yùn)行在里面,讓LVGL自行順序執(zhí)行。
而MCU自身的ADC中斷和外部IO檢測(cè)中斷,因?yàn)椴荒芊旁谲浖〞r(shí)器內(nèi)執(zhí)行,我們盡可能的減少數(shù)據(jù)量處理,僅用于標(biāo)志位觸發(fā)判定,從而保證系統(tǒng)可靠。如果開發(fā)更大的系統(tǒng),可以加入任務(wù)系統(tǒng),來輔助線程操作。
軟件定時(shí)器新建方式如下:
lvgl_task2 = lv_timer_create(OS_Handler, 10, 0);
//創(chuàng)建軟件定時(shí)器,后續(xù)直接調(diào)用void OS_Handler(lv_timer_t * tmr)
結(jié)語
以上是本項(xiàng)目核心的開發(fā)思路,詳細(xì)開發(fā)過程中還會(huì)碰到很多問題,如字模替換、特殊顯示邏輯、圖片插入等。軟件工程送樣后添加了通訊協(xié)議和相關(guān)函數(shù),上機(jī)連接DSP實(shí)測(cè)通訊控制沒有問題。
整個(gè)方案,總的來說CKS32F103VE的FLASH和SRAM資源堪堪夠用,可以看到LVGL雖然穩(wěn)定可靠且使用方便,但在只用到文本框和標(biāo)簽模型的情況下,每頁畫面占用的資源在十多K字節(jié)左右,顯示幀率也因?yàn)榫彌_方式受限很大。FSMC優(yōu)化后,能跑20幀左右,占用SRAM有38K字節(jié),如果重新評(píng)估,同樣顯示功能, SPI+DMA+多級(jí)菜單的方案也是足夠使用,當(dāng)然現(xiàn)在圖形化一直在發(fā)展,更加美觀的GUI可拓展性更佳。
-
mcu
+關(guān)注
關(guān)注
147文章
18392瀏覽量
378983 -
lcd
+關(guān)注
關(guān)注
35文章
4561瀏覽量
174407 -
面板
+關(guān)注
關(guān)注
13文章
1717瀏覽量
55077
原文標(biāo)題:CKS32F103VE應(yīng)用于前級(jí)效果器面板方案
文章出處:【微信號(hào):中科芯MCU,微信公眾號(hào):中科芯MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
各位大佬給指點(diǎn)一下,感激不盡,貝斯前級(jí)DI效果器上的插件元件
ktv kalaok 效果器
cks32f103有哪些功能
效果器的使用技巧
效果器,效果器的種類,效果器的原理是什么?
一文看懂激勵(lì)器和效果器的作用
效果器可以代替前級(jí)功放嗎
前級(jí)功放和效果器的區(qū)別是什么
前級(jí)效果器和前級(jí)功放有什么區(qū)別
前級(jí)效果器和后級(jí)功放怎么連接
探索吉他音色與效果器的奇妙世界(3)- 時(shí)延和哇音效果器

評(píng)論