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,即關閉該功能測試。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM