先上效果图
目录
前言
2048但是单片机ヾ(≧▽≦*)o ψ(`∇´)ψ
保姆级教程适合新手小白
草鸡一只,多多指教,码字不易,求点赞( ̄y▽, ̄)╭ (●'◡'●)
运行环境:正点原子精英板,TFTLCD(240*320)屏幕
lvgl显示自己码的,lvgl guiguider容易出bug,用不习惯。
前期准备
1.STM32CUBEMX生成基础代码
基础配置
配置TIM6和TIM7,分频系数和重装载值先不改,后期会改。
配置一颗led灯,有助于代码调试
时钟树及最后设置,这里选择复制所有文件,别选only......(后面LCD移植会用到其他文件)
2.LCD驱动程序(正点原子移植)
先下载一些驱动代码
链接:https://pan.baidu.com/s/1vsMA1cL_qU8tWMNIPl47RQ
提取码:ac3k
先复制lcd.c lcd_ex.c 到Src文件夹,lcd.h lcdfont.h 到Inc文件夹
然后打开工程,添加lcd.c到Application/User中
添加stm32f1xx_hal_sram.c和stm32f1xx_ll_fsmc.c到Drivers\STM32F1xx_HAL_Driver中
(在C:\Users\xxx\Desktop\f103\2048\Drivers\STM32F1xx_HAL_Driver\Src中)
再打开main.h文件,进行跳转(如下图)
一直跳转到stm32f1xx_hal_conf.h,把标注的这行注释去掉
编译后0错误,有警告的话可以忽视
3.TOUCH驱动程序(自敲)
文件也在刚刚分享的驱动文件中
复制touch.c 到Src文件夹,touch.h lcdfont.h 到Inc文件夹
然后打开工程,添加touch.c到Application/User中
编译后0错误
4.LVGL移植(无系统运行)
先下载lvgl所需文件
链接:https://pan.baidu.com/s/1uy4lLbw3Q57DPTLPugcCzQ
提取码:yudo
在工程文件中新建lvgl文件夹
复制除demo以外文件到lvgl文件夹中
下面打开工程,开始枯燥的添加文件过程...
创建lvgl_port分组
添加两个port文件
位于lvgl/examples/porting,因为没有用到文件系统,故没有添加fs
将lvgl/src目录下的core draw font hal misc widgets文件夹下的所有文件全部添加进lvgl组
还有extra文件夹下的layouts themes widgets目录下的全部文件以及lv_extra.c
千万别忘了文件夹中的子文件夹中的文件
打开添加文件路径界面
添加
../lvgl
../lvgl/src
../lvgl/examples/porting
然后打开lv_port_disp_template.c和lv_port_indev_template.c将图示的if后的0改为1使能代码
再跳转到lv_port_disp_template.h和lv_port_indev_template.h头文件
将if后的0改为1,再将图示的lvgl/lvgl.h改为lvgl.h
随后先回到lv_port_disp_template.c文件
在添加头文件处添加lcd.h文件
然后往下滑
这里lvgl初始代码给出三种形式的屏幕刷新缓存方式,考虑到f103的性能局限,我们选择第一种,注释掉后面两种。
然后把MY_DISP_HOR_RES改为你使用的屏幕的宽度,笔者这里使用的是240宽。
再把*10改为*20,稍微加大一下屏幕刷新的缓存空间。
这里如果想详细了解,可以到bilibili正点原子lvgl移植
往下,把此处的长宽修改(h为宽,v为高)
继续往下,再disp_init()函数中添加lcd初始化代码
static void disp_init(void)
{
/*You code here*/
lcd_init();
lcd_display_dir(0); //竖屏
}
再把disp_flush()函数修改为以下代码,采用lcd驱动中的函数
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,(uint16_t*)color_p);
lv_disp_flush_ready(disp_drv);
}
然后再来到lv_port_indev_template.c文件配置输入驱动
首先添加touch.h头文件
因为这次的2048项目只用到了触摸屏,可以其他的驱动函数删去
在touchpad_init()函数中添加初始化代码
static void touchpad_init(void)
{
tp_init();
/*Your code comes here*/
}
在touchpad_is_pressed(void)中添加屏幕按下的判定函数,这里就采用比较简易的
先定义xn,yn
uint16_t xn=0,yn=0;
static bool touchpad_is_pressed(void)
{
/*Your code comes here*/
xn=read_precise_x();
yn=read_precise_y();
if(xn==0&&yn==325){
return false;
}
return true;
}
然后最后修改touchpad_get_xy()函数
static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y)
{
/*Your code comes here*/
(*x) = xn;
(*y) = yn;
}
打开main.c文件,添加
#include "lvgl.h"
#include "lv_port_disp_template.h"
#include "lv_port_indev_template.h" 头文件
再在下方main函数中调用lvgl初始化函数
lv_init();
lv_port_disp_init();
lv_port_indev_init();
在while循环中添加lvgl心跳函数(如下)
while (1)
{
/* USER CODE END WHILE */
HAL_Delay(5);
lv_timer_handler();
/* USER CODE BEGIN 3 */
}
编译后0错误
至此准备工作完成,下篇文章会给出核心思路与代码实现。