注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
dj狂人的个人空间 https://home.eeworld.com.cn/space-uid-525697.html [收藏] [复制] [分享] [RSS]
日志

emWin5.22在STM32上移植

热度 2已有 10333 次阅读2015-5-19 16:59

                   emWin5.22在STM32上移植
(PS:此文档适用于TFT液晶屏使用FSMC方式进行数据传输的例程,其它的仅起参考作用)
STemWin是什么这里就不介绍了,大家看图吧
怎么样,炫吧,哈哈
不扯太多,直入主题吧!
首先这次移植需要的材料:
STemWin5.22->链接:http://pan.baidu.com/s/1o6sqxCm密码:9y76
STemWin5.12用户手册->链接:http://pan.baidu.com/s/1mgta0I0密码:49n4
这两份资料是我共享到百度云的,当然也可以去官网下载(建议不去,太慢了,我下的时候几十K每秒,不懂是不是我网速的原因)。
STemWin5.22官网下载链接:
资料下好之后,那么接下来我们进行移植。
      首先我们要有一块开发板、TFT液晶屏。相信有开发板的基本都带有例程,那么我们从中随便选一份TFT液晶屏的例程出来(要
保证这份程序能驱动你的液晶屏让屏能正常显示,因为有些可能是板子和屏是分开买的,板子配套的例程不适合屏)。然后看一下
TFT液晶屏驱动函数所在文件是不是“LCD.C”和“LCD.h”(不区分大小写),如果不是下面这步可不管,如果是的话就修改文件名,
修改成什么无所谓(我的修改成ILI93xx.C和ILI93xx.H),只要不是“LCD.C”、“LCD.H”即可(这一步比较重要,因为STemWin
的库中有一个“LCD.h”的头文件)。这一步完成之后接下来我们开始把STemWin5.22加入工程项目中。
首先我们在下好的emWin资料中的以下目录下
    “emWin\stemwin\STemWin_Library_V1.1.2\Libraries”会找到一个名为“STemWinLibrary522”的文件夹:
把这个文件夹复制到我们的工程目录下,然后在工程项目组中为其新建一个分组,如下:
如图中所示,把这四个文件添加进来,他们所在路径分别为:
1、  GUI_X.C -> “STemWinLibrary522\OS”
2、  GUIConf.c和LCDConf_FlexColor_Template.c->“STemWinLibrary522\Config”
3、  STemWin522_CM3_Keil.lib -> “STemWinLibrary522\Lib”
4、   
接着把“STemWinLibrary522”中所有的头文件路径包含进去。以上几步完成之后接下来就开始进行部分的程序修改了。
         首先我们点开“GUIConf.C,会在里面看到这样一个宏:
” #define GUI_NUMBYTES  0x200000”
把“0x200000”改为“1024*50”即可(这个宏定义服务于在函数中向系统申请一个静态空间 aMemory ,接着调用 emWin的库函数GUI_ALLOC_AssignMemory 把该空间分配给 emWin。还有“1024*50”并不是定值,我们也可以改成“1024*40”或其它,视情
况而定,但一般建议设置成小于“1024*50”)。然后在“GUIConf.C”中就没有需要修改的了。
接着我们点开“LCDConf_FlexColor_Template.c”,在这个 .C 文件中我们先把TFT液晶驱动的头文件添加进来(如我的是#include “ILI93xx.h”)。接下来我们会看到里面有这样的四个函数void LcdWriteReg(U16 Data)、voidLcdWriteData(U16 Data)、void LcdWriteDataMultiple(U16 * pData, int NumItems)、voidLcdReadDataMultiple(U16 * pData, int NumItems)  然后像下面那样分别添加一句语句:
  1. static

  2. void LcdWriteReg(U16 Data)

    {



  3.          //

  4. ... TBD by user



  5.          ILI93xx_REG =

  6. Data;                 



  7. }





  8. static

  9. void LcdWriteData(U16 Data)

    {



  10.          //

  11. ... TBD by user



  12.          ILI93xx_RAM = Data;                                                                        



  13. }





  14. static

  15. void LcdWriteDataMultiple(U16 * pData, int NumItems)

    {



  16.            while (NumItems--)

               {



  17.                      // ... TBD by user



  18.                       ILI93xx_RAM

  19. = *pData++;                                                     



  20.            }

    }





  21. static void LcdReadDataMultiple(U16 *

  22. pData, int NumItems)

    {                     



  23.           while (NumItems--)

              {



  24.           // ... TBD by user



  25.                    *pData++

  26. = ILI93xx_RAM;                                            



  27.           }



  28. }

复制代码

         
注意,上面新添加的ILI9341_REG ILI9341_RAM是根据我的TFT驱动文件中确定的,在我的驱动文件中它们俩
都是一个宏,原型为:
  1. #define ILI93xx_REG        *(__IO

  2. uint16_t *)(0x6C000000)



  3. #define ILI93xx_RAM       *(__IO

  4. uint16_t *)(0x6C000002)

复制代码
ILI9341_REG ILI9341_RAM这两个值大家移植的时候要根据自己驱动文件中相应的宏进行修改。
       上面这步完成之后我们再来看这个函数:
  1. void LCD_X_Config(void)

    {



  2.          GUI_DEVICE * pDevice;



  3.          CONFIG_FLEXCOLOR Config = {0};



  4.          GUI_PORT_API PortAPI = {0};



  5.          pDevice =

  6. GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, GUICC_565, 0, 0);





  7.         LCD_SetSizeEx (0, XSIZE_PHYS , YSIZE_PHYS);



  8.         LCD_SetVSizeEx(0,

  9. VXSIZE_PHYS, VYSIZE_PHYS);





  10.         Config.Orientation = GUI_SWAP_XY |

  11. GUI_MIRROR_Y;          /*这里是进行屏幕显示方向设置,如果这一句注释掉的话,那

        么你原来初始化TFT的时候屏的什么方向就是什么方向。PS:如果屏幕显示出现显示反转或者镜像情况,可通过GUI_MIRROR_X

           GUI_MIRROR_Y 以及GUI_SWAP_XY 等不同组合进行调整,如GUI_MIRROR_X | GUI_MIRROR_Y

  12. GUI_MIRROR_Y 等参数的详细

        介绍请参看用户手册*/                                          



  13.         GUIDRV_FlexColor_Config(pDevice, &Config);





  14.         PortAPI.pfWrite16_A0  = LcdWriteReg;



  15.         PortAPI.pfWrite16_A1  = LcdWriteData;



  16.         PortAPI.pfWriteM16_A1 = LcdWriteDataMultiple;



  17.         PortAPI.pfReadM16_A1  = LcdReadDataMultiple;



  18.         GUIDRV_FlexColor_SetFunc(pDevice,&PortAPI,GUIDRV_FLEXCOLOR_F66708,

  19. GUIDRV_FLEXCOLOR_M16C0B16);   

           /*这一步我们需要修改的是GUIDRV_FLEXCOLOR_F66708这个参数。GUIDRV_FLEXCOLOR_F66708 这个参数的修改要根据你

        的TFT屏所使用的驱动芯片,如我的TFT使用的驱动芯片是“ILI9325”,所以是GUIDRV_FLEXCOLOR_F66708。如果你的是

        “ILI9341,那么就改成GUIDRV_FLEXCOLOR_F66709  

  20. 如果是其它型号的驱动芯片则需要查询emWin5.22的用户手册然后进

        行修改。emWin5.22用户手册可在“STemWinLibrary522”文件夹中的“STemWinLibrary522\Documentation”目录下找到,

        该手册是一份PDF文档,打开之后点开查找功能,输入“GUIDRV_FLEXCOLOR_F66709”便可找到,一般在1002页,具体看下图。*/



  21. }

复制代码

这一步很重要,很多人移植不成功都是在这一步没做好。
       上面的步骤完成之后我们再往下看会找到这样一个函数                    
int LCD_X_DisplayDriver(unsigned LayerIndex,unsigned Cmd, void * pData)。在这里我们仅需在
case LCD_X_INITCONTROLLER: 项中加入我们TFT液晶的初始化函数即可;如我的是这样:
  1. int

  2. LCD_X_DisplayDriver(unsigned LayerIndex, unsigned Cmd, void * pData)

    {



  3.         int r;



  4.        (void) LayerIndex;



  5.        (void) pData;



  6.   



  7.         switch (Cmd)

           {



  8.                case LCD_X_INITCONTROLLER: {



  9.                       LCDx_Init();              //添加TFT的初始化函数      



  10.                       return 0;



  11.               }



  12.               default:



  13.                       r = -1;



  14.        }



  15.        return r;



  16. }

复制代码
    以上步骤完成之后接下来就简单多了,emWin在运行过程中有时会调用延时之类的函数,为了实现精确定时,我们还
需要为emWin开一路定时器,这里我们选用StsTick。也即需要我们在mian()函数中加入SysTick_Config(SystemCoreClock /1000);
来初始化SysTick定时器,而在“stm32f10x_it.c”文件中,我们需要进行这样的修改:
  1. extern

  2. __IO int32_t OS_TimeMS;  //OS_Time 已在GUI_X.C中声明。





  3. void SysTick_Handler(void)

    {



  4.           OS_TimeMS

  5. ++;

    }

复制代码
这些工作完成后我们再回到main()中,在main()中我们需要添加
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC,ENABLE);    函数,注意如果不添加将无法使用emWin.
然后进行GUI初始化,记得先包含“GUI.h”。如我的程序是这样子的:
  1. #include

  2. "stm32f10x.h"



  3. #include

  4. "GUI.h"



  5. int

  6. main(void)



  7. {        



  8.          SysTick_Config(72000);//定时1Ms



  9.          RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC,

  10. ENABLE);



  11.          GUI_Init();



  12.          GUI_DispString("Hello emWin!");



  13. }

复制代码
程序编译通过之后下载到板子上,移植成功的话会在左上角显示文本“Hello emWin!”。

本文来自论坛,点击查看完整帖子内容。

全部作者的其他最新日志
发表评论 评论 (2 个评论)
回复 tdnx611g 2018-1-19 20:07
感谢, 受益匪浅
回复 betbet 2018-3-16 22:18
按照你说的,成功点亮了,谢谢!

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章