STemwin移植

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表示此核心库的逻辑颜色从高位到低位排列顺序为ARGB

3.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页。

  • 5
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

IT_阿水

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

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

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

打赏作者

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

抵扣说明:

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

余额充值