原文地址: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,即關閉該功能測試。

