潘多拉开发板——emwin5.44裸机移植记录(ST7789驱动)

一、emwim5.44的获取

1、打开STM32CubeMX,通过主界面help-Update Setting查看

点击后在弹出的界面可以看到路径,以我的电脑为例,可以找到以下的文件夹

正点原子的潘多拉使用的是STM32L475的的单片机,这里选择STM32Cube_FW_L4_V1.16.0文件夹,依次进入至该目录,该目录即为我们所需要的的emwin5.44的源文件。

二、移植的前期准备

1、本次移植直接使用潘多拉的裸机例程“实验10 TFTLCD显示实验”,虽然该程序是使用的HAL库,但实际移植几乎不涉及HAL库,所以标准库理论上也是完全可以的。(该例程自行去正点原子那里下载,这里就不放了。)

 2、为了防止一些重名导致的问题,通常会将原例程中hardware-LCD文件夹lcd.c和lcd.h分别改名,我这里改为ST7789.c和ST7789.h,同时将原例程中,ST7789.c、ST7789.h、main.c涉及到LCD命名的变量等的,统一替换(ctrl+F迅速解决),我这里都改成了OLED,改完后先编译一次,确保无异常后再进行下一步。

3、将获取到的emwin5.44,Config、inc、Lib、OS为所需要的用到的文件,可以直接在程序的根目录建立好文件夹一股脑放进去

4、在程序中新建对应的文件夹,依次放入以下5个文件,并在keil中添加头文件目录

右键STemwin_CM4_wc16_ARGB.a,点击Options For File......(省略了)

将该文件类型改为“Library file”

这里使用的emwin的库使用的是STemWin_CM4_wc16_ARGB.a,其中,

不含OS

CM4:内核,L475的内核就是M4

wc16:Wchar_t type是16位

ARGB:支持aRGB

具体的解释可以参考官方文档,该文档在emwin源文件的“Release_Notes.html”打开查看

5、添加完成后,点击编译,会看到一个报错,关于无法找到LCDconf.h,这里我们直接将该引用改为“#include "ST7789.h"”,再编译此时应该不会有报错了(可能有一些warning,可以忽略),至此,前期的框架则已经搭建完,可以进行后续的移植。

三、针对不同驱动的显示屏,依次修改emwin的部分代码,以实现移植。

注意:潘多拉默认搭载的OLED驱动为ST7789,若使用的emwin版本较低,会出现不支持的情况,后续会告诉各位怎么查找是否支持,以及要修改的对应源码。

1、emwin5.44中对于GUIconf.h可以不用做任何改动,GUIConf.c中将#define GUI_NUMBYTES  0x200000改为#define GUI_NUMBYTES  0x10000。这里的宏定义是为emwin分配内部flash的内存,若写得太大,会导致编译大量报错,因为没有内存分配不够了,我这里分配改为0x10000,如果使用外部SRAM,要修改下面的GUI_X_Config()函数,这里就没用到,就不改了。(各位想修改可参考正点原子emwin开发手册修改)

 2、移植显示屏的打点函数和读点函数,依次在GUIDRV_Template.c的_SetPixelIndex函数和_GetPixelIndex中添加自己显示屏对应的函数。

由于ST7789本身在采用的SPI并没有回读, 所以_GetPixelIndex不做修改,只在_SetPixelIndex对应的位置添加画点函数OLED_Draw_Point(x, y);

3、同步emwin的时钟

在GUI_X.c中,我们可以看到一个变量OS_TimeMS,将该变量直接放到对应的系统节拍中进行OS_TimeMS++,如下图所示

 

 

 4、修改LCDConf_FlexColor_Template.c文件

1)修改显示屏默认的像素,改为我们显示屏的像素,潘多拉自带的显示屏为240*240。

 2)修改static void LcdWriteReg(U16 Data) 、static void LcdWriteData(U16 Data) 、static void LcdWriteDataMultiple(U16 * pData, int NumItems)、static void LcdReadDataMultiple(U16 * pData, int NumItems) 这四个函数,并添加我们自己相关的显示屏代码。

由于原例程中对ST7789写命令和写数据都是一个字节一个字节进行。

因此先将函数的形参从U16改为U8,再把对应代码放入,由于前文提到ST7789不存在回读,可以不用管LcdReadDataMultiple函数,下图为我改完后的代码

 

 ***注意,这里写入的OLED_Write_Cmd()和OLED_Write_Data()函数都是原来在“ST7789.c”中已经定义好的函数,但是在“ST7789.c”定义时加了static,需要去掉“static”,并在“ST7789.h”中声明,这样才能顺利让emwin进行调用。

 3)修改LCD_X_Config()函数

下图为修改后的代码截图

如图所示中:

首先,GUICC_565为对应的色彩方案,通过右键go to definition可以看到更多可写的参数,根据自身显示屏修改,如果色彩方案不对,可能导致“你要的蓝不是蓝,他要的黄是什么黄”等现象,我这边直接默认了(也没有测过色彩对不对)

其次,Config.Orientation配置的是方向,默认配置为Config.Orientation = GUI_SWAP_XY | GUI_MIRROR_X;  在潘多拉开发板中,会出现竖屏显示不全的问题,这里可以直接配置为0,用户右键go to definition“GUI_MIRROR_X”可以看到其实可选参数有三个,分别是“GUI_MIRROR_X”“GUI_MIRROR_Y”“GUI_MIRROR_XY”,通过组合即可实现不同的方向显示。

具体含义参考官方手册(官方手册在前文下载的emwin文件夹中,路径如下“STemWin\Documentation\STemWin544.pdf”

然后,原例程中在结构体“PortAPI”都用的xxxx16_A0等,全部改为8,我猜测应该和前文里移植读写命令和数据函数时根据一个字节进行读写有关。

最后,“GUIDRV_FLEXCOLOR_F66709”该参数与自己的显示屏驱动息息相关,原本默认为“GUIDRV_FLEXCOLOR_F66708”,通过上述“STemWin544.pdf”搜索自己的屏幕驱动,会查找到对应的参数。

4)在LCD_X_DisplayDriver()函数中添加自己的显示初始化

5、修改main.c

1)添加头文件:

#include "GUI.h"

2)初始化相关:

__HAL_RCC_CRC_CLK_ENABLE();
GUI_Init();

3)测试用例:

GUI_SetBkColor(GUI_BLUE);   
GUI_SetColor(GUI_YELLOW);  
GUI_SetFont(&GUI_Font24_ASCII); 
GUI_DispStringAt("HELLO WORD!", 0, 0);

如图所示:

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

碎步湖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值