合宙Air32F103系列MCU自六月初量產(chǎn)上市以來,以優(yōu)異性能和極致低價受到廣大用戶好評。特別是Air32F103CCT6芯片,64K RAM+256K Flash,可滿足許多復雜應用需求。
最近LuatOS社區(qū)大神@Principle,在Air32F103CCT6上移植LVGL+FreeRTOS并進行了跑分測試,我們一起來看看吧~
-合宙Air32跑分實測 -
文末【閱讀原文】鏈接,獲取最新資料。
1
合宙Air32芯片選型
合宙Air32系列芯片有不同容量型號可選,我選擇了QFP48封裝所能提供最大存儲容量的Air32F103CCT6。
合宙LuatOS淘寶直營店
luat.taobao.com
Air32F103CCT6芯片相對于STM32F103大容量型號,主要有以下幾個升級點:
●216MHz的Cortex-M3內(nèi)核
可以穩(wěn)定超頻運行在256MHz,且運行在216MHz下時,全部Flash區(qū)域僅需1個等待周期。
●新增了一些外設
包括ADC3/TRNG/TIM9-TIM14等;
●對現(xiàn)有外設進行了增強
例如內(nèi)置USB上拉電阻、GPIO可以獨立上下拉等。
2
移植FreeRTOS與LVGL
由于合宙Air32系列能夠兼容STM32,因此本代碼基于STM32F1的標準庫,并增加了Air32的專有代碼。
Air32F103最新LVGL+FreeRTOS示例工程:
https://yuanze.wang/posts/air32-lvgl-freertos/
本工程針對Air32F103CCT6芯片,使用硬件SPI+DMA的方式驅(qū)動GC9306X控制器的320x240LCD屏幕,并支持雙緩沖模式,幾乎榨干了Air32所有的性能。同時,使用RTOS保證了DMA傳輸過程中CPU能夠進入休眠,降低系統(tǒng)功耗。
特別注意:
請使用較新版本的Keil,舊版Keil可能會出現(xiàn)編譯的程序運行錯誤問題。
本工程經(jīng)實測可使用Keil5.36正常編譯。
2.1 工程組件
本文所使用的工程組件均來自原汁原味的官方最新版,除了配置文件之外絕無任何魔改。
● FreeRTOS:
來自FreeRTOS官網(wǎng)中最新的LTS 202012.04版本。
https://www.freertos.org/a00104.html
● LVGL:來自官網(wǎng)LVGL官方GitHub倉庫中最新的LVGL 8.3.1版本。
https://github.com/lvgl/lvgl/releases
2.2 注意事項
● 中斷優(yōu)先級:
Air32的NVIC中斷優(yōu)先級只有3位,而不是STM32的4位。若想使用STM32的標準庫,則需要在FreeRTOSConfig.h頭文件中修改__NVIC_PRIO_BITS默認的值。
C
#ifndef __FREERTOS_CONFIG_H
#define __FREERTOS_CONFIG_H
#include "stm32f10x.h"
#undef __NVIC_PRIO_BITS
#define __NVIC_PRIO_BITS 3
● Air32專用PLL庫:
需要來自合宙的閉源PLL庫。為此,我將STM32原版的system_stm32f10x.c排除編譯,然后實現(xiàn)了自己的SystemInit()函數(shù)。該函數(shù)可以從合宙官方的SDK中獲取。
▼上下滾動,查看全部▼
C
voidSystemInit(void)
{
RCC_DeInit(); //復位RCC寄存器
RCC_HSEConfig(RCC_HSE_ON); //使能HSE
while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //等待HSE就緒
RCC_PLLCmd(DISABLE);//關閉PLL
AIR_RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_32, 1); //配置PLL, 8*32=256MHz
RCC_PLLCmd(ENABLE); //使能PLL
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //等待PLL就緒
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //選擇PLL作為系統(tǒng)時鐘
RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB時鐘
RCC_PCLK1Config(RCC_HCLK_Div2);//配置APB1時鐘
RCC_PCLK2Config(RCC_HCLK_Div1);//配置APB2時鐘
RCC_LSICmd(ENABLE); //使能內(nèi)部低速時鐘
while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET); //等待LSI就緒
RCC_HSICmd(ENABLE); //使能內(nèi)部高速時鐘
while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET); //等待HSI就緒
}
然后,將air.lib加入工程中,并自己定義AIR_RCC_PLLConfig()函數(shù)的原型與SystemCoreClock的值。
合宙Air32支持比STM32標準庫更高的RCC_PLLMul_xx值,因此還需要將air32f10x.h中新增的PLL值復制到自己的代碼中,這樣可以在使用熟悉的STM32標準庫的同時,使用到Air32的增強功能。
▼上下滾動,查看全部▼
C
#define RCC_PLLMul_17 ((uint32_t)0x10000000)
#define RCC_PLLMul_18 ((uint32_t)0x10040000)
#define RCC_PLLMul_19 ((uint32_t)0x10080000)
#define RCC_PLLMul_20 ((uint32_t)0x100C0000)
#define RCC_PLLMul_21 ((uint32_t)0x10100000)
#define RCC_PLLMul_22 ((uint32_t)0x10140000)
#define RCC_PLLMul_23 ((uint32_t)0x10180000)
#define RCC_PLLMul_24 ((uint32_t)0x101C0000)
#define RCC_PLLMul_25 ((uint32_t)0x10200000)
#define RCC_PLLMul_26 ((uint32_t)0x10240000)
#define RCC_PLLMul_27 ((uint32_t)0x10280000)
#define RCC_PLLMul_28 ((uint32_t)0x102C0000)
#define RCC_PLLMul_29 ((uint32_t)0x10300000)
#define RCC_PLLMul_30 ((uint32_t)0x10340000)
#define RCC_PLLMul_31 ((uint32_t)0x10380000)
#define RCC_PLLMul_32 ((uint32_t)0x103C0000)
uint32_t SystemCoreClock = 256000000;
uint32_t AIR_RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul, uint8_t Latency);
注意:
如需使用Air32相比STM32新增的外設中斷,請自行更換STM32的啟動文件到Air32的啟動文件。
● Keil編譯器設置:
LVGL需要最低支持C99的編譯器才能正確編譯,因此需要開啟Keil AC5的C99模式。同時,為了減少生成固件的體積,建議選擇最高級別的-O3優(yōu)化。
2.3 組件庫的裁剪與優(yōu)化
由于芯片的RAM空間有限,因此需要對芯片的RAM空間進行一定的規(guī)劃與優(yōu)化。程序中占用RAM較大的部分與相應的規(guī)劃如下:
● 系統(tǒng)棧:
由于使用了FreeRTOS,各個Task有其自己的任務棧,因此系統(tǒng)棧只有ISR與main函數(shù)使用。
因此,在startup_stm32f10x_hd.s中將Stack_Size改為0x00000100,即256字節(jié)。
● 任務棧:
目前的代碼中只有三個Task,分別是LVGL Task LED Task與IDLE Task。
其中,LED Task與IDLE Task都非常簡單,為它們設置128字節(jié)的任務棧;LVGL Task較為復雜,根據(jù)官方推薦的2-8K范圍,設置為4K。
● LVGL堆:
LVGL的所有句柄都是動態(tài)內(nèi)存,因此其自己維護了一個堆空間。堆空間的大小可以在lv_conf.h中的LV_MEM_SIZE中修改,您可以根據(jù)自己使用的UI復雜度對其進行修改。對于benchmark demo,12K即可滿足要求。
● LVGL緩沖區(qū):
LVGL需要將畫面渲染到緩沖區(qū)中,之后再刷新到屏幕上。本工程支持單緩沖與雙緩沖模式(可以在Keil的Target中選擇),單緩沖模式使用1個240x40像素的緩沖區(qū),雙緩沖模式則使用2個240x40像素的緩沖區(qū)。使用雙緩沖模式可以在DMA控制器向屏幕寫入一個緩沖區(qū)的數(shù)據(jù)時,CPU繼續(xù)渲染到另一個緩沖區(qū)中,提升渲染效率,但會占用雙倍的緩沖區(qū)。
同時,由于芯片的ROM空間也有限,因此我裁剪了一些LVGL與FreeRTOS的功能。您可以在lv_conf.h與FreeRTOSConfig.h中自行開關它們。benchmarkdemo中包含了大量的字體與圖像,因此導致最終編譯生成的bin文件較大。只使用FreeRTOS與LVGL內(nèi)核時,ROM占用約120K。使用常用的控件后,還能剩余約100K空間給用戶開發(fā)自己的應用。
3
運行效果及總結
接下來通過單緩沖模式及雙緩沖模式實測數(shù)據(jù),看看整體運行效果如何:
3.1 單緩沖模式
單緩沖模式的存儲空間占用情況如下:
C
Total RO Size (Code + RO Data) 230904 ( 225.49kB)
Total RW Size (RW Data + ZI Data) 40768 ( 39.81kB)
Total ROM Size (Code + RO Data + RW Data) 231472 ( 226.05kB)
單緩沖模式跑分結果:
3.2雙緩沖模式
雙緩沖模式的存儲空間占用情況如下:
C
Total RO Size (Code + RO Data) 230904 ( 225.49kB)
Total RW Size (RW Data + ZI Data) 40768 ( 39.81kB)
Total ROM Size (Code + RO Data + RW Data) 231472 ( 226.05kB)
雙緩沖模式跑分結果:
可以看出,單緩沖模式相比雙緩沖模式節(jié)約了大量的RAM,幀數(shù)卻只下降了25%,因此單緩沖模式更具有實用意義。這主要是因為,在復雜UI界面下,瓶頸主要在CPU的運算速度上,而不是向屏幕寫入緩沖區(qū)的IO操作上。
● 實測總結:
5元錢的Air32F103CCT6確實具有了流暢運行LVGL的能力,并且還有100K左右的ROM和超過20K的RAM空間可用,這使得在Air32F103上使用LVGL+FreeRTOS的同時開發(fā)復雜的用戶程序成為了可能,我們又多了一個高性價比的國產(chǎn)MCU選擇。
-
單片機
+關注
關注
6043文章
44622瀏覽量
638663
發(fā)布評論請先 登錄
相關推薦
國產(chǎn)8位單片機在國內(nèi)的應用情況及發(fā)展趨勢!
英銳恩科技,以實力打造國產(chǎn)單片機替代品牌!
freertos最多支持多少個任務
lvgl移植到RT-Thread Nano后進入硬件錯誤中斷的原因?
ESP32S3 + LVGL遇到LoadProhibited問題如何解決?
理解嵌入式和單片機的區(qū)別
4毛5起的國產(chǎn)32位單片機 PY32F002A系列,多種封裝可以選擇
![4毛<b class='flag-5'>5</b>起的<b class='flag-5'>國產(chǎn)</b>32位<b class='flag-5'>單片機</b> PY32F002A系列,多種封裝可以選擇](https://file1.elecfans.com//web2/M00/C6/CC/wKgaomYDgXaAARudAAEwa90Uc1E259.jpg)
評論