分享

STM32 裸机移植 emwin(2)

 卤煮小鱼 2018-05-31

STM32F103ZET6 emwin5.3(用的是MDK PACK里面的)

使用的工具有STM32FcubeMX,支持STM32F1系列,下载地址百度即可。

一、下载安装MX过后,打开软件,创建工程。

1、打开help选项,进入install new libraries

​下载选中的library,这个是F1的

​2、完成后退出,点击new project创建新工程如图

​3、按提示操作

​选中后双击即可。

4、​本文中准备使用FSMC操作,接着如下操作

​说明:
(1)有的板子上面可能提供的LCD液晶FSMC接口的那一排插座,你就根据实际情况改改上面的东西。

(2)chip select根据实际选择,会影响到访问LCD控制寄存器地址数据寄存器地址,寄存器地址如下

N1-0X60000000​

N2-0X64000000

N3-0X68000000

N4-0X6C000000​

又根据选择LCD register select的选择确定数据寄存器地址​ ,比如这里的用的A0,则

数据寄存器的地址=​控制寄存器地址  |  (1(2进制)向左移位(0+1)次)

​如果使用A16,则或上 1(2进制)向左移位的(16+1次)

本文中的地址是0X6C000000 | 2=0X6C000002

​(3)数据宽度自己选择

​5、使能CRC,不然用不了emwin,貌似是说版权问题

​6、使用外部晶振,以便后面配置72M时钟

​7、有JTAG的就使用JTAG

8、时钟配置

点这个标签页

​按照图片内容配置好即可。

9、配置详细FSMC内容

进入旁边一个标签页

​点击FSMC进入配置

​地址建立时间可以为0,数据建立时间至少要为1,转向时间可以为0,这是最快的了,如果你的LCD屏跟不上,就把数值调大。

​10、配置完成,点击这个按钮生成工程文件

​接着设置路径,选择使用的MDK,然后OK,生成过后点击open project即可。

二,移植emwin​

1、准备工作​

​emwim目录C:\Keil_v5\ARM\Pack\Keil\MDK-Middleware\7.0.0-beta\emWin

或者网上下载,把 emwin文件拷贝到工程文件目录下,如

添加文件夹与文件

​LCD_X_8080_16.C路径emWin\Sample\LCD_X

GUI_X.C路径emWin\Sample\GUI_X

GUIConf.c路径emWin\Sample\Config

因为使用的是emwin自带支持的驱动,所以LCDconf.c使用的路径是在emWin\Sample\LCDConf\GUIDRV_FlexColor\66708_C16_240x320

如果你的驱动也是被支持的,同理选择对应的,具体参见emWin\Doc的UM03001_emWin5.pdf

GUI_CM3_L.Lib路径emWin\Lib\ARM

2、修改

打开LCD_X_8080_16​.c文件

(1)​注释掉这段代码

#define LCD_X_READ(c)                            \

  LCD_SET_DIR_IN();                              \

  LCD_CLR_CS();                                  \

  LCD_CLR_RD();                                  \

  c = LCD_DATA_IN_L | ((U16)LCD_DATA_IN_H << 8); \

  LCD_SET_CS();                                  \

  LCD_SET_RD();                                  \

  LCD_SET_DIR_OUT()

#define LCD_X_WRITE(c)                           \

  LCD_DATA_OUT_L = (unsigned char)c;             \

  LCD_DATA_OUT_H = c >> 8;                       \

  LCD_CLR_CS();                                  \

  LCD_CLR_WR();                                  \

  LCD_SET_WR();                                  \

  LCD_SET_CS()

(2)修改初始化函数,去掉中间的代码,改成自己的初始化代码

void LCD_X_8080_16_Init(void) {

  LCD_SET_CS();

  LCD_SET_RD();

  LCD_SET_WR();

  LCD_CLR_RESET();

  LCD_DELAY(5);

  LCD_SET_RESET();

  LCD_DELAY(5);

  LCD_SET_DIR_OUT();

}

​(3)修改以下几个函数,分别是用来读写一个或多个数据用的

void LCD_X_8080_16_Init       (void);

void LCD_X_8080_16_Write00_16 (INT16U c);

void LCD_X_8080_16_Write01_16 (INT16U c);

void LCD_X_8080_16_WriteM01_16(INT16U * pData, int NumWords);

void LCD_X_8080_16_WriteM00_16(INT16U * pData, int NumWords);

INT16U  LCD_X_8080_16_Read00_16  (void);

INT16U  LCD_X_8080_16_Read01_16  (void);

void LCD_X_8080_16_ReadM00_16 (INT16U * pData, int NumWords);

void LCD_X_8080_16_ReadM01_16 (INT16U * pData, int NumWords);

例如

void LCD_X_8080_16_Write00_16(U16 c) {

  LCD_CLR_A0();

  LCD_X_WRITE(c);

}

修改成

​void LCD_X_8080_16_Write00_16(INT16U c) {

  *(__IO uint16_t *) (DRIVE_LCD_C)= c;//因为FSMC已经初始化好了,可以这样访问

}

其他自行动手​

(3)LCDconf中修改

根据实际修改分辨率

#define XSIZE_PHYS 240

#define YSIZE_PHYS 320

修改int LCD_X_DisplayDriver(unsigned LayerIndex, unsigned Cmd, void * pData)​中

​ #ifndef WIN32

    _InitController();

    #endif

    return 0;

当_InitController();不能正常初始化的时候将它修改成自己的初始化函数,或者改成LCD_X_8080_16_Init();来使用。

​(5)关于GUI_X中

在末尾添加如下函数

U32  GUI_X_GetTaskId(void){return 0;}

void GUI_X_InitOS   (void){}

void GUI_X_Unlock   (void){}

void GUI_X_Lock     (void){}

否则会报错。

三、在main.c中的while循环中加入自己的代码开始编程

 while (1)

  {

 

 

GUI_Init();

GUI_DispStringAt("Hello World!!!!!!!!!!!!!!!!", 0, 0);

  GUI_DispStringAt("Hello emWin!@@@@@@@@@@@", 0, 480-20);

  }

 


以上完成


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多