0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

不服跑個(gè)分!5塊錢(qián)的國(guó)產(chǎn)單片機(jī)—Air32移植LVGL+FreeRTOS

合宙LuatOS ? 2022-08-28 15:52 ? 次閱讀

1ee754d6-2560-11ed-9ade-dac502259ad0.png

合宙Air32F103系列MCU自六月初量產(chǎn)上市以來(lái),以優(yōu)異性能和極致低價(jià)受到廣大用戶好評(píng)。特別是Air32F103CCT6芯片,64K RAM+256K Flash,可滿足許多復(fù)雜應(yīng)用需求。

最近LuatOS社區(qū)大神@Principle,在Air32F103CCT6上移植LVGL+FreeRTOS并進(jìn)行了跑分測(cè)試,我們一起來(lái)看看吧~

1f03e218-2560-11ed-9ade-dac502259ad0.gif

-合宙Air32跑分實(shí)測(cè) -

文末【閱讀原文】鏈接,獲取最新資料。

1

合宙Air32芯片選型


合宙Air32系列芯片有不同容量型號(hào)可選,我選擇了QFP48封裝所能提供最大存儲(chǔ)容量的Air32F103CCT6。

合宙LuatOS淘寶直營(yíng)店

luat.taobao.com

1f0f797a-2560-11ed-9ade-dac502259ad0.png

Air32F103CCT6芯片相對(duì)于STM32F103大容量型號(hào),主要有以下幾個(gè)升級(jí)點(diǎn):

●216MHz的Cortex-M3內(nèi)核

可以穩(wěn)定超頻運(yùn)行在256MHz,且運(yùn)行在216MHz下時(shí),全部Flash區(qū)域僅需1個(gè)等待周期。

●新增了一些外設(shè)
包括ADC3/TRNG/TIM9-TIM14等;

●對(duì)現(xiàn)有外設(shè)進(jìn)行了增強(qiáng)

例如內(nèi)置USB上拉電阻、GPIO可以獨(dú)立上下拉等。

2

移植FreeRTOS與LVGL


由于合宙Air32系列能夠兼容STM32,因此本代碼基于STM32F1的標(biāo)準(zhǔn)庫(kù),并增加了Air32的專有代碼。

Air32F103最新LVGL+FreeRTOS示例工程:
https://yuanze.wang/posts/air32-lvgl-freertos/

本工程針對(duì)Air32F103CCT6芯片,使用硬件SPI+DMA的方式驅(qū)動(dòng)GC9306X控制器的320x240LCD屏幕,并支持雙緩沖模式,幾乎榨干了Air32所有的性能。同時(shí),使用RTOS保證了DMA傳輸過(guò)程中CPU能夠進(jìn)入休眠,降低系統(tǒng)功耗。

特別注意:

請(qǐng)使用較新版本的Keil,舊版Keil可能會(huì)出現(xiàn)編譯的程序運(yùn)行錯(cuò)誤問(wèn)題。

本工程經(jīng)實(shí)測(cè)可使用Keil5.36正常編譯。

1f03e218-2560-11ed-9ade-dac502259ad0.gif

2.1 工程組件


本文所使用的工程組件均來(lái)自原汁原味的官方最新版,除了配置文件之外絕無(wú)任何魔改。

● FreeRTOS:

來(lái)自FreeRTOS官網(wǎng)中最新的LTS 202012.04版本。
https://www.freertos.org/a00104.html

● LVGL:來(lái)自官網(wǎng)LVGL官方GitHub倉(cāng)庫(kù)中最新的LVGL 8.3.1版本。
https://github.com/lvgl/lvgl/releases

2.2 注意事項(xiàng)


● 中斷優(yōu)先級(jí):

Air32的NVIC中斷優(yōu)先級(jí)只有3位,而不是STM32的4位。若想使用STM32的標(biāo)準(zhǔn)庫(kù),則需要在FreeRTOSConfig.h頭文件中修改__NVIC_PRIO_BITS默認(rèn)的值。

C

#ifndef __FREERTOS_CONFIG_H

#define __FREERTOS_CONFIG_H

#include "stm32f10x.h"

#undef __NVIC_PRIO_BITS

#define __NVIC_PRIO_BITS 3

● Air32專用PLL庫(kù):

需要來(lái)自合宙的閉源PLL庫(kù)。為此,我將STM32原版的system_stm32f10x.c排除編譯,然后實(shí)現(xiàn)了自己的SystemInit()函數(shù)。該函數(shù)可以從合宙官方的SDK中獲取。

▼上下滾動(dòng),查看全部▼

C

voidSystemInit(void)

{

RCC_DeInit(); //復(fù)位RCC寄存器

RCC_HSEConfig(RCC_HSE_ON); //使能HSE

while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //等待HSE就緒

RCC_PLLCmd(DISABLE);//關(guān)閉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)時(shí)鐘

RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB時(shí)鐘

RCC_PCLK1Config(RCC_HCLK_Div2);//配置APB1時(shí)鐘

RCC_PCLK2Config(RCC_HCLK_Div1);//配置APB2時(shí)鐘

RCC_LSICmd(ENABLE); //使能內(nèi)部低速時(shí)鐘

while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET); //等待LSI就緒

RCC_HSICmd(ENABLE); //使能內(nèi)部高速時(shí)鐘

while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET); //等待HSI就緒

}

然后,將air.lib加入工程中,并自己定義AIR_RCC_PLLConfig()函數(shù)的原型與SystemCoreClock的值。

合宙Air32支持比STM32標(biāo)準(zhǔn)庫(kù)更高的RCC_PLLMul_xx值,因此還需要將air32f10x.h中新增的PLL值復(fù)制到自己的代碼中,這樣可以在使用熟悉的STM32標(biāo)準(zhǔn)庫(kù)的同時(shí),使用到Air32的增強(qiáng)功能。

▼上下滾動(dòng),查看全部▼

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新增的外設(shè)中斷,請(qǐng)自行更換STM32的啟動(dòng)文件到Air32的啟動(dòng)文件。

● Keil編譯器設(shè)置:

LVGL需要最低支持C99的編譯器才能正確編譯,因此需要開(kāi)啟Keil AC5的C99模式。同時(shí),為了減少生成固件的體積,建議選擇最高級(jí)別的-O3優(yōu)化。

2.3 組件庫(kù)的裁剪與優(yōu)化


由于芯片的RAM空間有限,因此需要對(duì)芯片的RAM空間進(jìn)行一定的規(guī)劃與優(yōu)化。程序中占用RAM較大的部分與相應(yīng)的規(guī)劃如下:

● 系統(tǒng)棧:

由于使用了FreeRTOS,各個(gè)Task有其自己的任務(wù)棧,因此系統(tǒng)棧只有ISR與main函數(shù)使用。

因此,在startup_stm32f10x_hd.s中將Stack_Size改為0x00000100,即256字節(jié)。

● 任務(wù)棧:

目前的代碼中只有三個(gè)Task,分別是LVGL Task LED Task與IDLE Task。

其中,LED Task與IDLE Task都非常簡(jiǎn)單,為它們?cè)O(shè)置128字節(jié)的任務(wù)棧;LVGL Task較為復(fù)雜,根據(jù)官方推薦的2-8K范圍,設(shè)置為4K。

● LVGL堆:

LVGL的所有句柄都是動(dòng)態(tài)內(nèi)存,因此其自己維護(hù)了一個(gè)堆空間。堆空間的大小可以在lv_conf.h中的LV_MEM_SIZE中修改,您可以根據(jù)自己使用的UI復(fù)雜度對(duì)其進(jìn)行修改。對(duì)于benchmark demo,12K即可滿足要求。

● LVGL緩沖區(qū):

LVGL需要將畫(huà)面渲染到緩沖區(qū)中,之后再刷新到屏幕上。本工程支持單緩沖與雙緩沖模式(可以在Keil的Target中選擇),單緩沖模式使用1個(gè)240x40像素的緩沖區(qū),雙緩沖模式則使用2個(gè)240x40像素的緩沖區(qū)。使用雙緩沖模式可以在DMA控制器向屏幕寫(xiě)入一個(gè)緩沖區(qū)的數(shù)據(jù)時(shí),CPU繼續(xù)渲染到另一個(gè)緩沖區(qū)中,提升渲染效率,但會(huì)占用雙倍的緩沖區(qū)。

同時(shí),由于芯片的ROM空間也有限,因此我裁剪了一些LVGL與FreeRTOS的功能。您可以在lv_conf.h與FreeRTOSConfig.h中自行開(kāi)關(guān)它們。benchmarkdemo中包含了大量的字體與圖像,因此導(dǎo)致最終編譯生成的bin文件較大。只使用FreeRTOS與LVGL內(nèi)核時(shí),ROM占用約120K。使用常用的控件后,還能剩余約100K空間給用戶開(kāi)發(fā)自己的應(yīng)用。

3

運(yùn)行效果及總結(jié)


接下來(lái)通過(guò)單緩沖模式及雙緩沖模式實(shí)測(cè)數(shù)據(jù),看看整體運(yùn)行效果如何:

3.1 單緩沖模式


單緩沖模式的存儲(chǔ)空間占用情況如下:

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é)果:

1f2e5322-2560-11ed-9ade-dac502259ad0.jpg

3.2雙緩沖模式


雙緩沖模式的存儲(chǔ)空間占用情況如下:

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é)果:

1f3fa1c2-2560-11ed-9ade-dac502259ad0.jpg

可以看出,單緩沖模式相比雙緩沖模式節(jié)約了大量的RAM,幀數(shù)卻只下降了25%,因此單緩沖模式更具有實(shí)用意義。這主要是因?yàn)?,在?fù)雜UI界面下,瓶頸主要在CPU的運(yùn)算速度上,而不是向屏幕寫(xiě)入緩沖區(qū)的IO操作上。

● 實(shí)測(cè)總結(jié):

5元錢(qián)的Air32F103CCT6確實(shí)具有了流暢運(yùn)行LVGL的能力,并且還有100K左右的ROM和超過(guò)20K的RAM空間可用,這使得在Air32F103上使用LVGL+FreeRTOS的同時(shí)開(kāi)發(fā)復(fù)雜的用戶程序成為了可能,我們又多了一個(gè)高性價(jià)比的國(guó)產(chǎn)MCU選擇。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6040

    文章

    44592

    瀏覽量

    636891
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    什么原因會(huì)導(dǎo)致單片機(jī)程序

    ______________________________________ 什么原因會(huì)導(dǎo)致單片機(jī)程序
    發(fā)表于 10-16 22:31

    國(guó)產(chǎn)8位單片機(jī)在國(guó)內(nèi)的應(yīng)用情況及發(fā)展趨勢(shì)!

    隨著科技的迅速發(fā)展,單片機(jī)作為電子產(chǎn)品的核心控制器,其應(yīng)用領(lǐng)域不斷擴(kuò)大。特別是國(guó)產(chǎn)8位單片機(jī),因其低成本、易編程及良好的兼容性,越來(lái)越受到國(guó)內(nèi)電子產(chǎn)品開(kāi)發(fā)者和企業(yè)的青睞。英銳恩科技的小篇將跟大家
    發(fā)表于 09-26 16:09

    英銳恩科技,以實(shí)力打造國(guó)產(chǎn)單片機(jī)替代品牌!

    長(zhǎng)久以來(lái),國(guó)際品牌在單片機(jī)市場(chǎng)占據(jù)主導(dǎo)地位,幾乎被國(guó)外龍頭企業(yè)所壟斷,但在“中國(guó)芯”替代和全球不太穩(wěn)定的市場(chǎng)環(huán)境下,國(guó)內(nèi)單片機(jī)研發(fā)技術(shù)日漸成熟,單片機(jī)國(guó)產(chǎn)替代力量的崛起正成為不可忽視的
    發(fā)表于 09-25 09:49

    freertos最多支持多少個(gè)任務(wù)

    FreeRTOS是一個(gè)輕量級(jí)的實(shí)時(shí)操作系統(tǒng)(RTOS),其設(shè)計(jì)初衷就是為了提供簡(jiǎn)單、可靠且高效的實(shí)時(shí)任務(wù)管理。關(guān)于FreeRTOS最多支持多少個(gè)任務(wù)的問(wèn)題,實(shí)際上并沒(méi)有一
    的頭像 發(fā)表于 09-02 14:21 ?1071次閱讀

    lvgl移植到RT-Thread Nano后進(jìn)入硬件錯(cuò)誤中斷的原因?

    使用的是RT-Thread Nano的最新版,第一次移植,不知道是不是因?yàn)檫@個(gè)lvgl只能移植到標(biāo)準(zhǔn)版里? 嘗試過(guò)給lvgl的線程分配更大的棧,但是依舊會(huì)卡死在硬件錯(cuò)誤中斷里。但只要把
    發(fā)表于 07-04 07:40

    個(gè)暑假如何學(xué)習(xí)單片機(jī)

    個(gè)暑假是學(xué)習(xí)和掌握單片機(jī)基礎(chǔ)知識(shí)的良好時(shí)機(jī)。以下是一個(gè)關(guān)于如何在暑假期間學(xué)習(xí)單片機(jī)的建議計(jì)劃
    的頭像 發(fā)表于 07-03 09:19 ?549次閱讀
    一<b class='flag-5'>個(gè)</b>暑假如何學(xué)習(xí)<b class='flag-5'>單片機(jī)</b>

    第四講:單片機(jī)STC89C52+RA8889驅(qū)動(dòng)控制彩屏 代碼移植范例(包含API接口)

    51單片機(jī)通過(guò)RA8889控制驅(qū)動(dòng)彩屏,移植API參考程序
    的頭像 發(fā)表于 06-06 13:59 ?1501次閱讀
    第四講:<b class='flag-5'>單片機(jī)</b>STC89C52+RA8889驅(qū)動(dòng)控制彩屏 代碼<b class='flag-5'>移植</b>范例(包含API接口)

    ESP32S3 + LVGL遇到LoadProhibited問(wèn)題如何解決?

    lv_demo_widgets時(shí)遇到 Guru Meditation Error: Core0 panic'ed (LoadProhibited). Exception
    發(fā)表于 06-06 07:30

    第二講:單片機(jī)STC89C52+RA8889驅(qū)動(dòng)控制彩屏 代碼移植介紹

    介紹51單片機(jī)如何移植RA8889的代碼進(jìn)行彩屏驅(qū)動(dòng)與控制
    的頭像 發(fā)表于 06-04 10:36 ?1042次閱讀
    第二講:<b class='flag-5'>單片機(jī)</b>STC89C52+RA8889驅(qū)動(dòng)控制彩屏 代碼<b class='flag-5'>移植</b>介紹

    理解嵌入式和單片機(jī)的區(qū)別

    從上世紀(jì)80年代,由當(dāng)時(shí)的4位、8位單片機(jī),發(fā)展到現(xiàn)在的300M的高速單片機(jī)。比如經(jīng)典的51系列單片機(jī),外觀只是一個(gè)拇指大小的長(zhǎng)方體芯片
    發(fā)表于 05-03 10:30 ?4548次閱讀

    單片機(jī)Freertos怎么樣?

    單片機(jī)Freertos移植么?參考資料好不好找?
    發(fā)表于 03-25 15:22

    RISC-V單片機(jī)實(shí)時(shí)系統(tǒng),哪個(gè)最合適?

    了解了幾個(gè)單片機(jī)實(shí)時(shí)系統(tǒng):Freertos,Ucos,RT-thread等,哪個(gè)最適合呢?
    發(fā)表于 03-24 07:02

    使用freertos系統(tǒng),單片機(jī)是stm32wb55,進(jìn)入stop模式后定時(shí)喚醒出現(xiàn)死機(jī)異常怎么解決?

    使用freertos系統(tǒng),單片機(jī)是stm32wb55,進(jìn)入stop模式后,通過(guò)定時(shí)器每隔1鐘自動(dòng)喚醒一次。HW_TS_Create 創(chuàng)建定時(shí)器,HW_TS_Start啟動(dòng)定時(shí), 最后在定時(shí)器處理
    發(fā)表于 03-15 07:19

    AURIX2G系列的單片機(jī)多核程序應(yīng)該怎么配置?

    AURIX2G系列的單片機(jī)多核程序應(yīng)該怎么配置,感覺(jué)沒(méi)有頭緒
    發(fā)表于 02-20 06:15

    基于FreeRTOS+LVGL V8智能家居儀表盤(pán)設(shè)計(jì)

    用野火啟明6M5開(kāi)發(fā)板制作了一個(gè)基于 FreeRTOSLVGL V8 的智能家居儀表盤(pán),顏值較高,也可以作為桌面擺件使用
    的頭像 發(fā)表于 01-22 14:10 ?5232次閱讀
    基于<b class='flag-5'>FreeRTOS+LVGL</b> V8智能家居儀表盤(pán)設(shè)計(jì)