你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

移植STemWin5.32 基于STM32F103VCT6+5.0寸TFT+FSMC  

[复制链接]
springyyy 发布时间:2018-4-4 16:12
本帖最后由 springyyy 于 2018-4-9 11:23 编辑

      最近老板想用彩屏做一款新产品,于是T宝上买了一块屏让我学学捣鼓一下。网上看到人家移植emWin也想试一下,结果还不错,成功了。其实我还移植了UCGUI,嘿嘿。不过这里只说移植StemWin。
微信图片_20180404141332.jpg
      平台:T宝上买的5寸TFT屏和评估板工程文件和StemWin以及emWin5.42中文手册的链接(StemWin_V1.2.0是我从官网下的):
      链接:https://pan.baidu.com/s/1LyI6shZBq5iybDtv4m5noA密码:q0an
新建位图图像.png
      先上图:不知为何红圈处的字有点模糊,可能是分辨率问题。
1.jpg
微信图片_20180404153611.jpg
微信图片_20180404153607.jpg
微信图片_20180404153603.jpg
微信图片_20180404153559.jpg
微信图片_20180404153555.jpg
微信图片_20180404153548.jpg
微信图片_20180404153540.jpg
开始移植:
      因为是买的5寸的液晶屏和评估板所以液晶驱动不用自己写了。直接复制一个就好。注意:不论是自己写的驱动还是哪里来的驱动,一定要保证能驱动你的屏。这里我的文件是ILI9806.c和ILI9806.h。不可以用LCD.c和LCD.h命名,不然会重复(StemWin532中有LCD.c和LCD.h这2个文件)。
      接下来我们开始把STemWin5.32加入工程项目中。在STemWin_Library_V1.2.0\Libraries下找到一个名为“STemWinLibrary532”的文件夹:
新建位图图像 (2).png
把这个文件夹复制到我们的工程目录下,然后在工程项目组中为其新建一个分组,并添加路径和包含头文件。如下:
新建位图图像 (3).png
新建位图图像 (4).png
新建位图图像 (5).png
      相信以上步骤大家都没问题的。完成以上步骤后,接下来就可以修改程序了。

STemWin移植教程.pdf

下载

1.59 MB, 下载次数: 365

评分

参与人数 1 ST金币 +1 收起 理由
JackGewind + 1 SYS.h 头文件 "usart.h""delay

查看全部评分

收藏 6 评论23 发布时间:2018-4-4 16:12

举报

23个回答
springyyy 回答时间:2018-4-4 16:12:23
本帖最后由 springyyy 于 2018-4-9 11:21 编辑

1.打开“GUIConf.C”,并找到这样一个宏:
                  ”#define GUI_NUMBYTES  0x200000”
      把“0x200000”改为“1024*40”(这个宏定义服务于在函数中向系统申请一个静态空间 aMemory ,接着调用 emWin的库函数GUI_ALLOC_AssignMemory 把该空间分配给 emWin。还有“1024*50”并不是定值,我们也可以改成“1024*40”或其它,视情况而定,但一般建议设置成小于“1024*50”)。然后在“GUIConf.C”中就没有需要修改的了。
      如果想修改字体大小,找到void GUI_X_Config(void)函数,并修改最后一句GUI_SetDefaultFont(GUI_FONT_8X16); 里的入口参数即可。
2.打开“LCDConf_FlexColor_Template.c”。
      在这个 .C 文件中我们先把TFT液晶驱动的头文件添加进来(如我的是#include “ILI9806.h”)。接下来我们会看到里面有这样的四个函数void LcdWriteReg(U16 Data)、voidLcdWriteData(U16 Data)、void LcdWriteDataMultiple(U16 * pData, int NumItems)、voidLcdReadDataMultiple(U16 * pData, int NumItems)  然后像下面那样分别添加一句语句(红色为我添加的):

static void LcdWriteReg(U16 Data)
{
  // ... TBD by user
        *(__IO u16 *) (Bank1_LCD_C)=Data;
}

static void LcdWriteData(U16 Data)
{
  // ... TBD by user
       *(__IO u16 *) (Bank1_LCD_D)=Data;
}

static void LcdWriteDataMultiple(U16 * pData, int NumItems)
{
  while (NumItems--)
        {
    // ... TBD by user
                *(__IO u16 *) (Bank1_LCD_D)=* pData++;
  }
}

static void LcdReadDataMultiple(U16 * pData, int NumItems)
{
  while (NumItems--)
        {
    // ... TBD by user
                * pData++=*(__IO u16 *) (Bank1_LCD_D);
  }
}
      注意:Bank1_LCD_C ,Bank1_LCD_D在我的ILI9806.h中已经定义了,它们是写LCD,命令寄存器的地址和写数据的地址。
               #define Bank1_LCD_D    ((u32)0x60020000)         //Disp Data ADDR
               #define Bank1_LCD_C    ((u32)0x60000000)         //Disp Reg ADDR
      然后再找到void LCD_X_Config(void)这个函数。注意红圈处。
新建位图图像 (6).png

      pDevice = GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, GUICC_M565, 0, 0);  //GUICC_M565/GUICC_565用于红蓝翻转,默认GUICC_565,如果你用GUICC_565发现红蓝是反的就修改成GUICC_M565。
      Config.Orientation = GUI_SWAP_XY | GUI_MIRROR_Y; //这里是进行屏幕显示方向设置,如果这一句注释掉的话,那么你原来初始化TFT的时候屏的什么方向就是什么方向。PS:如果屏幕显示出现显示反转或者镜像情况,可通过GUI_MIRROR_X、GUI_MIRROR_Y以及GUI_SWAP_XY 等不同组合进行调整。
      GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66709, GUIDRV_FLEXCOLOR_M16C0B16); //这里我们需要修改的是GUIDRV_FLEXCOLOR_F66708这个参数。这个参数的修改要根据你的TFT屏所使用的驱动芯片,我的TFT使用的驱动芯片是“ILI9806”,所以是GUIDRV_FLEXCOLOR_F66709(实际上在手册中找不到ILI9806,所以我是用适合ILIxxxx的一个个试出来的)。如果是其它型号的驱动芯片则需要查询emWin5.42的用户手册然后进行修改。
新建位图图像 (7).png

      注意:如果选错了,屏会什么都不显示,黑屏。很多人移植不成功都是在这一步没做好。如果里面没有你用的驱动芯片,可以先不修改,等最后修改完成编译没错误后,下载到板子上,看是否能显示,不显示的话就试一试其他的(一定要保证其他地方没问题)。
      接下来找到函数int LCD_X_DisplayDriver(unsigned LayerIndex,unsigned Cmd, void * pData)。在这里我们仅需在case LCD_X_INITCONTROLLER: 项中加入我们TFT液晶的初始化函数即可。
新建位图图像 (8).png

3. GUI心跳。emWin在运行过程中有时会调用延时之类的函数,为了实现精确定时,我们还需要为emWin开一路定时器,这里我们选用StsTick。也即需要我们在mian()函数中加入SysTick_Config(SystemCoreClock /1000);来初始化SysTick定时器,而在“stm32f10x_it.c”文件中,我们需要进行这样的修改:

extern __IO int32_t    OS_TimeMS;
void SysTick_Handler(void)
{
        //SysTick_ISR();   //原来的
        OS_TimeMS ++;  //添加的
}
      这些工作完成后我们再回到main()中,在main()中我们需要添RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC,ENABLE);函数,注意如果不添加将无法使用emWin.然后进行GUI初始化,记得先包含“GUI.h”。如我的程序是这样子的:
新建位图图像 (9).png


      InitBoard()是我其他的函数,请忽略。GUIDEMO_Main()是用于添加官方Demo例程的。下面会说明。
      程序编译通过之后下载到板子上,移植成功的话会显示如下。
微信图片_20180404150418.jpg

      接下来就是添加官方的Demo程序:
      将STemWin_Library_V1.2.0\Project\STM3210E-EVAL\Standalone中的Demo文件夹拷贝到工程中来,这里面我的MCU是STM32F103VCT6的,不带操作系统的,所以我这里选择了STM3210E-EVAL\Standalone这个路径下的,至于带操作系统的,自己选择即可哈。如果你的MCU不是103系列的请往下看。STemWin_Library_V1.2.0\Project\STM3210C-EVAL\Standalone文件夹下有一个readme.txt文本,里面有说明适用于那个系列的。
新建位图图像 (10).png
新建位图图像 (11).png
新建位图图像 (12).png

      在main函数文件中添加#include "GUIDEMO.h"头文件,接着在函数中增加SysTick_Config(SystemCoreClock / 1000);这个函数,我是利用这个SysTick定时器来做GUI的心跳的(前面已经说明),至于用定时器的方式的,请另行修改;接着增加demo的演示GUIDEMO_Main();这个函数。
      在guidemo.h文件中找到下图这个家伙,这里是demo的开关哦,我这里打开了9个。如图。注意有些打开后占用空间较大可能会超出报错。
2018-04-04_153016.png

      到此移植完毕。

评分

参与人数 1ST金币 +10 收起 理由
zero99 + 10

查看全部评分

springyyy 回答时间:2018-4-8 09:28:01
本帖最后由 springyyy 于 2018-4-8 11:42 编辑

清明节放假回来了,等有空我把图片整一下
springyyy 回答时间:2018-4-9 11:24:13
终于把排版弄好了。自己顶一下。
springyyy 回答时间:2018-4-10 17:44:03
扎心了,没有人看
zero99 回答时间:2018-4-17 14:47:21
感谢分享,请汇总到4月技术原创
https://www.stmcu.org.cn/module/forum/thread-615497-1-1.html
怪叔叔 回答时间:2018-4-26 23:55:50
这么好的帖子,没人顶 真是可惜,楼主我顶你
newphj 回答时间:2018-4-27 09:26:43
正好用得上
krguang 回答时间:2018-4-28 13:15:03
缘分啊,咱们买的是一个屏
springyyy 回答时间:2018-4-28 13:45:29
krguang 发表于 2018-4-28 13:15
缘分啊,咱们买的是一个屏

全淘宝好像就他家的便宜
123下一页

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版