STM32F407+STemwin学习笔记之STemwin移植补充Touch
原文地址:http://www.cnblogs.com/NickQ/p/8857213.html
环境:keil5.20 STM32F407ZGT6 LCD(320*240) STemwin:STemWin_Library_V1.1.2 电阻式触摸屏
准备:
STemWIn在裸机上的移植,需要准备STemwin空工程,Touch驱动。
开始移植:
第一步:先将Touch添加进工程,并测试和校准Touch.
第二步:新建Touch配置文件,如下
宏 TOUCH_AD_TOP TOUCH_AD_BOTTOM TOUCH_AD_LEFT TOUCH_AD_RIGHT是实测值,(测试方法参考正点原子的STemwin移植视频)
NICK_GUI_RESTOUCH_SET()函数将有LCD_X_Config()调用,初始化Touch参数。
1 #include "GUI.h" 2 #include "Nick_touch.h" //Touch驱动 3 #include "Nick_lcd.h" //LCD驱动 4 5 6 ////与触摸屏有关定义,根据实际情况填写 7 #define TOUCH_AD_TOP 215 //按下触摸屏的顶部,写下 Y 轴模拟输入值。 8 #define TOUCH_AD_BOTTOM 3782 //按下触摸屏的底部,写下 Y 轴模拟输入值。 9 #define TOUCH_AD_LEFT 305 //按下触摸屏的左侧,写下 X 轴模拟输入值。 10 #define TOUCH_AD_RIGHT 3845 //按下触摸屏的右侧,写下 X 轴模拟输入值。 11 12 void GUI_TOUCH_X_ActivateX(void) 13 { 14 } 15 void GUI_TOUCH_X_ActivateY(void) 16 { 17 } 18 19 int GUI_TOUCH_X_MeasureX(void) 20 { 21 return TP_Read_XOY(0XD0); //CMD_RDX=0XD0 读取X坐标 22 } 23 24 int GUI_TOUCH_X_MeasureY(void) 25 { 26 return TP_Read_XOY(0X90); //CMD_RDX=0XD0 读取Y坐标 27 } 28 29 30 void NICK_GUI_RESTOUCH_SET(void) 31 { 32 GUI_TOUCH_Calibrate(GUI_COORD_X,0,lcddev.width,TOUCH_AD_LEFT,TOUCH_AD_RIGHT); 33 GUI_TOUCH_Calibrate(GUI_COORD_Y,0,lcddev.height,TOUCH_AD_TOP,TOUCH_AD_BOTTOM); 34 }
第三步 :修改LCDConf_FlexColor_Template.c中LCD_X_Config,调用NICK_GUI_RESTOUCH_SET(),配置touch参数
1 void NICK_GUI_RESTOUCH_SET(void); 2 void LCD_X_Config(void) { //2018/04/15-18:48:24 By Nick 3 // Physical display size 4 XSIZE_PHYS = lcddev.width;// To be adapted to x-screen size 5 YSIZE_PHYS = lcddev.height; // To be adapted to y-screen size 6 VXSIZE_PHYS = XSIZE_PHYS; 7 VYSIZE_PHYS = YSIZE_PHYS; 8 9 GUI_DEVICE_CreateAndLink(&GUIDRV_Template_API,GUICC_M565,0,0); 10 LCD_SetSizeEx(0,XSIZE_PHYS,YSIZE_PHYS); 11 LCD_SetVSizeEx(0,VXSIZE_PHYS,VYSIZE_PHYS); 12 13 NICK_GUI_RESTOUCH_SET(); 14 }
第四步:编写Nick_stemwin_timer.c,使能定时器,为STEMWIN设置的心跳
1 #include "stm32f4xx_conf.h" 2 #include "GUI.h" 3 #include "Nick_lcd.h" 4 #include "Nick_touch.h" 5 6 extern volatile GUI_TIMER_TIME OS_TimeMS; 7 8 //通用定时器3中断初始化 9 //arr:自动重装值。 10 //psc:时钟预分频数 11 //定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us. 12 //Ft=定时器工作频率,单位:Mhz 13 //这里使用的是定时器3! 14 void TIM3_STemwin_Init(u16 arr,u16 psc) 15 { 16 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; 17 NVIC_InitTypeDef NVIC_InitStructure; 18 19 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); ///使能TIM3时钟 20 21 TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //定时器分频 22 TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式 23 TIM_TimeBaseInitStructure.TIM_Period=arr; //自动重装载值 24 TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; 25 26 TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure); 27 28 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允许定时器3更新中断 29 TIM_Cmd(TIM3,ENABLE); //使能定时器3 30 31 NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定时器3中断 32 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级1 33 NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级3 34 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; 35 NVIC_Init(&NVIC_InitStructure); 36 37 } 38 39 //定时器3中断服务函数 40 void TIM3_IRQHandler(void) 41 { 42 if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断 43 { 44 OS_TimeMS ++; 45 if(OS_TimeMS%10 == 0) GUI_TOUCH_Exec(); 46 } 47 TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中断标志位 48 }
第五步:向工程文件夹中加入Demo测试文件
解压STemWin_Library_V1.1.2.rar ,打开STemWin_Library_V1.1.2\Project\文件夹.任意一个工程目录,以STM324xG-EVAL为例
不使用操作系统,所以选择Standalone
将Demo目录复制到工程目录中,并添加所有C文件到工程,并应用头文件路径。
打开GUIDEMO.C,将 #include "bsp.h" 修改为开发板对应的BSP头文件,如Nick用的是F407ZG,此处修改为#include "stm32f4xx_conf.h"
第六步:编写测试main.c
1 #include "stm32f4xx_conf.h" 2 #include "GUI.h" 3 #include "GUI.h" 4 #include "Nick_lcd.h" 5 #include "Nick_touch.h" 6 7 #include "GUIDEMO.h" 8 9 void TIM3_STemwin_Init(u16 arr,u16 psc); 10 void TIM4_STemwin_Init(u16 arr,u16 psc); 11 12 int main(void) 13 { 14 lcd_init(0); //LCD初始化 15 TP_Init(0); //Touch初始化 16 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC,ENABLE);//使能CRC时钟,否则STemWin不能使用 17 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 18 TIM3_STemwin_Init(999,83); //1ms 20 21 GUI_Init(); 22 23 GUI_SetColor(GUI_RED); 24 GUI_SetBkColor(GUI_BLUE); 25 GUI_SetFont(&GUI_Font24_ASCII); 26 GUI_Clear(); 27 GUI_DispStringAt("Hello World",10,10); 28 29 GUI_Clear(); 30 GUIDEMO_Main(); 31 }
测试结果:
注:运行过程中可能会死机,原因是堆栈空间或分配给STemwin的内存达不到完整运行STemwin例程的要求,而出现死机。
解决如下:
1、加大堆栈大小。如下图。打开启动文件,如果发现黄色钥匙标记,表示只读文件,则需要修改启动文件属性。然后在修改.
Nick在此修改Stack_Size 为0x00000800 Heap_Size 0x00000400
即将下图默认大小扩大一倍。
2、加大内存空间给STemwin,修改GUIConf.c文件,修改为图式大小即可,测试成功。
3、将测试功能减少,修改#include "GUIDEMO.h"的配置宏,如下(包括但不限于此),将括号里修改为0,即关闭该功能测试。
作者:NickQ
出处:http://www.cnblogs.com/NickQ/
版权声明:
本文版权归原创作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。