STemWin、emWin 与ucGUI其实都师出同门,都是是Segger 公司之手。
STemWin 是Segger 公司为ST公司定制的图形软件库;uC/GUI 是Segger 公司为Micrium 公司定制的图形软件库;
与其说是花钱定制的版本,其实都是正统emWin的别名版本,微改动。
但是在STM32芯片上面使用STemWin是免费的。当然ST公司也不会给其他芯片使用STemWin的机会,
故在库函数里使用了ST芯片内部CRC32寄存器进行校验是否为ST的芯片,若是则工作正常,否则反之。
像STemWin这个平台通用GUI库来说,就是按要求填充底层接口,然后程序调用库上层API接口。
初接触STemWin强力推荐官方手册《AN4323 应用笔记 STemWin 库入门指南》!!!
去官网搜索:AN4323 即可。
以前都是借的ST的板子,终于狠下心买一块STM32H743的板子了emmmmm....
先写好一份RGB LCD显示和支持触摸的代码(以前文章写过)。
然后打开Cube库文件安装路径,找到与硬件对应的库文件,比如我用的是STM32H743对应H7系列。
C:\Users\admin\STM32Cube\Repository\STM32Cube_FW_H7_V1.8.0\Middlewares\ST\STemWin
其实各个文件夹下放的文件,只看文件夹名字大概都猜到了大概对应文件功能。
包含库和LCD驱动程序的配置文件
首先显示驱动方式有两种,一种是画点,另一种是操作显存。画点是万能的,适用于所有屏幕。操作显存适用于RGB屏幕。
GUIConf.c:主要作用是分配STemWin内部缓存。
LCDConf_Lin_Template.c: 屏幕显示驱动底层填充接口,以显存方式。
LCDConf_FlexColor_Template.c:屏幕显示驱动底层填充接口,以画点方式。
画点有两种做法:使用自定义画点和STemWin自带画点函数(依据MCU屏幕IC)。
GUIDRV_Template.c: 里面是自定义画点填充底层函数,通过画点读点方式,适用于所有的屏幕。
包含emWin“用户和参考指南”英文版STemWin544.pdf用户手册,其实就是emWin544手册。
但是网上有emWIN5.12中文手册,虽不是最新,但是够用,比看英文手册舒服。
存放STemWin库组件的头文件。
存放在STemWin的静态库文件,不开源。
命名格式为STemWin_CM x _ YY_wc_ot_zzzz .a,其中
x:CMx核心类别(CM0,CM3,CM4或CM7)
YY:操作系统支持
wc: Wchar_t类型大小(wc16或wc32。根据编译器选择,先随便选一个报错再换)
ot: 高速优化生成的二进制文件
zzzz:支持ARGB
上面内容来源于文件夹中的Release_Notes.html。
根据用户程序是否带RTOS选择哪个文件。带了RTOS就选名字带OS的。
其实带着RTOS选择使用GUI_X.c也没关系。
我用的是STM32CubeIDE开发,硬件是STM32H743 + RGB LCD,分辨率480 x 272.
使能STM32H7的CRC寄存器。
使能配置SDRAM
在时钟树配置LTDC时钟。
LTDC:初始化屏幕时序,定义两个公共宏,初始化两层layer,打开中断。
使能DMA2D.
把堆栈也改大一点。(下面是我随意改的)
1、在生成的工程中把上面cube库中的STemWin的inc、Lib和OS复制到新建文件夹,并命名为STemWin。
2、由于我的芯片是STM32H743,故打开C:\Users\admin\STM32Cube\Repository\STM32Cube_FW_H7_V1.8.0\Projects\STM32H743I-EVAL\Applications\STemWin\STemWin_HelloWorld\STemWin
把targe和APP文件夹复制到工程的STemWin文件夹下。
3、打开工程中的STemWin文件夹中Lib,我选择使用STemWin_CM4_wc32.a,其他的文件删除。若出错就选STemWin_CM4_wc16.a,和编译器有关。
4、打开工程中的STemWin文件夹中OS,我没有带系统,删除GUI_X_OS.c。
最后的结果:
1、右键工程属性,添加头文件。
2、添加源码文件夹
3、添加静态库。需要注意的是添加静态库名字前面需要添加一个:
最后编译一下,就会通过。如果不通过检测一下步骤。
1、修改分辨率和显示层数,外部链接hltdc和 hdma2d变量。
#define XSIZE_PHYS 480
#define YSIZE_PHYS 272
#define GUI_NUM_LAYERS 2
extern LTDC_HandleTypeDef hltdc;
extern DMA2D_HandleTypeDef hdma2d;
2、删除原有的LTDC和DAM2D初始化驱动,毕竟我们前面使用工具生成了初始化代码。
下面的函数都删除。
#define LCD_LAYER0_FRAME_BUFFER ((int)0xD0000000)
#define LCD_LAYER1_FRAME_BUFFER ((int)0xD0200000)
static void LCD_LL_Init(void);
void HAL_DMA2D_MspInit(DMA2D_HandleTypeDef *hdma2d);
void HAL_DMA2D_MspDeInit(DMA2D_HandleTypeDef *hdma2d);
void HAL_LTDC_MspInit(LTDC_HandleTypeDef *hltdc);
void HAL_LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc);
3、main函数:
int main(void)
{
SCB_EnableICache();
SCB_EnableDCache();
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_LTDC_Init();
MX_DMA2D_Init();
MX_FMC_Init();
MX_CRC_Init();
SDRAM_Initialization_Sequence(&hsdram1);
GUI_Init();
MainTask();
while (1)
{
}
}
我更换了一下字体,效果:
全篇完。
本人是一个嵌入式未入门小白,博客仅仅代表我个人主观见解,记录成长笔记。
笔记是以最简单的方式,只展示最核心的原理。
若有与 大神大大 见解有歧义,我绝对坚信 大神大大 见解是对的,我的是错的。
若无积分等无法下载源码,可加入QQ群657407920下载交流经验。感谢~!