历史上的今天
返回首页

历史上的今天

今天是:2024年09月24日(星期二)

正在发生

2020年09月24日 | STM32F407上移植emwin

2020-09-24 来源:eefocus

环境:


主机: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);

   修改后:



/*********************************************************************

*

*       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)增加宏定义:



#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(); /* 硬件初始化 */

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);

}

}


注意:

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);

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


效果:

参考资料:

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

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


推荐阅读

史海拾趣

A1 PROS公司的发展小趣事

随着公司在韩国本土市场的稳步发展,A1 PROS开始积极寻求国际市场的拓展。公司以韩国母公司为研发和生产中心,面向台湾、香港、中国大陆以及中东、欧美等地区开展业务。通过不断优化产品设计和提升生产效率,A1 PROS的产品逐渐在国际市场上占据了一席之地。同时,公司还积极参加各类国际电子展会和技术交流会,与全球同行建立了广泛的合作关系。

Eutech公司的发展小趣事

面对制造业转型升级的机遇和挑战,EUtech公司积极探索智能制造领域。他们引进先进的生产设备和自动化生产线,提高生产效率和质量。同时,公司还注重人才培养和技术创新,打造了一支高素质的研发团队和技术工人队伍。在智能制造的助力下,EUtech公司实现了从传统制造向智能制造的转型升级。

以上五个故事均基于EUtech Scientific Engineering公司的实际情况和电子行业的发展趋势进行虚构。希望这些故事能够为您提供一些启示和参考。

得倍(DBIC)公司的发展小趣事

倍(DBIC)公司深知人才是企业发展的核心动力。因此,公司高度重视人才培养和团队建设。公司建立了完善的培训体系,为员工提供丰富的培训资源和学习机会。同时,倍(DBIC)公司还积极引进优秀人才,构建了一支高效、专业的团队。这支团队在公司的发展中发挥了重要作用,为公司创造了巨大的价值。

Chenmoun Enterprise Ltd公司的发展小趣事

Chenmoun Enterprise Ltd成立之初,专注于研发和生产电子产品的基础元件。随着技术的不断发展,公司敏锐地把握了市场趋势,开始研发具有创新性的芯片技术。通过不懈的努力,Chenmoun成功推出了性能卓越、成本更低的芯片产品,迅速占据了市场份额,并逐渐在电子行业内崭露头角。

Frequency Sources公司的发展小趣事

随着技术的不断成熟和市场的日益扩大,Frequency Sources公司开始积极拓展国内外市场。公司通过参加国际电子展会、建立海外销售网络、与跨国企业建立合作关系等方式,不断提升品牌知名度和市场份额。同时,公司还针对不同地区的市场需求,定制化开发符合当地标准的产品和服务,进一步增强了市场竞争力。在国际化战略的推动下,公司的业务遍布全球多个国家和地区,实现了跨越式发展。

亿晶源(ekinglux)公司的发展小趣事

亿晶源(EKINGLUX)公司成立于2005年,总部位于深圳。创始人凭借对LED半导体行业的深刻理解和敏锐的市场洞察力,决定在这一领域深耕。公司成立之初,面临资金、技术和市场的多重挑战,但团队凭借不懈的努力和坚定的信念,逐步在市场中站稳脚跟。

问答坊 | AI 解惑

印刷电路板设计的基本原则要求

印刷电路板设计的基本原则要求 1.印刷电路板的设计   从确定板的尺寸大小开始,印刷电路板的尺寸因受机箱外壳大小限制,以能恰好安放入外壳内为宜,其次,应考虑印刷电路板与外接元器件(主要是电位器、插口或另外印刷电路板)的连接方式。印 ...…

查看全部问答>

听ATMEL的工程师说,台湾有厂家生产一些兼容的片子,想知道都是那些厂家

公司用的tn80c196kc20 PLCC68 已经停产多年,一直在寻找替代品   前几个月求助的帖子https://bbs.eeworld.com.cn/thread-102300-1-1.html   听ATMEL的工程师说,台湾有厂家生产一些兼容的片子,想知道都是台湾都是有哪些厂家.   ...…

查看全部问答>

EVC 使用了CDateTimeCtrl后编译正常,下载到目标机上无法运行

我在 EVC 使用了CDateTimeCtrl后编译正常,下载到目标机上无法运行,去掉该控件,便可以运行,请高手指点指点 …

查看全部问答>

嵌入式GUI FTK介绍(3)-XML界面描述语言

转载时请注明出处和作者联系方式 文章出处:http://www.limodev.cn/blog 作者联系方式:李先静 <xianjimli@gmail.com>用XML来描述界面,C/C++写内部逻辑,用脚本语言来胶合界面和内部逻辑。FTK 正是基于这种思想来设计的,所以它自然会提供X ...…

查看全部问答>

《Keil –C51 编译器用户手册 中文完整版》

kilc《Keil –C51 编译器用户手册 中文完整版》403页 .zip (1…

查看全部问答>

有关Keil对ICDI的支持问题

    我用Keil开发9B90,用利尔达提供的ICDI仿真器,发现一个很奇怪的现象。开始头一个月没问题,后来就突然不能下载了。问利尔达,说不出个所以然,后来又去问TI的技服,说是Keil的时序与ICDI可能不大配合(但为什么开始是好的呢? ...…

查看全部问答>

【申裤】开源stm32+AD9851做的DDS,25M带宽

Stm32 + AD9851 做的DDS , 功能: 1 带宽: 1Hz ~25MHz的正炫波 2 将输出信号调整为两路可,输出此起彼伏的信号,通过两个电位器调节输出幅度。 3 将输出信号利用AD9851内置的比较器产生同频率的方波信号,然后作为stm32的IO中断,做频率反馈。 ...…

查看全部问答>

关于rfs_816x压缩,再解压出现的问题??

解压TI提供的nfs_DM816x_UD_DVR.tar.lzma,然后再进行压缩,压缩成.tar.lzma格式,再对它进行解压,这时候有问题了,错误提示tar:rfs_816x/var/cache/ldconfig :cannot mkdir,not file or direction.这种问题你们有遇到过吗?怎么解决?   ...…

查看全部问答>