[单片机经验] 【mk_欣驰】emWin移植笔记——STemWin5.22在STM32F103上的移植步骤(带触摸,无操作系统)

一、硬件要求小系统 (无窗口管理器)  
    •RAM:100字节 
    • 堆栈:600字节 
    •ROM:10-25 kb(取决于所使用的功能) 
大系统 (包含窗口管理器和小工具)  
    •RAM:2-6 kb(取决于所需的窗口数) 
    • 堆栈:1200-1800字节 (取决于所使用的功能) 
    •ROM:30-60 kb(取决于所使用的功能) 
请注意,如果应用程序使用了很多字体,则对ROM的要求会提高。上述所有值都是粗略估算值,不 
保证能正常使用。

重要说明: 
(0)由于这个移植教程是去年过年的时候做的,用的是5.16,这就不再做个5.20的移植了,方法是一样的。 
(1)emWin手册里面有这样一句话:“驱动接口的改变始于emWin V5。不再支持针对emWin V4 或更早版本开发的老显示驱动”。  
(2)尽管emWin提供了大部分屏的驱动,但是不能包含所有,这篇移植文档就因此而生。不管是emWin已经支持的,还是没有提供支持的,均可采用这种方法。
二、移植前的准备工作

1、固件库的获取
首先, emWin 库来源有两个:
(a).在MDK(KEIL)软件目录下获取
路径:MDK5.XX D:\Program Files (x86)\Keil_5\ARM\Pack\Keil\MDK-Middleware\5.1.4\emWin
         MDK4.XX C:\Keil4.73\ARM\Segger\emWin
(b).在ST官网下载
下载地址:http://www.st.com/web/en/catalog/tools/PF259225#
    这里我们用第二个,因为 MDK 目录下的 emWin 最新版本对于大家不是好获得(MDK5.0 才 是5.22 , MDK4.7 下 是 5.16 的 ) , 而 ST 公 司 的 那 个 好 下 载 。目前最新的是 5.22的版本,打开页面,登陆后点击下的 Download, 即可下载。
http://bbs.elecfans.com/forum.php?mod=attachment&aid=MzQ4NTY4fGYzMjA0YTcwMmUzOWM4YTRhYzgyYjNiZDhhMjM1ZThmfDE0NzgzMTEwNzk%3D&request=yes&_f=.rar解 压 缩 下 载 的 压 缩 包 , 打 开 文 件 夹 , 我 们 看 到: 
Libraries: 里面就有我们需要的 STemWin 
Project:这个是 ST 的工程文件,以官方的 eval 板子建的工程
Utilities: 这个是文件系统和 eval 板子的硬件驱动程序
打开Libraries,就会看到我们需要的STemWinLibrary522文件夹。
 
内容如下图:
 
2、注册RL_ARM 
其过程和使用*注*册*机*注册MDK过程一样,如下图:
 
 
 
三、开始移植

1、液晶驱动程序
    这里借用正点原子的液晶屏驱动程序,复制原子的lcd.c和lcd.h文件到工程里(或直接使用原子例程里的 “实验11 TFT液晶显示实验”)。

    同时,记得在主函数里调用LCDx_Init();进行液晶屏初始化。 
 
注意:

    工程里的 lcd.c 和 lcd.h 改为 ili93xx.c 和 ili93xx.h 后重新加入到工程里, LCD_Init()也改为 LCDx_Init()。
    因为这里和emWin固件库里的有同名了,防止冲突所以在这里要修改。
下面的程序由 ili93xx.h 中剪切到 ili93xx.c 中,至于为什么做以上工作,移植过 ucGUI 的再知
道不过了,这里就不多说了,不知道的可以百度哦。
typedef struct
{
u16 LCD_REG;
u16 LCD_RAM;
} LCD_TypeDef;
#define LCD_BASE ((u32)(0x6C000000 | 0x000007FE))
#define LCD ((LCD_TypeDef *) LCD_BASE)
2、加入STemWin5.22固件库文件
加入后的工程截图如下:
 
(a). GUIConf.c和LCDConf_FlexColor_Template.c两个文件路径如下:
 
(b).GUI_X.C文件路径如下:(灵活选择。因为这里是无操作系统的,所以使用GUI_X.c文件)
 
(c).lib文件路径如下:(灵活选择。因为这里使用Keil开发工具,stm32f103为CM3内核)
 
3、修改程序,制作emWin与液晶屏驱动程序接口函数
(a).修改GUIConf.c 文件

中的 GUI_NUMBYTES 为 1024*50, 50 可以小点,不要太大,太大编译器会编译会错误的。
(b).修改 LCDConf_FlexColor_Template.c 这个文件
先将我们的 ili93xx.h 头文件包含进来,接下来加入以下两行程序,至于后面的地址为什么会这样,这是 LCD 显示里的哦。
#define LCD_REG_ADDRESS *(__IO uint16_t *)(0x6C000000)
#define LCD_DATA_ADDRESS *(__IO uint16_t *)(0x6C000800)

再就是下面的几个程序,添加红色部分程序
static void LcdWriteReg(U16 Data) {
// ... TBD by user
LCD_REG_ADDRESS=Data;
}
static void LcdWriteData(U16 Data) {
// ... TBD by user
LCD_DATA_ADDRESS=Data;
}
static void LcdWriteDataMultiple(U16 * pData, int NumItems) {
while (NumItems--) {
// ... TBD by user
LCD_DATA_ADDRESS=*pData++;
}
}
static void LcdReadDataMultiple(U16 * pData, int NumItems) {
*pData = LCD_DATA_ADDRESS;
while (NumItems--) {
// ... TBD by user
*pData++=LCD_DATA_ADDRESS;
}
}
此时重要的函数来喽 void LCD_X_Config(void)Config.Orientation = GUI_SWAP_XY | GUI_MIRROR_Y;
这句是显示方向的,默认的是这个,弄好后,下进去板子,看是否正常显示,不正常显示可以试试修改这里哦。
GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66709,
GUIDRV_FLEXCOLOR_M16C0B16);
GUIDRV_FLEXCOLOR_F66709 这个东西很重要,移植的时候我就栽在这里啦,这是对控制芯
片的支持,具体请看最新手册 5.22 的( P991),也有中文的 5.12,不过 5.22 支持的很多。
最后就是 main 函数喽
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);
GUI_Init();
GUI_DispString("Hello STemWin!");

记住这句一定要加上 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);



四、加入 demo,让 emWin 炫起来
1、加入demo文件
 
    在main.c里加入头文件 guidemo.h 然后在主函数里加入 GUIDEMO_Main(); 好,编译程序,下进去,就可以看到经典的开始画面了,但是没有动,右下角没有像别人的视频里的滚动!这是因为我们还没有启动 emWin 的心跳哦!
2、启动emWin心跳
    HARDWARE 里加入 gui_time.c 和 gui_time.h 文件, 具体源码见下图:
 
其实就是循环调用OS_TimeMS++;让 emWin 跳动起来。 别忘了,主函数要调用定时器的初始化哦! 我们再编译, 程序跑起, 哈哈, 是不是动了。但是我们只看到只有一个示例在循环显示。

OS_TimeMS在emWin的这里进行了调用:

 
3、打开多个demo示例开关        
    打开 GUIDEMO.h 文件, 配置如下图,将后面括号里的“0”改为“1”即为打开此示例,记住后面每个项目的开关要关掉很多的,不然会有错误的。 我开了 8 个。
 

    编译后下载进去,就可以看到有8个画面在循环显示。
五、加入触摸屏
1、触摸驱动程序
    这里借用正点原子的液晶屏驱动程序,复制原子的touch.c和touch.h文件到工程里(或直接使用原子例程里的 “触摸屏实验”)。
同时,记得在主函数里调用TP_Init();进行触摸屏初始化。 
2、修改程序,制作emWin与触摸屏的接口函数
    由于我们用的 5.22 版本没有关于 touch的 文件,我便从 5.16 那儿拷过来了GUI_X_Touch_Analog.c,把这个文件加入到 StemWin5.22组里, 因为直接就用的原子的触摸了, 我们就直接调用 TP_Read_XY2(&x,&y);这个函数, 把他放进GUI_TOUCH_X_MeasureX(void)和 GUI_TOUCH_X_MeasureY(void)这两个函数里, 其实最后由这个函数 GUI_TOUCH_Exec()循环调用, 来一直读 AD 的值。

 
注意:
    如果完成第3步后,发现触摸屏方向不对,可以试着修改上面加入的TP_Read_XY2(&x,&y);里的&x和&y的位置。
同时,要 把GUI_TOUCH_Exec();这个函数也要放进前一步建的 gui_time.c 文件里, 具体见下图:
 
3、通过示例确定校准值
    这里的校准值就是取得 A/D 转换器的最小值和最大值。 emWin 需要用这些值来把测量结果转换为以像素表示的触摸位。这 4 个值为:

 
    emWin 的示例文件夹中有一个小程序,可用来获取触控面板的这些值。 该程序位于文
件夹 Sample\Tutorial 下,程序名称为 TOUCH_Sample.c。 在硬件上运行该示例显示效果如下图:


 
接下来我们在 LCDConf_FlexColor_Template.c 文件中加入上面提到的四个值
#define TOUCH_AD_TOP 221
#define TOUCH_AD_BOTTOM 3900
#define TOUCH_AD_LEFT 160
#define TOUCH_AD_RIGHT 3883

后面的数字只是临时写的, 然后我们再新建 gui_touch.c 文件, 这就是 TOUCH_Sample.c
文件的程序, 我们拷贝过来到 gui_touch.c 中, 如下图所示:


 
然后,main.c里程序如下图:
 
然后下载程序, 界面如下图:
 
这是确定左上角的值,记住 一定要触摸,蓝色的 X 就是 TOUCH_AD_LEFT 的值, Y 就是 TOUCH_AD_TOP 的值。

同理,拖动光标到右下角,蓝色 X 的值为 TOUCH_AD_RIGHT, Y值 为 TOUCH_AD_BOTTOM 。这 样,前 面 提 到 的 四 个 值 就 已 经 确 定 了,同 时 改 掉LCDConf_FlexColor_Template.c 里的那四个值。
4、在初始化程序LCD_X_Config 函数里调用 GUI_TOUCH_Calibrate 函数
如下图,加入下面两句程序:
                 GUI_TOUCH_Calibrate(GUI_COORD_X, 0, 240, TOUCH_AD_TOP, TOUCH_AD_BOTTOM);
                 GUI_TOUCH_Calibrate(GUI_COORD_Y, 0, 320, TOUCH_AD_LEFT, TOUCH_AD_RIGHT);        


 
至此,emWin加触摸屏的移植完成!

 

用微信扫描二维码

为博主 打个赏

金额随意 快来“打”我呀 要买枸杞当归补补~~

你可能感兴趣的:(嵌入式/电路/ucOs)