帖子内容有可能格式显示不正确,建议点击查看原文http://www.mazirong.com/?p=3973#comment-11
1、准备工作
移植准备工作需要两个文件已上传百度云(包含移植完毕的最终工程):
链接:https://pan.baidu.com/s/1Fxf4kFUhzNoa8pwxGajfUw
提取码:x27i
包含完整bsp驱动的基础工程【V7-001_LED】。ST官网下载的最新cube包【en.stm32cubeh7】。
最终实现的目的是,将【en.stm32cubeh7】的STemWin图形界面移植到我们自己的工程【V7-001_LED】,运行综合demo。
基础工程【V7-001_LED】解压,如图1
图1
cube包【en.stm32cubeh7】文件路径:en.stm32cubeh7\STM32Cube_FW_H7_V1.4.0\Middlewares\ST\STemWin,这个是STemWin移植文件,如图2
图2
【Config】配置文件夹(需要)【Documentation】说明文档(不需要)【inc】STemWin的头文件(需要)【Lib】STemWin的库文件(需要)【OS】选择裸机或操作系统文件(需要)【Simulation】电脑端仿真文件(不需要)【Software】实用小软件(不需要)【Release_Notes.html】对整个文件夹的说明(不需要)
每个文件夹具体说明见如下英文(摘取自【Release_Notes.html】)
Package content
This version of the STemWin Library package contains the following sub folders:
Config: contains configuration files for the library and LCD driversDocumentation: contains emWin "User & Reference Guide"inc: contains header files of the library componentsLib: contains the Library GUI in object format (.a), running on all STM32 devices based on CortexM0, CortexM3, CortexM4F or CortexM7 cores, all with and without OS support. The naming format is STemWin_CMx_YY_wc_ot_zzzz.a, where
x : the CMx core class (CM0, CM3, CM4 or CM7)YY: OS supportwc: Wchar_t type size (wc16 or wc32)ot: binary generated with high speed optimizationzzzz: ARGB support
OS: contains library interface with RTOSSimulation: contains system resources for WIN32 in precompiled library formatSoftware: contains software tools (Bitmap Converter, Font Converter, GUIBuilder, JPEG2Movie, emVNC, U2C, Bin2C and emWinPlayer)
cube包【en.stm32cubeh7】文件路径:en.stm32cubeh7\STM32Cube_FW_H7_V1.4.0\Projects\STM32H743I-EVAL\Applications\STemWin\STemWin_SampleDemo\STemWin\App,这个是STemWin运行的综合的demo。
图3
2、建立emWin文件夹并复制文件
在基础工程【V7-001_LED】根目录中新建文件夹【emWin】(V7-001_LED\emWin)。在【emWin】中如图2,建立相同文件夹(移植不需要用到的文件夹不需要建立),并多建立一个【emWinDemo】文件夹用来放置STemWin运行的综合的demo ,如图4
图4
整个emWin移植框架,见表格
序号文件夹文件名称是否修改修改内容1ConfigGUIConf.c是1、使能外部SRAM
2、定义GUI_BLOCKSIZE大小
3、重构函数GUI_X_Config()2ConfigGUIConf.h否无3ConfigLCDConf_Lin_Template.c是1、重构函数LCD_X_Config()
2、重构函数LCD_X_DisplayDriver()
3、增加DMA2D功能4ConfigLCDConf_Lin_Template.h否无5emWinDemoSTemWin5.44a综合Demo否无6incSTemWin5.44a头文件否无7LibSTemWin5.44a库文件否无8OSGUI_X.c是1、重构函数GUI_X_Delay()下面分别往每个文件夹里面装填移植文件。
2-1、【Config】文件夹2个.h文件不做修改,2个.c文件直接用安福莱移植好的文件替换,如图5
文件【LCDConf_Lin_Template.c】包含的重点函数:LCD_X_Config() 、LCD_X_DisplayDriver()文件【GUIConf.c】包含的重点函数:GUI_X_Config()
图5
关于LCD_X_Config() 、LCD_X_DisplayDriver()和GUI_X_Config()作用见《STemWin544参考手册》“Configuration” 章节,如图6
图6
2-2【inc】文件夹全部复制过来,无任何更改,如图7
图7
2-3、【Lib】文件夹参考en.stm32cubeh7\STM32Cube_FW_H7_V1.4.0\Projects\STM32H743I-EVAL\Applications\STemWin\STemWin_SampleDemo\MDK-ARM,工程中使用的是【STemWin_CM7_wc16.a】文件,因此,我将该文件复制过来,如图8
图8
2-4、【OS】文件夹由于是裸机移植,不带操作系统,因此复制过来的文件为【GUI_X.c】,如图9
图9
【GUI_X.c】中OS_TimeMS使用g_iRunTime替换掉,用来给emWin获取时间和进行延时。(在【GUI_X.c】文件开始位置声明“extern __IO int32_t g_iRunTime;”),如图10
图10
2-5、【emWinDemo】文件夹将cube包【en.stm32cubeh7】文件路径:en.stm32cubeh7\STM32Cube_FW_H7_V1.4.0\Projects\STM32H743I-EVAL\Applications\STemWin\STemWin_SampleDemo\STemWin\App中的所有demo文件复制过来,如图3
3、建立工程文件
建立工程文件,如图11
图11
注:图11中左侧为STemWin相关文件,右侧为需要用到的bsp文件。文件【bsp_fmc_sdram.c】--使用到外部SDRAM作为内存,文件【bsp_i2c_eeprom_24xx.c】和文件【bsp_i2c_gpio.c】--使用外部eeprom存储电阻触摸屏自校正数据,文件【bsp_tim_pwm.c】--使用pwm作为液晶屏背光驱动。
添加编译文件路径,如图12
图12
注:添加【STemWin_CM7_OS_wc16.a】文件时,要注意变成库文件,不然编译不能通过,如图13、图14
图13
图14
4、修改main函数及bsp文件
main函数修改后,如代码1
代码1[cpp]#include "bsp.h" /* 底层硬件驱动 */ extern void MainTask(void); /* ********************************************************************************************************* * 函 数 名: main * 功能说明: c程序入口 * 形 参: 无 * 返 回 值: 错误代码(无需处理) ********************************************************************************************************* */ int main(void) { /* 硬件初始化 */ bsp_Init(); /* 进入emWin主函数 */ MainTask(); } [/cpp]编译一次发现提示“LTDC_IRQHandler”函数多此定义,如图15。原来LTDC_IRQHandler同时出现在【LCDConf_Lin_Template.c】和【bsp_tft_h7.c】中。屏蔽【bsp_tft_h7.c】中“LTDC_IRQHandler”函数,再次编译,此时通过编译0错误0警告。
图15
下载到开发板发现开发板黑屏,原来还有两个地方没有改好,分别是
一定要记得使能硬件CRC,不然无法运行STemWin初始化过程中使能液晶背光
修改后,如图16
图16再次编译0错误0警告,下载发现能够正常运行STemWin Demo!等一等,唯一还存在的问题是无法使用触摸功能!再来捋一捋,是哪里还没移植好导致无法使用触摸功能呢?
经过比对,发现电容触摸驱动文件【bsp_ts_gt911.c】需要使用STemWin的触摸状态感知函数GUI_PID_StoreState()。通过在电容触摸驱动文件【bsp_ts_gt911.c】中新增一个函数GT911_OnePiontScan()(注意同时在相应头文件中增加函数声明),在该函数内部添加STemWin的状态感知函数GUI_PID_StoreState()用来感知触摸状态,如伪代码2
注:为了兼容其他触摸驱动,同理修改触摸驱动文件【bsp_ts_ft5x06.c】、【bsp_ts_gt811.c】。
伪代码2[cpp]/*********************************************************************************************************** 函 数 名: GT911_OnePiontScan* 功能说明: 读取GT911触摸数据,这里仅读取一个触摸点。* 形 参: 无* 返 回 值: 无**********************************************************************************************************/extern GUI_PID_STATE State; void GT911_OnePiontScan(void) { ……省略 if (s_tp_down == 0) { s_tp_down = 1; State.x = x; State.y = y; State.Pressed = 1; GUI_PID_StoreState(&State); } else { State.x = x; State.y = y; State.Pressed = 1; GUI_PID_StoreState(&State); } ……省略 } [/cpp]在文件【bsp_ts_touch.c】文件中修改,调用GT911_OnePiontScan()函数,如代码3
代码3[cpp]/* ********************************************************************************************************* * 函 数 名: TOUCH_CapScan * 功能说明: I2C接口电容触摸板扫描函数,放在 bsp_Idle()执行! * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void TOUCH_CapScan(void) { if (g_GT811.Enable == 1) { //GT811_Scan(); GT811_OnePiontScan(); return; } if (g_tFT5X06.Enable == 1) { //FT5X06_Scan(); FT5X06_OnePiontScan(); return; } if (g_GT911.Enable == 1) { //GT911_Scan(); GT911_OnePiontScan(); return; } } [/cpp]在【bsp.c】文件中增加驱动扫描检测函数TOUCH_CapScan(),如图17
图17再次下载,发现可以正常使用触摸功能!
补充说明其他优化。在文件【bsp.c】文件中的函数MPU_Config(),配置SDRAM的MPU属性。在文件【bsp_fmc_sdram.h】中,合理分配32MB内存大小,如给每层分配4MB,共2层,剩下24MB供应用程序使用,如图18
图18
注:全功能移植完毕,使用Beyond Compare 4软件与提供的标准模板文件对比一致,放心使用。
5、结果验证
至此,stm32h7“裸机移植STemWin_V5_44a”操作完毕,下面是拍摄的演示效果。
http://v.youku.com/v_show/id_XNDIzNTEwMjQxMg==.html |