一、准备基础程序
基于正点原子stm32战舰开发板的移植
1、 正点原子程序下载:
-
资料盘 战舰
开发板资料A盘: https://pan.baidu.com/s/1qZgG-UAznhQWgGcX8yFduQ 提取码:zz5e -
因为需要用到malloc,选择实验37 内存管理实验。
-
2、更改基本文件
-
1、创建FWLIB文件夹
-
2、把STM32F10xx_FWLib文件夹装入新建的FWLIB文件中
打开工程会发现FWLib出现图示情况。
很明显,文件无法正常使用,是因为更改了STM32F10xx_FWLib文件夹路径,则需要重新添加文件
第一步:右键FWLib文件夹 选择 RemoveGroup ‘FWLib’ and its Files
第二步:根据下图所示操作
选择创建的FWLIB文件中STM32F10xx_FWLib文件下的src文件夹并选择上图出错文件并添加
第三步、更改头文件路径
更改完成,记住运行一下程序,到这里按照步骤来是不会出现错误的;如果有错检查一下文件是否添加完全。
3、LCD文件的更改
1.打开文件下的hardware找到LCD文件,并把LCD文件名改成其他(可以根据自己喜好更改)避免与emwin文件冲突
2.更改程序中的lcd
此时可以看到程序中lcd.c文件出现警告,跟之前更改库文件同样步骤,这里就不重复展示。
添加之后就需要在代码中更改引用的头文件了,此时可以跑一遍程序,根据错误提示一步一步修改,直至无错误。
3.修改ILI93xx.h文件中 LCD的宏定义(战舰版精英版有,mini版无)
此处可以随意命名,目的是防止与emwin文件中的LCD函数冲突。
既然修改了宏定义,那么ILI93xx.c文件中的LCD函数同样需要更改(同样,可以先运行程序,根据错误提示,一步一步修改,直至无错)
还有就是修改LCD_Init()同样为了防止与emwin冲突,这里我们把LCD_Init();函数修改成TFTLCD_Init()
头文件
main.c
到这里,基础程序就已经准备完成了,接下来就是STemwin的移植。
二、导入STemwin文件
1、下载emwin文件
1.ST意法半导体官网下载:(目前根据正点原子教程,不管是stemwin还是cubeF1下载的文件因为更新迭代的原因,与教程都无法对应上,所以目前直接从正点原子提供的资料中复制出来。后续若找到对应步骤,会补上这一块)
emwin:STemWin - 用于构建图形用户界面(GUI)的专业图形栈库(AN4323) - STMicroelectronics
cubeF1:
2、导入emwin文件
可以在正点原子资料盘一下路径找到cubeF1压缩包(资料盘(A盘)\6,软件资料\3,EMWIN学习资料\3,EMWIN学习资料)
解压并打开找到STemwin文件夹,直接把STemwin复制到自己的工程文件夹下
接下来就是添加需要用到的emwin文件。同样的步骤,在如图所画的文件夹,添加右侧所示文件
此时发现添加好的文件都带有一个符号,表示此文件是只读文件,需要去修改文件属性
右键STemwin文件夹,代开属性,把图中的只读取消勾选。
更改之后就可以看到,之前的符号已经消失,文件可以被更改了。
同样,还有头文件路径的添加(凡是有.h文件的路径都添加,就算不用也没错)
在添加kile的lib文件 (STemwin\STemWin\Lib)使用带操作系统的就选OS 不带操作系统的就用STemwin526_CM3_Keil.lib
其余不用的lib文件都可以删除
到这里可以尝试跑一下程序,会出现下图错误
找不到LCDCondf.h,这时就需要我们自己添加一个LCDConf.h文件
右键STemwin文件夹,选择Add New Item to.....;如图所示,添加LCDConf.h文件
文件中写入如下代码(也可不写)
#ifndef LCDCONF_H
#define LCDCONF_H
#endif
此时再编译,就不会报错了。
接下来就是修改emwin文件的代码;首先是GUIConf.c、GUIConf.h文件(源文件过于复杂,精简下来有用的就这一点)
修改GUIDRV_Template.c文件 ,这个文件需要修改SetPixelIndex(), _GetPixelIndex(),_FillRect()和_DrawBitBPP();
1.打点函数和读点函数修改
应用了ILI93xx的函数,所以需要加入头文件
/*********************************************************************
打点函数
*/
static void _SetPixelIndex(GUI_DEVICE * pDevice, int x, int y, int PixelIndex) {
LCD_Fast_DrawPoint(x,y,PixelIndex);
}
/*********************************************************************
*
读点函数
*/
static unsigned int _GetPixelIndex(GUI_DEVICE * pDevice, int x, int y) {
unsigned int PixelIndex;
#if (LCD_MIRROR_X == 1) || (LCD_MIRROR_Y == 1) || (LCD_SWAP_XY == 1)
int xPhys, yPhys;
xPhys = LOG2PHYS_X(x, y);
yPhys = LOG2PHYS_Y(x, y);
#else
#define xPhys x
#define yPhys y
#endif
GUI_USE_PARA(pDevice);
GUI_USE_PARA(x);
GUI_USE_PARA(y);
{
PixelIndex = LCD_ReadPoint(x,y);
}
#if (LCD_MIRROR_X == 0) && (LCD_MIRROR_Y == 0) && (LCD_SWAP_XY == 0)
#undef xPhys
#undef yPhys
#endif
return PixelIndex;
}
填充函数
* _FillRect 填充函数
*/
static void _FillRect(GUI_DEVICE * pDevice, int x0, int y0, int x1, int y1) {
LCD_Fill(x0,y0,x1,y1,LCD_COLORINDEX);
}
16BPP优化
/*********************************************************************
*
* Draw Bitmap 16 BPP, not optimized
*
* Purpose:
* Drawing of 16bpp high color bitmaps.
* Only required for 16bpp color depth of target. Should be removed otherwise.
*/
static void _DrawBitLine16BPP(GUI_DEVICE * pDevice, int x, int y, U16 const GUI_UNI_PTR * p, int xsize) {
LCD_PIXELINDEX pixel;
LCD_SetCursor(x,y);
*(__IO uint16_t *)(UCGUI_LCD_CMD) = lcddev.wramcmd; //写入颜色值
for (;xsize > 0; xsize--, x++, p++)
{
pixel = *p;
*(__IO uint16_t *)(UCGUI_LCD_DATA) =pixel;
}
}
修改之后会发现这两个函数报错:UCGUI_LCD_CMD,UCGUI_LCD_DATA,此时就需要在前面写入宏定义
修改LCDConf_FlexColor_Template.c文件 此文件很多函数不用,所以直接贴代码
#include "GUI.h"
#include "ILI93xx.h"
#include "GUIDRV_FlexColor.h"
//屏幕大小
#define XSIZE_PHYS 320 //X轴
#define YSIZE_PHYS 240 //Y轴
#define VXSIZE_PHYS 320
#define VYSIZE_PHYS 240
//配置检查
#ifndef VXSIZE_PHYS
#define VXSIZE_PHYS XSIZE_PHYS
#endif
#ifndef VYSIZE_PHYS
#define VYSIZE_PHYS YSIZE_PHYS
#endif
#ifndef XSIZE_PHYS
#error Physical X size of display is not defined!
#endif
#ifndef YSIZE_PHYS
#error Physical Y size of display is not defined!
#endif
#ifndef GUICC_565
#error Color conversion not defined!
#endif
#ifndef GUIDRV_FLEXCOLOR
#error No display driver defined!
#endif
//配置程序,用于创建显示驱动器件,设置颜色转换程序和显示尺寸
void LCD_X_Config(void) {
GUI_DEVICE_CreateAndLink(&GUIDRV_Template_API, GUICC_M565, 0, 0); //创建显示驱动器件
LCD_SetSizeEx (0, lcddev.width, lcddev.height);
LCD_SetVSizeEx (0, lcddev.width, lcddev.height);
}
//显示器驱动的回调函数
int LCD_X_DisplayDriver(unsigned LayerIndex, unsigned Cmd, void * pData) {
int r;
(void) LayerIndex;
(void) pData;
switch (Cmd) {
case LCD_X_INITCONTROLLER: {
//当初始化的时候被调用,主要是设置显示控制器,如果显示控制器在外部初始化则需要用户初始化
// TFTLCD_Init(); //初始化LCD 已经在开始初始化了,所以此处不需要初始化。
return 0;
}
default:
r = -1;
}
return r;
}
到这里,基本已经修改完成了,可以试着编译一下;可以优化一下STemwin文件夹,相较来说,STemwin占用内存过大,优化可直接删除不用的文件夹,如下图所示
三、调用STemwin
在修改完程序后,此时就可以在main函数里面调用STemwin了,不要忘记添加头文件
示例:
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "ILI93xx.h"
#include "usart.h"
#include "sram.h"
#include "malloc.h"
#include "GUI.h"
/************************************************
ALIENTEK精英STM32开发板STemWin实验
STemWin 移植实验
技术支持:www.openedv.com
淘宝店铺:http://eboard.taobao.com
关注微信公众平台微信号:"正点原子",免费获取STM32资料。
广州市星翼电子科技有限公司
作者:正点原子 @ALIENTEK
************************************************/
int main(void)
{
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //LED端口初始化
TFTLCD_Init(); //LCD初始化
KEY_Init(); //按键初始化
FSMC_SRAM_Init(); //初始化SRAM
my_mem_init(SRAMIN); //初始化内部内存池
my_mem_init(SRAMEX); //初始化外部内存池【
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC,ENABLE);//使能CRC时钟,否则STemWin不能使用
// WM_SetCreateFlags(WM_CF_MEMDEV);
GUI_Init();
// GUIDEMO_Main();
GUI_SetBkColor(GUI_BLUE);
GUI_SetColor(GUI_RED);
GUI_SetFont(GUI_FONT_24_ASCII);
GUI_Clear();
GUI_DispStringAt("HELLO WORLDsdsdsd",100,100);//显示字符串
while(1);
}
四、结果展示
示例程序:
百度网盘:链接:https://pan.baidu.com/s/1InASyinDMdrtmEFften5EA?pwd=wf3b
提取码:wf3b