MCU應用方案
第六十一期 2025.09.01
項目方案概述
本應用來源于前級效果器面板項目(圖1),由一方案商提供硬件,但沒有原版軟件程序,因此他們自己開發了一套替代方案,依然是使用雅特力415芯片,此芯片主頻150MHz,SPI傳輸速率最高可達50Mb/s,經計算,如果使用SPI+DMA傳輸,理論上可以跑40幀左右且不占用太大的系統使用率,但可能受限于技術水平,方案商的替代方案效果并不理想。
而如果我們想要出替代方案,使用M4系列,其價格并不是很好的選擇,因此選用了M3大容量的CKS32F103VET6。LCD驅動方面,受限于M3最高18Mb/s的SPI傳輸速率,我們選用了8080作為顯示驅動接口,利用了MCU的FSMC功能,對比SPI一根線傳輸數據,FSMC可同時傳輸8位/16位數據,其速率實測連續單色刷屏可達百幀以上,本項目方案商提供了8位并口屏,如果選擇16位速度可提升一倍。
系統菜單方面,原方案使用的是多級菜單,沒有掛系統,多級菜單優劣勢明顯,優勢是設計簡單,把系統分成一個個的層級,通過按鍵輪詢菜單就可以切換不同的界面,其缺點是可靠性不足,不足以承載復雜的系統,基于項目復雜性及可靠性評估,選擇了移植LVGL作為本方案的開發系統,兼顧了系統穩定性、項目拓展性及成功率。

圖1 前級效果器面板開發樣機
方案主要設計核心思路
客戶的核心訴求主要是刷屏效果要達到原版效果,原版效果應該在20幀以內,速度比較快但刷屏時依然可以看到刷屏線,另一個要求是功能跟原版功能一致。
刷屏效果優化
刷屏效果主要通過四種方式來優化:
(1)提高主頻:我們103大容量運行頻率可達144MHz,因此在軟件的最開始,手動配置了升頻函數,主要語句如下,配置PLL倍頻12倍,即12M*12=144MHz,后使能PLL,另外Flash等待時間必須配置為5,因為主頻增加了,要保證有足夠的等待時間才能完成配置,實測等待時間2時,最高只能跑到120MHz主頻。
FLASH_SetLatency(0x05);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_12);
RCC_PLLCmd(ENABLE);
(2)優化FSMC驅動:FSMC硬件連接方式如下表1所示,使用NE1作為片選,A16為寫命令/寫數據,D0-D7為8位的雙向數據線,PD4讀數據,PD5寫數據。LCD的驅動時序,和FSMC模式A的時序基本一致,因此配置成模式A即可。為了最大化提高傳輸速率,FSMC的建立時間和數據保持時間都配置到最小。
表1 MCU與LCD屏接口硬件連接

(3)打點函數優化:MCU通過以上FSMC并口控制LCD顯示芯片,其邏輯是MCU通過特定的地址把數據傳到LCD驅動顯示芯片相應的顯存里面(需要此芯片的根本原因是MCU SRAM不足),驅動顯示芯片再按照配置好的掃屏順序,在顯示屏上刷新一個個像素點(圖2)。

圖2 MCU與LCD屏的關系
而打點函數就是MCU用來傳輸數據到LCD驅動顯示芯片的橋梁,一般傳輸一個像素點數據,都需要先發送命令,再發送數據,LCD驅動顯示芯片才會知道你這個數據用來干什么,一般的打點函數,會對每一個像素點都進行寫命令再發送數據,這樣每次都會浪費2次8位數據的時間,整一個屏320*240個像素點,就會浪費大量的時間,因此優化了打點函數,如下文所示。每次先獲得需要顯示圖像的XY軸開窗大小,然后寫命令一次,就可以將所有像素點連續寫入,只需要一次循環結束就可以完成打點函數。
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++;
}
}
另外因為有LCD驅動顯示芯片的中轉存在,這里會產生一個問題,當LCD還沒有刷新完屏幕一幀畫面時(讀顯存),LCD驅動顯示芯片就寫入下一幀的畫面,那這兩幀之間,就會產生斷紋,對應到人眼視覺上面,就會產生一個橫向撕裂的短暫停留(圖3)。 本方案解決這個問題的方式是通過讀取驅動芯片的更新掃描線,讀取到掃描線在屏幕以外,才開始寫入,當然弊端是這個讀取時間導致幀數降低,所以本方案在刷整屏的時候才會去等待掃描線,啟用消除橫向撕裂功能,小面積刷屏的時候幾乎不會出現撕裂現象,這樣的方案可以有效提高幀數。
圖3 橫向撕裂產生的原因,讀和寫的不同步
(4)LVGL系統級優化:LVGL作為一個輕量級GUI系統,并不是想要顯示圖像,就能馬上發送打點函數,LVGL會有一個自己的心跳,根據顯示區域的大小及緩存區域配置,緩存好一塊圖像再通過打點函數輸出,這個緩存區域會極大的影響幀率,一般默認是每次緩存像素點的十分之一,就會存在10次緩存等待時間,因此選擇優化這個次數,但是增大緩存區域會極大的占用SRAM,目前優化配置為緩存總像素點的四分之一,占用38K字節SRAM,幀數可達20幀左右。
當然,并不是只有這一種緩存方式,還可以選用雙緩存或者DMA2D+LTDC加速,但前者需要大量的SRAM資源,相當于開辟雙倍的緩存區域,一個負責渲染,一個負責繪制;后者LTDC則需要F429以上芯片才有。很明顯我們不具有LTDC外設,并且實測同等SRAM占用下,雙緩存不如單緩存顯示效果好。
方案進行到這一步的時候才發現LVGL的弊端,并不能完全發揮我們FSMC傳輸速率,但好處是正因為輕量級系統的存在,令我們系統可靠性大大提升,不需要自行設計內存管理,配置后系統會幫你管理。
核心功能開發
經過刷屏效果優化后,已經能滿足項目需求,接下來進行功能項開發。雖然本項目看起來不大,但涉及的內容非常多,共分為7大項:
1) 輸入按鍵及旋鈕開發
本項目所有輸入分兩種,第一種是ADC檢測的按鍵,由一個ADC外設,來檢測由分壓電阻隔開的11個電平,共分11個按鍵,不同adc值得到特定按鈕,本功能難點是adc檢測濾波函數和無沖突按鍵邏輯,濾波函數如下文所示,由于要準確的命中鍵值,這里每次觸發adc中斷,會從DMA讀取100個adc值,然后快速作一個排序,最后平均第49位和50位adc值,就可以得到可靠的按鍵值,這些設定在16ms內處理一次。能準確得到按鍵值后,因為處理時間很快,為了使重復按鍵不沖突,設定了第一次按鍵鎖定以及鎖定時間,按下第一個按鍵后一定時間內失能其他按鍵。
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;
}
第二種輸入是三組旋鈕編碼器,旋鈕編碼器比較特殊,正轉和反轉時,都會觸發AB兩個相的電平(圖4),通過分辨電平觸發的先后順序來得到正反轉。軟件部分使用2個IO外部中斷線觸發,通過排序AB電平來臨的順序判斷是正反轉,需要觸發多次判斷,同時要兼顧軟件防抖。三組編碼器共用到6個IO外部線中斷。
圖4 編碼器正反轉波形及狀態圖
2)頁面開發及頁面切換
為了快速開發頁面,本項目用到了NXP的一個軟件GUI-guider,頁面如圖5所示,是一款以圖像設計轉換為LVGL代碼的軟件,通過配置模型和觸發事件,能快速的幫你轉化成代碼。有眾多使用方式,如新建文本框并給這個文本框觸發事件、按鍵按下后觸發文本框參數修改、聚焦時背景高亮、離焦后背景變回原色或切換下一頁。
使用軟件后,文本框功能只需要放置一個文本框圖像,設定大小和文本內容,右鍵添加相關事件,最后會自動生成所有代碼,大大減少開發難度,但最新版仍有一些bug,要自行按經驗修改,如內存泄露,跳轉后沒有及時清理新建過的模型,導致內存一直累積,多次跳轉后爆內存。本項目使用此軟件快速生成頁面和事件的模版,再按需求修改邏輯和bug,本項目高達20多個頁面,200多個觸發事件,使用此軟件后工作量依然巨大。
圖5 NXP的GUI-guider頁面
3)參數切換開發
本項目參數切換頁面如圖6所示,這是其中一頁的可調參數,通過旋鈕來選擇參數項,如選到輸入選擇,按下確認按鍵后,進入參數切換模式,再次轉動旋鈕將模擬1切換為模擬2、藍牙、USB等字樣。
軟件層面來看,我們找到這個文本框事件,添加按下事件,觸發這個事件會進入到修改參數的狀態,不同參數切換有不同標志位,整個項目參數切換標志位多達200個,并且由于要修改參數的形式都不大一樣,每種參數都需要一種函數處理,工作量很大,并且除了參數本身定義值以外,還要顯示成字符串顯示在屏幕上,占用的FLASH和SRAM也需要非常大,目前沒有太好的方式,功能2和功能3都要花費大量的重復工作。
圖6 MCU與LCD屏的關系
4)面板鎖開發
面板功能要求帶有面板鎖,基本邏輯是開啟面板鎖后,一段時間自動回到主頁并顯示上鎖符號,上鎖后不能操作按鍵,僅能用旋鈕調節音樂話筒效果等音量,按鍵后會進入解鎖頁面,輸入正確密碼后,回到主頁并解除上鎖符號,但一段時間不操作依舊會回到上鎖頁面,除非關閉面板鎖。
軟件設計了2種狀態,一種是開啟面板鎖功能標志位,一種是完全上鎖標志位,開啟面板鎖并不會馬上進入第二種狀態,不管當前是什么頁面,只要一段時間不操作,就會跳轉主頁并完全上鎖,完全上鎖后只要按鍵,就會跳轉解鎖頁面,密碼匹配后方可退出完全上鎖狀態,然后開始倒數計數,每次按鍵都會復位計數值,倒數完畢后重回上鎖狀態,邏輯流程圖如圖7所示。
圖7 面板鎖軟件邏輯流程圖
5)保存命名/密碼輸入
本功能主要是對命名設計,模式保存后可以添加命名(圖8a),一共可以保存16種配置,配置好后,使用效果器的人員,只需要調用相應序號及名字的模式,所有參數會自動切換到上次保存的配置。這個功能和參數切換類似,把每一位的名稱都當成是獨立的一個參數,由A-Z,a-z,0-9還有空格一共63個數組成的數組里面選擇,總共10位組成一段命名,同時調整序號,會馬上顯示相應保存好的命名。面板鎖密碼頁面(圖8b)也是類似,只不過是從0-9,10個數字變化,另外增加原密碼的對比,以及密碼修改功能。這部分的難點在于要考慮全面,當保存命名/輸入密碼中途,插入其他操作,應該復位和保存相應的參數。
圖8 a保存命名及b面板鎖密碼
6)配置保存讀取/數據庫修改開發
在項目的初期,原方案商并沒有加入進來,沒有獲取到對方的數據庫設定,因此設計將所有16組配置參數寫入內部Flash,以及讀取的一套驗證方式,把寫入內部Flash當成是發送到對方數據庫內,用于所有參數的保存和讀取,根據寫入參數的大小,按順序每8位寫入到一位內存數組里,再從特定地址,順序讀回參數。
為了減少Flash占用空間,參數都使用數字簡化代表字符串,再根據不同數字轉換回字符串用于顯示。雖然后期加入對方的數據庫,存儲數據在DSP內部,但這種方式也有效的設計了字符串轉換的函數,減少了開發周期。
7) 事務優化
LVGL的特色是按照心跳自行輸出畫面,而眾多的事務總會對畫面做干預,但LVGL本身是不支持多線程操作的,在系統還沒有輸出完畫面時,我們直接去干預,會造成系統卡死,因此可以利用LVGL的軟件定時器,將所有事務都運行在里面,讓LVGL自行順序執行。
而MCU自身的ADC中斷和外部IO檢測中斷,因為不能放在軟件定時器內執行,我們盡可能的減少數據量處理,僅用于標志位觸發判定,從而保證系統可靠。如果開發更大的系統,可以加入任務系統,來輔助線程操作。
軟件定時器新建方式如下:
lvgl_task2 = lv_timer_create(OS_Handler, 10, 0);
//創建軟件定時器,后續直接調用void OS_Handler(lv_timer_t * tmr)
結語
以上是本項目核心的開發思路,詳細開發過程中還會碰到很多問題,如字模替換、特殊顯示邏輯、圖片插入等。軟件工程送樣后添加了通訊協議和相關函數,上機連接DSP實測通訊控制沒有問題。
整個方案,總的來說CKS32F103VE的FLASH和SRAM資源堪堪夠用,可以看到LVGL雖然穩定可靠且使用方便,但在只用到文本框和標簽模型的情況下,每頁畫面占用的資源在十多K字節左右,顯示幀率也因為緩沖方式受限很大。FSMC優化后,能跑20幀左右,占用SRAM有38K字節,如果重新評估,同樣顯示功能, SPI+DMA+多級菜單的方案也是足夠使用,當然現在圖形化一直在發展,更加美觀的GUI可拓展性更佳。






-
mcu
+關注
關注
147文章
18669瀏覽量
388933 -
lcd
+關注
關注
36文章
4581瀏覽量
176044 -
面板
+關注
關注
13文章
1722瀏覽量
55229
原文標題:CKS32F103VE應用于前級效果器面板方案
文章出處:【微信號:中科芯MCU,微信公眾號:中科芯MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
各位大佬給指點一下,感激不盡,貝斯前級DI效果器上的插件元件
cks32f103有哪些功能
效果器的使用技巧
效果器,效果器的種類,效果器的原理是什么?
前級功放和效果器的區別是什么
前級效果器和前級功放有什么區別
探索吉他音色與效果器的奇妙世界(3)- 時延和哇音效果器

基于CKS32F103VE MCU的前級效果器面板方案
評論