• 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,即关闭该功能测试。

  • 相关阅读:
    MySQL 5.7.18 zip 文件安装过程
    Mysql 自定义随机字符串
    JAVA基本类型和引用类型
    初识JSP
    Java导出错误数据
    时序图的使用习惯
    Redis踩坑
    ES踩坑
    代码规范
    Git在公司的使用流程
  • 原文地址:https://www.cnblogs.com/NickQ/p/8857213.html
Copyright © 2020-2023  润新知