littleVGL移植处理
软件开发环境:KEIL 5
目标设备型号:STM32F103ZE
ST公司函数库:HAL库
littleVGL会占用至少占用64KB ROM和16KB RAM,如果要完全使用要保证有180KB的ROM空间
一、进行初步移植工程文件
官方网站上的说明:
1、首先复制lvgl的文件夹放入工程文件当中。
2、复制 “lvgl/lv_conf_templ.h ”更改名为“ lv_conf.h”,然后进去文件里面讲 #if 0 编译条件改成 #if 1,最后设置“LV_HOR_RES_MAX”水平分辨率和“LV_VER_RES_MAX”垂直分辨率,以及 LV_COLOR_DEPTH颜色深度。
3、源文件中包含 lvgl.h 可以使用 LVGL 相关功能函数。
4、设置好工程文件中的头文件引用路径
二、添加软件设置
1、工程文件中勾选"C99 Mode",并且添加定义LV_CONF_INCLUDE_SIMPLE,如下图所示
注意:不勾选时,编译会出现大量错误,如果出现警告可以不必理,也可以添加忽略警告的编译处理
2、图形库设置时钟,此处使用TIM6设置定时器更新中断,给图形库产生一个滴答时钟,也可以用其他滴答时钟。
下面是TIM6初始化的代码:
#include "tim.h"
#include "lvgl.h"
TIM_HandleTypeDef htim6;
/*---------------------------------------------
函数功能:定时器初始化
---------------------------------------------*/
void MX_TIM6_Init(void)
{
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim6.Instance = TIM6; //TIM6
htim6.Init.Prescaler = 9; //分频系数9
htim6.Init.CounterMode = TIM_COUNTERMODE_UP; //向上计数
htim6.Init.Period = 65535 - 20000; //向上计数35535次
htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; //重装载计数值
if (HAL_TIM_Base_Init(&htim6) != HAL_OK) //初始化定时器
while(1);
//更新中断设置
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; //
if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK) //配置TIM6s中断
while(1);
HAL_TIM_Base_Start_IT(&htim6);
}
/*---------------------------------------------
函数功能:TIM6底层驱动
---------------------------------------------*/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance==TIM6){
//启动TIM6时钟
__HAL_RCC_TIM6_CLK_ENABLE();
//TIM6定时器初始化
HAL_NVIC_SetPriority(TIM6_IRQn, 1, 0); //设置优先级
HAL_NVIC_EnableIRQ(TIM6_IRQn); //设置中断号
}
}
/*---------------------------------------------
函数功能:TIM6底层驱动
---------------------------------------------*/
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance==TIM6)
{
//TIM6时钟关闭
__HAL_RCC_TIM6_CLK_DISABLE();
//TIM6取消中断号
HAL_NVIC_DisableIRQ(TIM6_IRQn);
}
}
/*---------------------------------------------
函数功能:TIM6更新中断处理
---------------------------------------------*/
void TIM6_IRQHandler(void)
{
if(__HAL_TIM_GET_FLAG(&htim6,TIM_FLAG_UPDATE)!=RESET)
{
__HAL_TIM_CLEAR_FLAG(&htim6,TIM_FLAG_UPDATE); //清除中断标志位
lv_tick_inc(1); //littleVGL库时钟跳动
}
}
三、驱动程序编写
驱动代码,其中color_p->full代表RGB565组成16位色。
/*----------------------------------------------------
驱动函数
----------------------------------------------------*/
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++)
{
LCD_SetCursor(area->x1,y); //设置光标位置
LCD_WriteRAM_Prepare(); //准备写GRAM
for(x = area->x1; x <= area->x2; x++) //连续写入颜色
{
LCD->LCD_RAM=color_p->full; //写颜色
color_p++;
}
}
/* Inform the graphics library that you are ready with the flushing*/
lv_disp_flush_ready(disp_drv);
}
实际效果,弄了一个进度条刷新速度还可以,其实应该还可以更快。因为读数据速度慢,写速度快,为了保持速度一致所以用读写数据