国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32F4+FreeRTOS+LVGL實現(xiàn)嵌入式快速開發(fā)(縫合怪)

這篇具有很好參考價值的文章主要介紹了STM32F4+FreeRTOS+LVGL實現(xiàn)嵌入式快速開發(fā)(縫合怪)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

極速進行項目開發(fā),只需要懂一款芯片架構(gòu)+一個操作系統(tǒng)+一個GUI。各種部件程序全靠抄

STM32F4+FreeRTOS+LVGL實現(xiàn)嵌入式快速開發(fā)(縫合怪)

,成為究極縫合怪。本文用stm32f407+FreeRTOS+lvgl演示一些demo。

原文鏈接:STM32F4+FreeRTOS+LVGL實現(xiàn)快速開發(fā)(縫合怪)

lvgl官方的音樂播放器demo:

STM32F4+FreeRTOS+LVGL實現(xiàn)嵌入式快速開發(fā)(縫合怪)

百問網(wǎng)的2048小游戲:

STM32F4+FreeRTOS+LVGL實現(xiàn)嵌入式快速開發(fā)(縫合怪)

1.STM32F407和FreeRTOS

STM32F407這款芯片就不多介紹了,挺老的MCU,架構(gòu)為ARM_CM4F。隨便一搜就有非常非常多的例程和項目。

會縫合的基礎(chǔ)是對芯片架構(gòu)非常了解,剛?cè)腴T的同學(xué)建議先從基礎(chǔ)學(xué)起,推薦學(xué)習(xí)ARM官方的權(quán)威指南。

在家中找到一個早之前的開發(fā)板,個人還挺喜歡的,只有最小系統(tǒng),把pin引出來了,沒有亂七八糟的外設(shè),還找到一個240*320的LCD屏幕,ILI9341驅(qū)動。

STM32F4+FreeRTOS+LVGL實現(xiàn)嵌入式快速開發(fā)(縫合怪)

至于FreeRTOS,之前講了FreeRTOS在STM32F4上的移植:STM32F4移植FreeRTOS光是MCU加上FreeRTOS就已經(jīng)能做很多東西了,github上也有非常多的項目,直接git clone再隨便改改就能做出很多東西。

FreeRTOS的系列講解:FreeRTOS全解析-1.引入與RTOS簡介

2.LVGL和FreeRTOS結(jié)合

都有顯示屏了,當然得顯示一下,增加一下逼格,但是自己畫肯定不好看,也也沒有那個必要,這就需要借助開源圖形庫了。

嵌入式GUI有非常多,LVGL是其中之一,很低的配置就可以實現(xiàn)非常好的效果。介紹就沒必要了,就是一個C語言寫的圖形庫,需要學(xué)習(xí)的可以去官網(wǎng):https://lvgl.io/看手冊。

官網(wǎng)的一個demo:

STM32F4+FreeRTOS+LVGL實現(xiàn)嵌入式快速開發(fā)(縫合怪)

我對LVGL了解不多,但通過手冊可以知道,LVGL的底層是通過定時器來循環(huán)調(diào)用lv_tick_inc();函數(shù),以獲知系統(tǒng)時間,稱為LVGL的心跳。再通過lv_task_handler();(新版的是lv_timer_handler())來調(diào)度LVGL的各種任務(wù),包括顯示、輸入,各種事件。搞明白這個,我們就可以非常容易得將他與FreeRTOS結(jié)合了。

2.1下載LVGL源碼,并加入keil工程

去官網(wǎng)找到源碼,找個需要的版本,我這里用git下了lvgl8.0。

只需要如下幾個東西

STM32F4+FreeRTOS+LVGL實現(xiàn)嵌入式快速開發(fā)(縫合怪)

?

把lv_conf_template.h的文件名改成lv_conf.h。這是官方提供的配置樣板,我們要改成適合自己的。開頭的if 0改成1,使它生效。

#if 1 /*Set it to "1" to enable content*/

顯示屏的顏色,我的是16位的

/*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/#define LV_COLOR_DEPTH     16

顯示和輸入(觸屏、按鈕等)的周期,按需要改。顯示周期20ms就是50幀。

/*Default display refresh period. LVG will redraw changed ares with this period time*/#define LV_DISP_DEF_REFR_PERIOD     20      /*[ms]*/?/*Input device read period in milliseconds*/#define?LV_INDEV_DEF_READ_PERIOD????30??????/*[ms]*/

內(nèi)存和CPU監(jiān)控開一下,方便看效果,就是我上面demo中左下角和右下角的顯示。

/*1: Show CPU usage and FPS count in the right bottom corner*/#define LV_USE_PERF_MONITOR     1?/*1: Show the used memory and the memory fragmentation  in the left bottom corner * Requires LV_MEM_CUSTOM = 0*/#define?LV_USE_MEM_MONITOR??????1

examples文件夾中只需要porting文件夾。

STM32F4+FreeRTOS+LVGL實現(xiàn)嵌入式快速開發(fā)(縫合怪)

里面的文件名中的template,全部刪掉。

STM32F4+FreeRTOS+LVGL實現(xiàn)嵌入式快速開發(fā)(縫合怪)

以STM32F4移植FreeRTOS中的已經(jīng)移植好FreeRTOS的keil工程為模板

新建文件夾

STM32F4+FreeRTOS+LVGL實現(xiàn)嵌入式快速開發(fā)(縫合怪)

LVGL放入src文件,LVGL_PORT放入porting中的文件,LVGL_APP放入example中隨便復(fù)制的demo

然后在keil中把所有.c文件添加進去,這個過程就比較麻煩,要,需要一個個點。

STM32F4+FreeRTOS+LVGL實現(xiàn)嵌入式快速開發(fā)(縫合怪)

2.2調(diào)整顯示接口

lv_port_disp.c為lvgl的顯示接口第一步就是把它和lv_port_disp.h頭文件中的第一行if 0改為1,使他們生效。

lv_port_disp.h文件中添加兩行,表示我LCD的分辨率為240*320

#define MY_DISP_HOR_RES 240#define MY_DISP_VER_RES 320

lv_port_disp.c中初始化函數(shù)disp_init中,加上自己的LCD初始化函數(shù)。

static void disp_init(void){    /*You code here*/      LCD_Init();}

刷屏函數(shù)中加上自己的畫點函數(shù),官方中的例子是這樣的

static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p){????int32_t?x;????int32_t?y;????for(y?=?area->y1;?y?<=?area->y2;?y++)?{????????for(x?=?area->x1;?x?<=?area->x2;?x++)?{????????????/*Put?a?pixel?to?the?display.?For?example:*/???????????/*put_px(x,?y,?*color_p)*/?????????????color_p++;????????}????}    lv_disp_flush_ready(disp_drv);}

/*put_px(x,?y,?*color_p)*/改成你LCD的畫點函數(shù),不過這樣很慢,推薦直接使用區(qū)域繪制

static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p){??  LCD_Color_Fill(area->x1,area->y1,area->x2,area->y2,(u16*)color_p);????lv_disp_flush_ready(disp_drv);}

這樣會更快。

我的LCD用FSMC,速度已經(jīng)夠快了,但是我想更快一點,就用DMA(提升不會特別大)。在這個函數(shù)中只放一個DMA傳輸函數(shù)。

static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p){??LCD_Start_DMA_Transfer(area->x1,area->y1,area->x2,area->y2,(u16*)color_p);}

在DMA完成中斷函數(shù)中通知LVGL

void DMA2_Stream3_IRQHandler(void){  if(DMA_GetITStatus(LCD_DMA_Stream,LCD_DMA_IT_TCIFx)!=RESET)  {???    DMA_ClearITPendingBit(LCD_DMA_Stream,LCD_DMA_IT_TCIFx);???????lv_disp_flush_ready(&disp_drv);?  }}

然后就是為LVGL選擇一種顯存,在這個函數(shù):

void lv_port_disp_init(void)

中,提供了三種顯存方案,第一種是十行,第二種是雙十行顯存,第三種是雙全屏顯存,stm32f407sram只有192k,開不了全屏顯存。我選擇第二種,雙顯存,因為我開啟了DMA,傳輸?shù)臅r候CPU可以去計算,并存入第二塊顯存。用不到的代碼注釋掉就行。如下:

    /* Example for 1) *///    static lv_disp_draw_buf_t draw_buf_dsc_1;//????static?lv_color_t?buf_1[MY_DISP_HOR_RES?*?10];??????????????????????????/*A?buffer?for?10?rows*///????lv_disp_draw_buf_init(&draw_buf_dsc_1,?buf_1,?NULL,?MY_DISP_HOR_RES?*?10);???/*Initialize?the?display?buffer*/?    /* Example for 2) */    static lv_disp_draw_buf_t draw_buf_dsc_1;    static lv_color_t buf_2_1[MY_DISP_HOR_RES * 80];                        /*A buffer for 10 rows*/    static lv_color_t buf_2_2[MY_DISP_HOR_RES * 80];                        /*An other buffer for 10 rows*/    lv_disp_draw_buf_init(&draw_buf_dsc_1, buf_2_1, buf_2_2, MY_DISP_HOR_RES * 80);   /*Initialize the display buffer*/?//    /* Example for 3) also set disp_drv.full_refresh = 1 below*///    static lv_disp_draw_buf_t draw_buf_dsc_3;//    static lv_color_t buf_3_1[MY_DISP_HOR_RES * MY_DISP_VER_RES];            /*A screen sized buffer*///    static lv_color_t buf_3_1[MY_DISP_HOR_RES * MY_DISP_VER_RES];            /*An other screen sized buffer*///    lv_disp_draw_buf_init(&draw_buf_dsc_3, buf_3_1, buf_3_2, MY_DISP_VER_RES * LV_VER_RES_MAX);   /*Initialize the display buffer*/

同時,比較舊的lvgl在這個函數(shù)中,還需要注冊一下,新的不用

????/*Set?up?the?functions?to?access?to?your?display*/    /*Set the resolution of the display*/    disp_drv.hor_res = MY_DISP_HOR_RES;    disp_drv.ver_res = MY_DISP_VER_RES;

其實就是加上分辨率。

2.3調(diào)整輸入接口

lv_port_indev.c為lvgl的顯示接口第一步就是把它和lv_port_indev.h頭文件中的第一行if 0改為1,使他們生效。

lvgl支持觸摸屏,按鍵,編碼器等輸入,我用觸摸屏,只需要修改touchpad相關(guān)

static void touchpad_init(void){???/*Your?code?comes?here*/  tp_dev.init();}/*Return true is the touchpad is pressed*/static bool touchpad_is_pressed(void){????tp_dev.scan(0);    if(tp_dev.sta&TP_PRES_DOWN)??????return?true;    return false;}?/*Get the x and y coordinates if the touchpad is pressed*/static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y){?    (*x) = tp_dev.x[0];    (*y) = tp_dev.y[0];}

分別是初始化、掃描確實是否有按下,和獲取按下的點的值。

我的觸摸屏是電阻屏,驅(qū)動從正點原子的觸摸屏實驗例程中來,該驅(qū)動中用到了SysTick定時器來延時微秒,我們的工程是含有FreeRTOS的,會造成沖突,我也懶得優(yōu)化細改了,用了個比較粗糙簡單的方法,直接在延時前把幾個寄存器保存一下,延時后再恢復(fù)。

void delay_us(u32 nus){      u32 temp;    u32  tickload = SysTick->LOAD;  u32  tickval = SysTick->VAL;  u32  tickctrl = SysTick->CTRL;    SysTick->LOAD=nus*fac_us;         //ê±???ó??           SysTick->VAL=0x00;                //??????êy?÷  SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //?aê?μ1êy      do  {    temp=SysTick->CTRL;  }while((temp&0x01)&&!(temp&(1<<16)));  //μè′yê±??μ?′?     SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //1?±???êy?÷  SysTick->VAL =0X00;               //??????êy?÷     SysTick->LOAD  = tickload;  SysTick->VAL  = tickval;  SysTick->CTRL  = tickctrl;}

讀數(shù)據(jù)TP_Read_AD中加入臨界區(qū)保護,就可以完美使用。

u16 TP_Read_AD(u8 CMD)    {????  taskENTER_CRITICAL();??taskEXIT_CRITICAL();?????  return(Num);   }

2.4main函數(shù)

開頭說了,將LVGL與FreeRTOS結(jié)合的重點其實就是再講lv_tick_inc()和lv_task_handler()兩個函數(shù)與FreeRTOS結(jié)合起來。

FreeRTOS也有心跳Tick,我們在FreeRTOS的FreeRTOSConfig.h中開啟TICK鉤子:

#define configUSE_TICK_HOOK        1

每次FreeRTOS發(fā)生tick都會去調(diào)用鉤子函數(shù),在鉤子函數(shù)中放入LVGL的心跳就可以了:

void vApplicationTickHook(void){  lv_tick_inc(1);}

數(shù)字1的意思是告訴LVGL每1ms執(zhí)行一次。

至于lv_task_handler(),我們開一個任務(wù)去執(zhí)行它

因為LVGL線程不安全,所以調(diào)用到LVGL的API時需要加互斥鎖。

主函數(shù):

??MutexSemaphore=xSemaphoreCreateMutex();?  xTaskCreate(lvgl_handler, "lvgl_handler", 1000, NULL, 4, NULL);

任務(wù):

static void lvgl_handler( void *pvParameters ){  for( ;; )  {        xSemaphoreTake(MutexSemaphore,portMAX_DELAY);      lv_task_handler();    xSemaphoreGive(MutexSemaphore); //    vTaskDelay(pdMS_TO_TICKS(20));  }}

到這了就是完全移植成功了。

現(xiàn)在你需要的就是個應(yīng)用代碼,github上有特別多的LVGL相關(guān)例子,官方也有很多,隨便一抄,稍微修改,就可以完成一個小項目,這就是縫合的威力。

lvgl官方的壓力測試demo:

STM32F4+FreeRTOS+LVGL實現(xiàn)嵌入式快速開發(fā)(縫合怪)

STM32F4+FreeRTOS+LVGL實現(xiàn)快速開發(fā)(縫合怪)文章來源地址http://www.zghlxwxcb.cn/news/detail-472519.html

到了這里,關(guān)于STM32F4+FreeRTOS+LVGL實現(xiàn)嵌入式快速開發(fā)(縫合怪)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 嵌入式-stm32-用PWM點亮LED實現(xiàn)呼吸燈

    嵌入式-stm32-用PWM點亮LED實現(xiàn)呼吸燈

    答:LED需要低電平才能亮,高電平是燈滅。 答:這是用到不同占空比來實現(xiàn)的,控制LED實現(xiàn)呼吸燈,就是通過占空比的高低電平和其持續(xù)時間來實現(xiàn)。 ①例如,要定時500ms,則:PSC=7199,ARR=4999,Tclk=72Mhz。 ②假如頻率為 2kHz ,則:PSC=71,ARR=499, 頻率和周期是描述波形的兩個基

    2024年02月03日
    瀏覽(23)
  • 嵌入式編程實踐——怎么用STM32實現(xiàn)LLC電路控制(附代碼示例)?

    STM32是意法半導(dǎo)體(STMicroelectronics)推出的一系列32位ARM Cortex-M微控制器產(chǎn)品線。它們廣泛應(yīng)用于嵌入式系統(tǒng)中,包括工業(yè)控制、汽車電子、智能家居、醫(yī)療設(shè)備等領(lǐng)域。STM32系列微控制器具有高性能、低功耗、豐富的外設(shè)接口和強大的開發(fā)生態(tài)系統(tǒng)等特點。LLC電路控制是一項

    2024年04月16日
    瀏覽(72)
  • stm32畢設(shè)分享 單片機自動寫字機器人設(shè)計與實現(xiàn) - 物聯(lián)網(wǎng) 嵌入式 stm32

    stm32畢設(shè)分享 單片機自動寫字機器人設(shè)計與實現(xiàn) - 物聯(lián)網(wǎng) 嵌入式 stm32

    ?? 這兩年開始畢業(yè)設(shè)計和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點,往往達不到畢業(yè)答辯的要求,這兩年不斷有學(xué)弟學(xué)妹告訴學(xué)長自己做的項目系統(tǒng)達不到老師的要求。 為了大家能夠順利以及最少的精力通過畢設(shè),學(xué)長分享優(yōu)質(zhì)畢業(yè)設(shè)計項目,今天

    2024年01月21日
    瀏覽(106)
  • 物聯(lián)網(wǎng)項目分享 stm32實現(xiàn)車牌識別系統(tǒng) -物聯(lián)網(wǎng) 嵌入式 單片機

    物聯(lián)網(wǎng)項目分享 stm32實現(xiàn)車牌識別系統(tǒng) -物聯(lián)網(wǎng) 嵌入式 單片機

    ?? 這兩年開始畢業(yè)設(shè)計和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點,往往達不到畢業(yè)答辯的要求,這兩年不斷有學(xué)弟學(xué)妹告訴學(xué)長自己做的項目系統(tǒng)達不到老師的要求。 為了大家能夠順利以及最少的精力通過畢設(shè),學(xué)長分享優(yōu)質(zhì)畢業(yè)設(shè)計項目,今天

    2024年02月21日
    瀏覽(88)
  • 【嵌入式開發(fā)工具】STM32+Keil實現(xiàn)軟件工程搭建與開發(fā)調(diào)試

    【嵌入式開發(fā)工具】STM32+Keil實現(xiàn)軟件工程搭建與開發(fā)調(diào)試

    本篇文章介紹了使用Keil來對STM32F103C8芯片進行初始工程搭建,以及開發(fā)與工程調(diào)試的完整過程,幫助讀者能夠在實戰(zhàn)中體會到Keil這個開發(fā)環(huán)境的使用方法,了解一個嵌入式工程從無到有的過程,并且具備快速搭建一個全新芯片對應(yīng)最小軟件工程的基本能力思路。文章首先介紹

    2024年02月05日
    瀏覽(95)
  • 單片機畢業(yè)設(shè)計 stm32智能溫控風扇設(shè)計與實現(xiàn) - 嵌入式 物聯(lián)網(wǎng)

    單片機畢業(yè)設(shè)計 stm32智能溫控風扇設(shè)計與實現(xiàn) - 嵌入式 物聯(lián)網(wǎng)

    Hi,大家好,學(xué)長今天向大家介紹一個 單片機項目 基于stm32的智能溫控風扇設(shè)計與實現(xiàn) 大家可用于 課程設(shè)計 或 畢業(yè)設(shè)計 隨著科技的日新月異,智能家居逐漸走入普通家庭,風扇作為基本的家用電器也將成為智能家居的一部分。這里介紹的是以STM32單片機為控制單元并結(jié)合嵌

    2024年02月09日
    瀏覽(95)
  • 畢業(yè)設(shè)計 - 基于STM32的智能路燈設(shè)計與實現(xiàn) - 物聯(lián)網(wǎng) 嵌入式 單片機

    畢業(yè)設(shè)計 - 基于STM32的智能路燈設(shè)計與實現(xiàn) - 物聯(lián)網(wǎng) 嵌入式 單片機

    Hi,大家好,今天向大家介紹一個 單片機項目 基于STM32的智能路燈設(shè)計與實現(xiàn) 大家可用于 課程設(shè)計 或 畢業(yè)設(shè)計 ?? 項目分享與指導(dǎo): https://gitee.com/sinonfin/sharing 每當夜幕降臨,城市中各種各樣、色彩繽紛的路燈亮起,為城市披上了一層絢麗的外衣。但在這絢麗的外表下則隱

    2024年02月05日
    瀏覽(99)
  • 【畢業(yè)設(shè)計】基于STM32的智能路燈設(shè)計與實現(xiàn) - 物聯(lián)網(wǎng) 嵌入式 單片機

    【畢業(yè)設(shè)計】基于STM32的智能路燈設(shè)計與實現(xiàn) - 物聯(lián)網(wǎng) 嵌入式 單片機

    Hi,大家好,這里是丹成學(xué)長,今天向大家介紹一個 單片機項目 基于STM32的智能路燈設(shè)計與實現(xiàn) 大家可用于 課程設(shè)計 或 畢業(yè)設(shè)計 單片機-嵌入式畢設(shè)選題大全及項目分享: https://blog.csdn.net/m0_71572576/article/details/125409052 每當夜幕降臨,城市中各種各樣、色彩繽紛的路燈亮起,

    2024年01月16日
    瀏覽(84)
  • 單片機畢業(yè)設(shè)計 stm32智能電子秤系統(tǒng)設(shè)計與實現(xiàn) - 物聯(lián)網(wǎng) 嵌入式

    單片機畢業(yè)設(shè)計 stm32智能電子秤系統(tǒng)設(shè)計與實現(xiàn) - 物聯(lián)網(wǎng) 嵌入式

    ?? 這兩年開始畢業(yè)設(shè)計和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點,往往達不到畢業(yè)答辯的要求,這兩年不斷有學(xué)弟學(xué)妹告訴學(xué)長自己做的項目系統(tǒng)達不到老師的要求。 為了大家能夠順利以及最少的精力通過畢設(shè),學(xué)長分享優(yōu)質(zhì)畢業(yè)設(shè)計項目,今天

    2024年02月06日
    瀏覽(83)
  • 【藍橋杯嵌入式】點亮LED燈,流水燈的原理圖解析與代碼實現(xiàn)——STM32

    【藍橋杯嵌入式】點亮LED燈,流水燈的原理圖解析與代碼實現(xiàn)——STM32

    ??【藍橋杯嵌入式】專題正在持續(xù)更新中,原理圖解析?,各模塊分析?以及歷年真題講解?都在這兒哦,歡迎大家前往訂閱本專題,獲取更多詳細信息哦?????? ??本系列專欄 -??藍橋杯嵌入式_勾欄聽曲_0的博客 ??歡迎大家? ??? 點贊??? 評論??? 收藏?? ??個人主

    2024年02月03日
    瀏覽(45)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包