[STM32F4]

(转)STM32F407上移植emwin

[复制链接]
3530|11
手机看帖
扫描二维码
随时随地手机跟帖
xiaoqizi|  楼主 | 2018-7-28 10:59 | 显示全部楼层 |阅读模式
本文博客链接:http://blog.csdn.net/jdh99,作者:jdh


环境:
主机:WIN8
开发环境:MDK5.13
emwin版本:STemWinLibrary522
mcu: stm32f407VGT6
开发板:安富莱STM32-X3
TFT型号:艾蓝2.8寸TFT,主控芯片:ILI9325

说明:
在STM32F407上移植emwin,驱动屏幕接口为FSMC

移植步骤:
1.MDK新建文件结构:
2.GUIConf.c文件修改
    a)增加宏定义:



  • #define GUI_NUMBYTES  (1024 * 80)



  • #define GUI_BLOCKSIZE 0x80




  b)GUI_X_Config(void)函数中增加语句:
GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);

   修改后:
[cpp] view plain copy



  • <code class="language-cpp">/*********************************************************************
  • *
  • *       GUI_X_Config
  • *
  • * Purpose:
  • *   Called during the initialization process in order to set up the
  • *   available memory for the GUI.
  • */  
  • void GUI_X_Config(void) {  
  •   //  
  •   // 32 bit aligned memory area  
  •   //  
  •   static U32 aMemory[GUI_NUMBYTES / 4];  
  •   //  
  •   // Assign memory to emWin  
  •   //  
  •   GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES);  
  •       
  •     GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);  
  •   //  
  •   // Set default font  
  •   //  
  •   GUI_SetDefaultFont(GUI_FONT_6X8);  
  • }</code>  



3.LCDConf_FlexColor_Template.c文件修改
    a)增加宏定义:


  • #define LCD_REG_ADDRESS                   BANK1_LCD_REG



  • #define LCD_DATA_ADDRESS                  BANK1_LCD_RAM











      这两个BANK宏定义在tft驱动文件中定义:



  • #define BANK1_BASE                ((uint32_t)(0x60000000 | 0x00000000))



  • #define BANK1_LCD_RAM        *(__IO uint16_t *)(BANK1_BASE +  (1 << (18 + 1)))        /* FSMC 16位总线模式下,FSMC_A18口线对应物理地址A19 */



  • #define BANK1_LCD_REG        *(__IO uint16_t *)(BANK1_BASE)




       具体值和接线相关

     b)具体函数修改


  • /*********************************************************************



  • *



  • *       Local functions



  • *



  • **********************************************************************



  • */



  • /********************************************************************



  • *



  • *       LcdWriteReg



  • *



  • * Function description:



  • *   Sets display register



  • */



  • static void LcdWriteReg(U16 Data) {



  •   // ... TBD by user



  •         LCD_REG_ADDRESS = Data;



  • }







  • /********************************************************************



  • *



  • *       LcdWriteData



  • *



  • * Function description:



  • *   Writes a value to a display register



  • */



  • static void LcdWriteData(U16 Data) {



  •   // ... TBD by user



  •         LCD_DATA_ADDRESS=Data;



  • }







  • /********************************************************************



  • *



  • *       LcdWriteDataMultiple



  • *



  • * Function description:



  • *   Writes multiple values to a display register.



  • */



  • static void LcdWriteDataMultiple(U16 * pData, int NumItems) {



  •   while (NumItems--) {



  •     // ... TBD by user



  •           LCD_DATA_ADDRESS=*pData++;



  •   }



  • }







  • /********************************************************************



  • *



  • *       LcdReadDataMultiple



  • *



  • * Function description:



  • *   Reads multiple values from a display register.



  • */



  • static void LcdReadDataMultiple(U16 * pData, int NumItems) {



  •   while (NumItems--) {



  •     // ... TBD by user



  •           *pData++=LCD_DATA_ADDRESS;



  •   }



  • }







  • /*********************************************************************



  • *



  • *       Public functions



  • *



  • **********************************************************************



  • */



  • /*********************************************************************



  • *



  • *       LCD_X_Config



  • *



  • * Function description:



  • *   Called during the initialization process in order to set up the



  • *   display driver configuration.



  • *



  • */



  • void LCD_X_Config(void) {



  •   GUI_DEVICE * pDevice;



  •   CONFIG_FLEXCOLOR Config = {0};



  •   GUI_PORT_API PortAPI = {0};



  •   //



  •   // Set display driver and color conversion



  •   //



  •   pDevice = GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, GUICC_565, 0, 0);



  •   //



  •   // Display driver configuration, required for Lin-driver



  •   //



  •   LCD_SetSizeEx (0, XSIZE_PHYS , YSIZE_PHYS);



  •   LCD_SetVSizeEx(0, VXSIZE_PHYS, VYSIZE_PHYS);



  •   //



  •   // Orientation



  •   //



  •   //Config.Orientation = GUI_SWAP_XY | GUI_MIRROR_Y;



  •   Config.FirstCOM = 0;



  •   Config.FirstSEG = 0;



  •   //Config.Orientation = GUI_MIRROR_X | GUI_MIRROR_Y;



  •   Config.NumDummyReads = 2;



  •   GUIDRV_FlexColor_Config(pDevice, &Config);



  •   //



  •   // Set controller and operation mode



  •   //



  •   PortAPI.pfWrite16_A0  = LcdWriteReg;



  •   PortAPI.pfWrite16_A1  = LcdWriteData;



  •   PortAPI.pfWriteM16_A1 = LcdWriteDataMultiple;



  •   PortAPI.pfReadM16_A1  = LcdReadDataMultiple;



  •   GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66708, GUIDRV_FLEXCOLOR_M16C0B16);



  •         //GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66709, GUIDRV_FLEXCOLOR_M16C0B16);



  • }


      其中:GUIDRV_FlexColor_SetFunc函数说明:
      
       因为主控芯片为ILI9325,所以参数选择GUIDRV_FLEXCOLOR_F66708

4.GUI_X.c文件修改
      此文件控制的是GUI中的延时,可以用定时器配合实现,修改如下:
      


  • /*********************************************************************



  • *



  • *       Global data



  • */



  • volatile GUI_TIMER_TIME OS_TimeMS;







  • /*********************************************************************



  • *



  • *      Timing:



  • *                 GUI_X_GetTime()



  • *                 GUI_X_Delay(int)







  •   Some timing dependent routines require a GetTime



  •   and delay function. Default time unit (tick), normally is



  •   1 ms.



  • */







  • extern __IO int32_t g_iRunTime;



  • GUI_TIMER_TIME GUI_X_GetTime(void) {



  •   //return OS_TimeMS;



  •         return g_iRunTime;



  • }







  • void GUI_X_Delay(int ms) {



  • //  int tEnd = OS_TimeMS + ms;



  • //  while ((tEnd - OS_TimeMS) > 0);







  •         int tEnd = g_iRunTime + ms;



  •         while ((tEnd - g_iRunTime) > 0);



  • }





5.主函数实现:



  • int main(void)



  • {



  •         /*



  •                 ST固件库中的启动文件已经执行了 SystemInit() 函数,该函数在 system_stm32f4xx.c 文件,主要功能是



  •         配置CPU系统的时钟,内部Flash访问时序,配置FSMC用于外部SRAM



  •         */







  •         bsp_Init();                /* 硬件初始化 */



  •         Printf**();        /* 打印例程信息到串口1 */



  •         vLCDInit();







  • //        vClearScreen(Green);



  • //        vSetTextColor(Red);               



  • //        vPutString(20,0, "NanJing RF Tracking!!!!!");



  • //        ShowImage();



  •         //DemoFatFS();        /* SD卡文件系统演示程序 */



  •         //RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);



  •         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);



  •     GUI_Init();



  •     GUI_DispString("I am jdh!");







  •         while (1)



  •         {



  •                 GUI_Delay(1000);



  •         }



  • }




注意:

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);

函数是必须的,否则GUI将不工作,这是ST公司防止其他芯片用此GUI的措施。

效果:


参考资料:
1.STemWin5.22移植笔记
2.《野火emwin实战指南V1.0.0》
3.安富莱源程序:x3开发板_裸机STemWin5.20

stm32jy| | 2018-7-28 12:01 | 显示全部楼层
GUI就用emwin

使用特权

评论回复
huangcunxiake| | 2018-7-28 20:43 | 显示全部楼层
多谢分享

使用特权

评论回复
wahahaheihei| | 2018-7-28 22:05 | 显示全部楼层
666

使用特权

评论回复
mmuuss586| | 2018-7-29 10:40 | 显示全部楼层
感谢分享;

使用特权

评论回复
huahuagg| | 2018-7-29 14:31 | 显示全部楼层
我试试能否移植我的板子上。

使用特权

评论回复
xiaoqizi|  楼主 | 2018-8-4 09:20 | 显示全部楼层
huahuagg 发表于 2018-7-29 14:31
我试试能否移植我的板子上。

欢迎尝试 呵呵呵

使用特权

评论回复
paotangsan| | 2018-8-4 10:46 | 显示全部楼层
emwin,我也不知道是干嘛用的 自己平时都是直接生成代码

使用特权

评论回复
labasi| | 2018-8-4 10:54 | 显示全部楼层
paotangsan 发表于 2018-8-4 10:46
emwin,我也不知道是干嘛用的 自己平时都是直接生成代码

emWin图形库由德国SEGGER公司开发,可为图形LCD设计提供高级支持,极大简化了LCD设计并缩短上市时间。为恩智浦ARM微控制器用户免费提供的emWin图形库,以其免费提供商业图库、使用简单、提升MCU运行表现和色彩逼真

使用特权

评论回复
paotangsan| | 2018-8-4 11:11 | 显示全部楼层
感谢楼上的解答

使用特权

评论回复
xiaoqizi|  楼主 | 2018-8-6 13:04 | 显示全部楼层
谢谢各位热心网友

使用特权

评论回复
wowu| | 2018-8-10 13:06 | 显示全部楼层
这个的通用性还是很好的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

71

主题

3860

帖子

3

粉丝