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.2Project文件夹.任意一个工程目录,以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,即关闭该功能测试。

原文地址:https://www.cnblogs.com/NickQ/p/8857213.html