环境:
主机:WIN8
开发环境:MDK5.13
emwin版本:STemWinLibrary522
mcu: stm32f407VGT6
开发板:安富莱STM32-X3
TFT型号:艾蓝2.8寸TFT,主控芯片:ILI9325
说明:
在STM32F407上移植emwin,驱动屏幕接口为FSMC
移植步骤:
1.MDK新建文件结构
2.GUIConf.c文件修改
a)增加宏定义:
- [cpp] view plain copy
- #define GUI_NUMBYTES (1024 * 80)
- #define GUI_BLOCKSIZE 0x80
复制代码 b)GUI_X_Config(void)函数中增加语句:
- [cpp] view plain copy
- GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);
- [cpp] view plain copy
复制代码 修改后:
- [cpp] view plain copy
- /*********************************************************************
- *
- * 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);
- }
复制代码 3.LCDConf_FlexColor_Template.c文件修改
a)增加宏定义:
- [cpp] view plain copy
- #define LCD_REG_ADDRESS BANK1_LCD_REG
- #define LCD_DATA_ADDRESS BANK1_LCD_RAM
复制代码- [cpp] view plain copy
- <span lang="zh-CN"><span style="font-family:SimHei;font-size:18px;">
- </span></span>
复制代码 这两个BANK宏定义在tft驱动文件中定义:
- [cpp] view plain copy
- <span style="font-family:SimHei;font-size:18px;">#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)</span>
复制代码 具体值和接线相关
b)具体函数修改
- [cpp] view plain copy
- <span style="font-family:SimHei;font-size:18px;">/*********************************************************************
- *
- * 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);
- }</span>
复制代码 其中:GUIDRV_FlexColor_SetFunc函数说明:
因为主控芯片为ILI9325,所以参数选择GUIDRV_FLEXCOLOR_F66708
4.GUI_X.c文件修改
此文件控制的是GUI中的延时,可以用定时器配合实现,修改如下:
- [cpp] view plain copy
- <span style="font-family:SimHei;font-size:18px;">/*********************************************************************
- *
- * 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);
- }</span>
复制代码 5.主函数实现:
- [cpp] view plain copy
- <span style="font-family:SimHei;font-size:18px;">int main(void)
- {
- /*
- ST固件库中的启动文件已经执行了 SystemInit() 函数,该函数在 system_stm32f4xx.c 文件,主要功能是
- 配置CPU系统的时钟,内部Flash访问时序,配置FSMC用于外部SRAM
- */
-
- bsp_Init(); /* 硬件初始化 */
- PrintfLogo(); /* 打印例程信息到串口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);
- }
- }</span>
复制代码 注意:
- [cpp] view plain copy
- <span style="font-family:SimHei;font-size:18px;">RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);</span>
复制代码
函数是必须的,否则GUI将不工作,这是ST公司防止其他芯片用此GUI的措施。
效果:
转载自jdh
|