STemwin移植
1.STemwim简介
emWin 是由德国 SEGGER 公司开发,可为图形 LCD 设计提供高级支持,极大简化了 LCD 设计。 为恩智浦ARM 微控制器用户免费提供的 emWin 图形库。 在国内做嵌入式系统的大部分都使用 emwin, 其简单来说就是一套图形库。 STemWin是SEGGER公司授权给ST(意法半导体)的。使用ST芯片的用户可以免费使用STemWin。其实不光授权给了ST,还有NXP,Energy Micro等。凡是使用这些芯片厂商生产的处理器都可以免费的使用emWin。但是出于一定的保护措施,使用STemWin的库是不能用在其它芯片厂商的处理器上面的。因为在工程初始化STemWin前要使能CRC校验。如果没有使能,STemWin是启动不起来的。KEIL MDK的安装目录里面也带有emWin软件包,这个软件包也不是可以直接使用的,用户需要给KEIL MDK注册RL-ARM才可以使用。 STemWin还针对ST的微控制器做了专门的优化,比如在使用ST的F4XX微控制器带FPU的芯片时,STemWin在需要浮点处理的地方专门做了优化。
2 STemwin下载
STemwin下载 或者直接百度搜索ST官网,进入官网后直接搜索STM32Cubef1,新版本的emwin保存在STM32Cubef1中,直接搜索STemwin之前的老版本,下面移植我们就以新版本为主。
搜索到后获取软件,登录账号,开始下载:
3 移植STemwin
3.1 将下载的文件解压,找到STemwin源文件
打开STemwin文件夹,我们移植需要的文件有Config配置文件、inc、lib、OS
3.2 要完成STemwin移植,需要准备一份带有LCD屏驱动、有触摸屏的完成触摸屏驱动、外扩sram驱动工程。在当前工程路径下新建文件夹STEMWIN保存要移植的源文件。
将Config、inc、lib、OS拷贝到STEMWIN目下。
3.3删除多余的不需要的文件。修改config和lib即可,其他保持不动。
config中:
Lib中保留文件:
在Cube库中,库文件均为.a格式,相比之前版本,文件名不再以编译器类型命名,而是使用wc16和wc32区分不同编译器,wc16用于EWARM(IAR for ARM)7和KEIL5,wc32用于EWARM(IAR for ARM)8和SW4STM32(gcc)。
CM3表示适用于Cortex-M3内核。
OS 表示带操作系统移植
wc16 表示用于EWARM(IAR for ARM)7和KEIL5
ARGB表示此核心库的逻辑颜色从高位到低位排列顺序为ARGB3.4 打开工程,创建分组STemwin,添加.c文件到分组中。
config中所有.c文件,lib中的.a文件,OS中的GUI_X.c文件;
添加头文件路径:
3.5设置.a库文件格式:
3.6 修改完成后线编译工程
4 修改配置相关配置文件
4.1 修改GUIConf.c文件
该文件下就只有一个函数,完成STemwin所需要的空间的分配。
4.2修改GUIConfig.h文件
该文件主要完成窗口数量设置、操作系统支持、触摸屏支持等。
4.3 修改GUIDRV_Template.c文件
该文件实现LCD屏驱动接口模板。
4.4 修改LCDconf_FlexColor_Template.c文件
该文件用来设置LCD屏分辨率以及底层读写数据模板。删除其它函数,只保留LCD_X_Config函数和LCD_X_DisplayDriver函数。
修改LCD_X_Config函数,该函数主要功能创建一个显示驱动器件,选择颜色转换程序,设置显示尺寸,配置触摸屏参数。
// 创建显示驱动器件
GUI_DEVICE_CreateAndLink(&GUIDRV_Template_API, GUICC_565, 0, 0);
LCD_SetSizeEx (0, XSIZE_PHYS , YSIZE_PHYS);
LCD_SetVSizeEx(0, VXSIZE_PHYS, VYSIZE_PHYS);
//设置触摸屏校准参加
GUI_TOUCH_Calibrate(GUI_COORD_X,0,319,0,319);
GUI_TOUCH_Calibrate(GUI_COORD_Y,0,479,0,479);
GUI_DEVICE_CreateAndLink函数功能创建显示驱动器件,STemwin源码是不开源的,该函数的声明处在GUI.h的293行。
第一个参数是结构体体指针,用来定义显示驱动相关信息,该结构体的赋值操作在GUIDRV_Template.c的第738行。
第二个参数是指定所使用的颜色值,GUICC_565即表示RGB565。
LCD_SetSizeEx函数功能设置显示区域物理尺寸。可参考emWIN5.12中文手册第890页。
LCD_SetVSizeEx函数功能设置虚拟显示区的尺寸,可参考emWIN5.12中文手册第890页。
GUI_TOUCH_Calibrate函数功能实现触摸屏校准,第一个参数设置要校准的坐标,第2、3个参数表示实际坐标值,第4、5个参数表示模拟值,EMwin中带有触摸屏校准算法。我们自己实现的触摸屏校准则可直接将第4、5个参数直接填实际坐标值。具体可参考emWIN5.12中文手册第769页。
4.5 上报触摸屏坐标值。
若要实现触摸屏功能,则需要进一步实现坐标值上报。具体可参考emWIN5.12中文手册第765页。
在GUIDRV_Template.c添加下面函数。
#include "xpt2046.h"
//激活X轴测量参考emWIN5.12中文手册第767页。
void GUI_TOUCH_X_ActivateX(void){
}
//激活Y轴测量
void GUI_TOUCH_X_ActivateY(void){
}
/*获取X轴的坐标值*/
int GUI_TOUCH_X_MeasureX(void){
XPT2046_Getxy();
return touch_info.x;
}
/*获取Y轴坐标值*/
int GUI_TOUCH_X_MeasureY(void){
XPT2046_Getxy();
return touch_info.y;
}
4.6 GUI_X.c文件
该文件功能是为EMwin提供毫秒时间单位和毫秒延时函数。
4.7 配置定时器7
配置定时器7,为EMwin提供毫秒时间单位。定期调用GUI_TOUCH_Exec(),从而实现对触摸屏的论询。必须确保该函数的调用频率为每秒 100 次左右。
TIMx_Init(TIM7,72,1000);//1ms,用来给STemwint延时函数使用
TIM7->CR1|=1<<0;//开启定时器
/**************TIM7中断服务函数***************/
#include "GUI.h"
extern volatile GUI_TIMER_TIME OS_TimeMS;
void TIM7_IRQHandler(void)
{
static u8 cnt=0;
if(TIM7->SR&1<<0)
{
cnt++;
if(cnt>=10)
{
GUI_TOUCH_Exec();//检测触摸屏是否按下函数
cnt=0;
}
OS_TimeMS++;
}
TIM7->SR=0;//清除标志
}
5 初始化STemwin
STemWin是SEGGER公司授权给ST(意法半导体)的。使用STemWin需要对芯片校验判断是否为ST公司芯片。
#include "gui.h"
//int a __attribute__((at(0x68000000)));//指定变量a地址为0x68000000
int main()
{
u16 time=0;
GUI_PID_STATE pState;
Beep_Init();
Led_Init();
Key_Init();
Usartx_Init(USART1,115200,72);
TIMx_Init(TIM2,72,20*1000);
IIC_Init();
W25Q64_Init();
Sram_Init();
printf("初始化完成\r\n");
NT35310_Init();
XPT2046_Init();
XPT2046_Calibration2();
TIMx_Init(TIM7,72,1000);//1ms,用来给STemwint延时函数使用
TIM7->CR1|=1<<0;//开启定时器
RCC->AHBENR|=1<<6;//开启CRC时钟
GUI_Init();//STemwin初始化
LCD_Clear(DARKBLUE);//设置背景为白色
printf("STEMWIN初始化完成\r\n");
while(1)
{
GUI_TOUCH_GetState(&pState);//获取触摸屏状态
if(pState.Pressed)
{
GUI_CURSOR_SetPosition(pState.x,pState.y);//设置坐标位置
GUI_CURSOR_Show();//显示光标
}
Delay_Ms(1);
time++;
if(time>=500)
{
LED1=!LED1;
time=0;
}
}
}
光标设置参考emWIN5.12中文手册第784页。