×
单片机 > 单片机程序设计 > 详情

STM32F407上移植emwin

发布时间:2020-06-09 发布时间:
|

环境:

主机:WIN8

开发环境:MDK5.13

emwin版本:STemWinLibrary522

mcu: stm32f407VGT6

开发板:安富莱STM32-X3

TFT型号:艾蓝2.8寸TFT,主控芯片:ILI9325


说明:

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


移植步骤:

1.MDK新建文件结构:

2.GUIConf.c文件修改

    a)增加宏定义:



  1. #define GUI_NUMBYTES  (1024 * 80)  

  2. #define GUI_BLOCKSIZE 0x80  




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



  1. GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);  


  1.   




   修改后:


  1. /********************************************************************* 

  2. *       GUI_X_Config 

  3. * Purpose: 

  4. *   Called during the initialization process in order to set up the 

  5. *   available memory for the GUI. 

  6. */  

  7. void GUI_X_Config(void) {  

  8.   //  

  9.   // 32 bit aligned memory area  

  10.   //  

  11.   static U32 aMemory[GUI_NUMBYTES / 4];  

  12.   //  

  13.   // Assign memory to emWin  

  14.   //  

  15.   GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES);  

  16.       

  17.     GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);  

  18.   //  

  19.   // Set default font  

  20.   //  

  21.   GUI_SetDefaultFont(GUI_FONT_6X8);  

  22. }  



3.LCDConf_FlexColor_Template.c文件修改


    a)增加宏定义:


  1. #define LCD_REG_ADDRESS             BANK1_LCD_REG  

  2. #define LCD_DATA_ADDRESS            BANK1_LCD_RAM  


 

  1.   


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


  1. #define BANK1_BASE     ((uint32_t)(0x60000000 | 0x00000000))  

  2. #define BANK1_LCD_RAM   *(__IO uint16_t *)(BANK1_BASE +  (1 <

  3. #define BANK1_LCD_REG   *(__IO uint16_t *)(BANK1_BASE)  




       具体值和接线相关


     b)具体函数修改


  1. /********************************************************************* 

  2. *       Local functions 

  3. ********************************************************************** 

  4. */  

  5. /******************************************************************** 

  6. *       LcdWriteReg 

  7. * Function description: 

  8. *   Sets display register 

  9. */  

  10. static void LcdWriteReg(U16 Data) {  

  11.   // ... TBD by user  

  12.     LCD_REG_ADDRESS = Data;  

  13. }  

  14.   

  15. /******************************************************************** 

  16. *       LcdWriteData 

  17. * Function description: 

  18. *   Writes a value to a display register 

  19. */  

  20. static void LcdWriteData(U16 Data) {  

  21.   // ... TBD by user  

  22.     LCD_DATA_ADDRESS=Data;  

  23. }  

  24.   

  25. /******************************************************************** 

  26. *       LcdWriteDataMultiple 

  27. * Function description: 

  28. *   Writes multiple values to a display register. 

  29. */  

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

  31.   while (NumItems--) {  

  32.     // ... TBD by user  

  33.       LCD_DATA_ADDRESS=*pData++;  

  34.   }  

  35. }  

  36.   

  37. /******************************************************************** 

  38. *       LcdReadDataMultiple 

  39. * Function description: 

  40. *   Reads multiple values from a display register. 

  41. */  

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

  43.   while (NumItems--) {  

  44.     // ... TBD by user  

  45.       *pData++=LCD_DATA_ADDRESS;  

  46.   }  

  47. }  

  48.   

  49. /********************************************************************* 

  50. *       Public functions 

  51. ********************************************************************** 

  52. */  

  53. /********************************************************************* 

  54. *       LCD_X_Config 

  55. * Function description: 

  56. *   Called during the initialization process in order to set up the 

  57. *   display driver configuration. 

  58. */  

  59. void LCD_X_Config(void) {  

  60.   GUI_DEVICE * pDevice;  

  61.   CONFIG_FLEXCOLOR Config = {0};  

  62.   GUI_PORT_API PortAPI = {0};  

  63.   //  

  64.   // Set display driver and color conversion  

  65.   //  

  66.   pDevice = GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, GUICC_565, 0, 0);  

  67.   //  

  68.   // Display driver configuration, required for Lin-driver  

  69.   //  

  70.   LCD_SetSizeEx (0, XSIZE_PHYS , YSIZE_PHYS);  

  71.   LCD_SetVSizeEx(0, VXSIZE_PHYS, VYSIZE_PHYS);  

  72.   //  

  73.   // Orientation  

  74.   //  

  75.   //Config.Orientation = GUI_SWAP_XY | GUI_MIRROR_Y;  

  76.   Config.FirstCOM = 0;  

  77.   Config.FirstSEG = 0;  

  78.   //Config.Orientation = GUI_MIRROR_X | GUI_MIRROR_Y;  

  79.   Config.NumDummyReads = 2;  

  80.   GUIDRV_FlexColor_Config(pDevice, &Config);  

  81.   //  

  82.   // Set controller and operation mode  

  83.   //  

  84.   PortAPI.pfWrite16_A0  = LcdWriteReg;  

  85.   PortAPI.pfWrite16_A1  = LcdWriteData;  

  86.   PortAPI.pfWriteM16_A1 = LcdWriteDataMultiple;  

  87.   PortAPI.pfReadM16_A1  = LcdReadDataMultiple;  

  88.   GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66708, GUIDRV_FLEXCOLOR_M16C0B16);  

  89.     //GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66709, GUIDRV_FLEXCOLOR_M16C0B16);  

  90. }  

      其中:GUIDRV_FlexColor_SetFunc函数说明:

      

       因为主控芯片为ILI9325,所以参数选择GUIDRV_FLEXCOLOR_F66708


4.GUI_X.c文件修改

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

      

  1. /********************************************************************* 

  2. *       Global data 

  3. */  

  4. volatile GUI_TIMER_TIME OS_TimeMS;  

  5.   

  6. /********************************************************************* 

  7. *      Timing: 

  8. *                 GUI_X_GetTime() 

  9. *                 GUI_X_Delay(int) 

  10.  

  11.   Some timing dependent routines require a GetTime 

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

  13.   1 ms. 

  14. */  

  15.   

  16. extern __IO int32_t g_iRunTime;  

  17. GUI_TIMER_TIME GUI_X_GetTime(void) {   

  18.   //return OS_TimeMS;   

  19.     return g_iRunTime;  

  20. }  

  21.   

  22. void GUI_X_Delay(int ms) {   

  23. //  int tEnd = OS_TimeMS + ms;  

  24. //  while ((tEnd - OS_TimeMS) > 0);  

  25.       

  26.     int tEnd = g_iRunTime + ms;  

  27.     while ((tEnd - g_iRunTime) > 0);  

  28. }  



5.主函数实现:


  1. int main(void)  

  2. {  

  3.     /* 

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

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

  6.     */  

  7.   

  8.     bsp_Init();     /* 硬件初始化 */  

  9.     PrintfLogo();   /* 打印例程信息到串口1 */  

  10.     vLCDInit();  

  11.       

  12. //  vClearScreen(Green);  

  13. //  vSetTextColor(Red);       

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

  15. //  ShowImage();  

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

  17.     //RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);   

  18.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);  

  19.     GUI_Init();  

  20.     GUI_DispString("I am jdh!");  

  21.   

  22.     while (1)  

  23.     {  

  24.         GUI_Delay(1000);  

  25.     }  

  26. }  



注意:


  1. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);  




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





参考资料:

1.STemWin5.22移植笔记
2.《野火emwin实战指南V1.0.0》

3.安富莱源程序:x3开发板_裸机STemWin5.20


关键字:STM32F407  移植  emwin 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会