本帖最后由 springyyy 于 2018-4-9 11:23 编辑 ( [( _0 u9 i! u) M. c . S$ y6 g8 Y& f+ Q4 v7 s2 U) S' U 最近老板想用彩屏做一款新产品,于是T宝上买了一块屏让我学学捣鼓一下。网上看到人家移植emWin也想试一下,结果还不错,成功了。其实我还移植了UCGUI,嘿嘿。不过这里只说移植StemWin。 平台:T宝上买的5寸TFT屏和评估板工程文件和StemWin以及emWin5.42中文手册的链接(StemWin_V1.2.0是我从官网下的): 先上图:不知为何红圈处的字有点模糊,可能是分辨率问题。 因为是买的5寸的液晶屏和评估板所以液晶驱动不用自己写了。直接复制一个就好。注意:不论是自己写的驱动还是哪里来的驱动,一定要保证能驱动你的屏。这里我的文件是ILI9806.c和ILI9806.h。不可以用LCD.c和LCD.h命名,不然会重复(StemWin532中有LCD.c和LCD.h这2个文件)。 接下来我们开始把STemWin5.32加入工程项目中。在STemWin_Library_V1.2.0\Libraries下找到一个名为“STemWinLibrary532”的文件夹: 把这个文件夹复制到我们的工程目录下,然后在工程项目组中为其新建一个分组,并添加路径和包含头文件。如下: 相信以上步骤大家都没问题的。完成以上步骤后,接下来就可以修改程序了。 |
STemWin移æ¤æç¨.pdf
下载1.59 MB, 下载次数: 373
参与人数 1 | ST金币 +1 | 收起 理由 |
---|---|---|
JackGewind | + 1 | SYS.h 头文件 "usart.h""delay |
STM32固件库分享,超全系列整理
小马哥STM32F103开源小四轴RoboFly全部资料大放送
【MCU实战经验】+STM32F107的USB使用
基于STM32F103两轮平衡小车设计(开源)
STM32F107VCT6官方原理图和PCB
【福利】用STM32库的朋友有福了:STM32F10x_StdPeriph_Lib_V3.5.0chm...
基于STM32F10xx存储器和系统架构经验分享
基于STM32F1的CAN通信之BH1750
基于STM32F1的CAN通信之OLED
基于STM32F1的CAN通信之之串口IAP
U, W M1 G8 M3 `. ^% l. v
”#define GUI_NUMBYTES 0x200000”4 q0 Y v9 P3 T8 d$ {$ T
把“0x200000”改为“1024*40”(这个宏定义服务于在函数中向系统申请一个静态空间 aMemory ,接着调用 emWin的库函数GUI_ALLOC_AssignMemory 把该空间分配给 emWin。还有“1024*50”并不是定值,我们也可以改成“1024*40”或其它,视情况而定,但一般建议设置成小于“1024*50”)。然后在“GUIConf.C”中就没有需要修改的了。4 x) u: F; \$ o/ M$ ]: t4 l% [ ?# K
如果想修改字体大小,找到void GUI_X_Config(void)函数,并修改最后一句GUI_SetDefaultFont(GUI_FONT_8X16); 里的入口参数即可。' x. ?# V3 h# b) c
2.打开“LCDConf_FlexColor_Template.c”。" N; H% H" F; ]6 |9 L* {
在这个 .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)
{; E3 A; Y5 r$ W) A# G% |' K
// ... TBD by user
*(__IO u16 *) (Bank1_LCD_C)=Data;
}# ^, ~5 a0 Q) v
static void LcdWriteData(U16 Data)
{
// ... TBD by user
*(__IO u16 *) (Bank1_LCD_D)=Data;
}
static void LcdWriteDataMultiple(U16 * pData, int NumItems) # x6 X( j n8 @
{
while (NumItems--)
{
// ... TBD by user1 P2 L- M W5 K
*(__IO u16 *) (Bank1_LCD_D)=* pData++;+ o. n# j$ X' q ^6 L6 h% E- j; d
}/ `- H$ A$ F8 O4 p
}
static void LcdReadDataMultiple(U16 * pData, int NumItems)
{
while (NumItems--)
{0 j1 [" K( _ W9 }: \5 [5 J
// ... TBD by user: S$ [3 `5 P2 D$ q4 G; K) a) Z
* pData++=*(__IO u16 *) (Bank1_LCD_D);" v+ s2 h" ~ X I
}* L1 s) x0 b. a( {& Z' j
}
注意:Bank1_LCD_C ,Bank1_LCD_D在我的ILI9806.h中已经定义了,它们是写LCD,命令寄存器的地址和写数据的地址。. D# z! f1 |& c- c0 U$ k+ C7 o& ?
#define Bank1_LCD_D ((u32)0x60020000) //Disp Data ADDR
#define Bank1_LCD_C ((u32)0x60000000) //Disp Reg ADDR0 B) H; e% i' h1 C" D- C% v4 n
然后再找到void LCD_X_Config(void)这个函数。注意红圈处。0 E: g# _; c1 O& @9 J
pDevice = GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, GUICC_M565, 0, 0); //GUICC_M565/GUICC_565用于红蓝翻转,默认GUICC_565,如果你用GUICC_565发现红蓝是反的就修改成GUICC_M565。- x, m0 f2 g& p4 |- T) @) o
Config.Orientation = GUI_SWAP_XY | GUI_MIRROR_Y; //这里是进行屏幕显示方向设置,如果这一句注释掉的话,那么你原来初始化TFT的时候屏的什么方向就是什么方向。PS:如果屏幕显示出现显示反转或者镜像情况,可通过GUI_MIRROR_X、GUI_MIRROR_Y以及GUI_SWAP_XY 等不同组合进行调整。5 |: q. h0 [- A `+ l* |
GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66709, GUIDRV_FLEXCOLOR_M16C0B16); //这里我们需要修改的是GUIDRV_FLEXCOLOR_F66708这个参数。这个参数的修改要根据你的TFT屏所使用的驱动芯片,我的TFT使用的驱动芯片是“ILI9806”,所以是GUIDRV_FLEXCOLOR_F66709(实际上在手册中找不到ILI9806,所以我是用适合ILIxxxx的一个个试出来的)。如果是其它型号的驱动芯片则需要查询emWin5.42的用户手册然后进行修改。
注意:如果选错了,屏会什么都不显示,黑屏。很多人移植不成功都是在这一步没做好。如果里面没有你用的驱动芯片,可以先不修改,等最后修改完成编译没错误后,下载到板子上,看是否能显示,不显示的话就试一试其他的(一定要保证其他地方没问题)。
接下来找到函数int LCD_X_DisplayDriver(unsigned LayerIndex,unsigned Cmd, void * pData)。在这里我们仅需在case LCD_X_INITCONTROLLER: 项中加入我们TFT液晶的初始化函数即可。
3. GUI心跳。emWin在运行过程中有时会调用延时之类的函数,为了实现精确定时,我们还需要为emWin开一路定时器,这里我们选用StsTick。也即需要我们在mian()函数中加入SysTick_Config(SystemCoreClock /1000);来初始化SysTick定时器,而在“stm32f10x_it.c”文件中,我们需要进行这样的修改:
# V+ w( {* d1 `. c' n" {+ q
extern __IO int32_t OS_TimeMS;. ]6 T! z- P0 U8 w/ s' n/ @. Y
void SysTick_Handler(void)
{
//SysTick_ISR(); //原来的% l( x( |; \) C8 P
OS_TimeMS ++; //添加的3 e* d a2 Q# G1 h
}
这些工作完成后我们再回到main()中,在main()中我们需要添RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC,ENABLE);函数,注意如果不添加将无法使用emWin.然后进行GUI初始化,记得先包含“GUI.h”。如我的程序是这样子的:! Q' O: b f$ S& r/ q* c8 p1 A
3 W* j6 X, J* F
InitBoard()是我其他的函数,请忽略。GUIDEMO_Main()是用于添加官方Demo例程的。下面会说明。
程序编译通过之后下载到板子上,移植成功的话会显示如下。# W6 K$ I6 q3 s" b- `5 f
接下来就是添加官方的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文本,里面有说明适用于那个系列的。4 P6 @) K; w1 T# X5 p* L; M$ |) Q
在main函数文件中添加#include "GUIDEMO.h"头文件,接着在函数中增加SysTick_Config(SystemCoreClock / 1000);这个函数,我是利用这个SysTick定时器来做GUI的心跳的(前面已经说明),至于用定时器的方式的,请另行修改;接着增加demo的演示GUIDEMO_Main();这个函数。/ I+ |( f% q* G$ Z
在guidemo.h文件中找到下图这个家伙,这里是demo的开关哦,我这里打开了9个。如图。注意有些打开后占用空间较大可能会超出报错。/ f9 d" E9 n2 [" a1 T) O6 @' F) p! a
到此移植完毕。
评分
查看全部评分
#include "delay.h"
#include "sys.h"
这三个头文件都没, 怎么成功的?
https://www.stmcu.org.cn/module/forum/thread-615497-1-1.html
清明节放假回来了,等有空我把图片整一下
全淘宝好像就他家的便宜
是的哈哈哈