關于LVGL在Clion中的移植使用

? ?Clion是良好的編譯器而LVGL是良好的圖形化庫,二者的有機結合可以實現(xiàn)更好的實現(xiàn)效果和編輯效果。
? 首先移植我們相應的LVGL源代碼這個過程就是上github拉代碼的過程,非常簡單我們就按下不表了。
? 在拉取代碼之后就是對于代碼的一些不必要的部分,這部分也與網(wǎng)上的那些MDK的移植相同。
? 然后后面就是進行LVGL的移植,將文件直接引入之后進行Cmake的編寫。文件結構如下圖1。

? 然后就是Cmake.txt的編寫。主要就是:include_directories和file里面的文件改寫。

include_directories(Core/Inc Drivers/STM32L4xx_HAL_Driver/Inc Drivers/STM32L4xx_HAL_Driver/Inc/Legacy Drivers/CMSIS/Device/ST/STM32L4xx/Include Drivers/CMSIS/Include lvgl TIMER myGui LCD KEY generated custom generated LED AHT10 MYIIC ADC)
add_definitions(-DUSE_HAL_DRIVER -DSTM32L475xx)
file(GLOB_RECURSE SOURCES "startup/*.*" "Drivers/*.*" "Core/*.*" "lvgl/*.*" "LCD/*.*" "TIMER/*.*" "KEY/*.*" "myGui/*.*" "generated/*.*" "custom/*.*" "LED/*.*" "AHT10/*.*" "MYIIC/*.*" "ADC/*.*")

然后重啟Cmake應該就能編譯通過。
編譯通過之后的操作
? 編譯通過之后就是進行LVGL的相關配置的問題:

時鐘心跳的配置:引入定時器中斷作為LVGL的時鐘心跳(因為定時器中斷的速度更快,避免占用CPU的資源),在定時器中斷函數(shù)中將LVGL的時鐘心跳函數(shù)放入其中并且設置每ms進行采樣。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
? ?if(htim == (&TIM3_Handler))
? ?{
? ? ?// ?LED_B_TogglePin; ? ? ? ?//LED_B翻轉
? ? ?lv_tick_inc(1);
? ?}
}

2.進行LVGL的顯示設置:在lvgl中有一個文件lv_port_disp.c在該文件中進行下面的操作在 disp_flush函數(shù)中進行相關填充函數(shù)的配置。
首先在其頭部引入頭文件
#include"lcd.h"
在disp_init函數(shù)中寫入LCD_Init();進行相關的初始化。
LCD_ColorFill(area->x1,area->y1,area->x2+1,area->y2+1,(uint16_t*)color_p);
因為正點原子官方歷程有一點問題這個函數(shù)就是自己重寫的函數(shù)
void LCD_ColorFill(uint16_t xsta, uint16_t ysta, uint16_t xend, uint16_t yend, const uint16_t* color)
{
? ?uint16_t i, j;
? ?LCD_Address_Set(xsta, ysta, xend - 1, yend - 1); // 設置顯示范圍
? ?for (i = ysta; i < yend; i++)
? ?{
? ? ? ?for (j = xsta; j < xend; j++)
? ? ? ?{
? ? ? ? ? ?LCD_Write_HalfWord(*color++);
? ? ? ?}
? ?}
}
這就進行了函數(shù)的的顯示。(但是刷新速度很慢建議還是使用DMA提速)

3.進行輸入設備的配置:lv_port_indev.c中進行相關的配置。
LVGL給你提供了多種的輸入模式。有鼠標,按鍵,觸摸屏,鍵盤,還有ecode。
我們此處就是用按鍵代替矩陣鍵盤作為相關的輸入設備。
首先是在文件頭部引入頭文件keypad_init中進行按鍵的初始化KEY_Init();
然后在keypad_get_key函數(shù)中返回相應的值LVGL是使用相應的值進行判斷的
return KEY_Scan(1);//此處是返回按鍵的值
然后在keypad_read函數(shù)中進行相應的值的判斷并且與LVGL的值相綁定。
? ? ? ?switch(act_key) {
? ? ? ? ? ?case KEY0_PRES:
? ? ? ? ? ? ? ?act_key = LV_KEY_NEXT; /*專注于下一個對象*/
? ? ? ? ? ? ? ?break;
? ? ? ? ? ?case KEY1_PRES:
? ? ? ? ? ? ? ?act_key = LV_KEY_PREV;/*專注于上一個對象*/
? ? ? ? ? ? ? ?break;
? ? ? ? ? ?case KEY2_PRES :
? ? ? ? ? ? ? ?act_key = LV_KEY_ENTER;/*確認*/
? ? ? ? ? ? ? ?break;
? ? ? ?}
? ? ? ?last_key = act_key;
? ?}
? ?else {
? ? ? ?data->state = LV_INDEV_STATE_REL;
? ?}
? ?data->key = last_key;
}
完成了這些你就可以在主函數(shù)中嘗試使用。
我們在靜態(tài)區(qū)域?qū)⑺鼈兊某跏蓟M行封裝
static void lvgl_init( void )
{
? ?lv_init();
? ?lv_port_disp_init();
? ?lv_port_indev_init();
? ?mygui();
? ?// lv_port_fs_init();
}
然后在main函數(shù)中進行調(diào)用
lvgl_init();
在while(1)中還要進行相應的lv_task_handler();
最后就能實現(xiàn)相應的效果剩下的就是你進行相應的LVGL的相關效果描寫了然后就需要你自己進行相應的LVGL函數(shù)的學習。
可以參考的我的文件:https://github.com/hzhhistory/LVGL_stm32.git