STM32F103ZET6 emwin5.3(用的是MDK PACK里面的) 使用的工具有STM32FcubeMX,支持STM32F1系列,下载地址百度即可。 一、下载安装MX过后,打开软件,创建工程。 1、打开help选项,进入install new libraries 下载选中的library,这个是F1的 2、完成后退出,点击new project创建新工程如图 3、按提示操作 选中后双击即可。 4、本文中准备使用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); }
以上完成 |
|