STM32F103+UCOSIII+STEMWIN移植
移植步骤1、移植源码
移植源码用正点原子已经裁剪后的源码,由于正点原子开发板与我的项目板子电路,引脚接口,LCD屏幕不同,所以移植中得做一下改动。我的板子MCU是用的STMF103ZET6。
直接用已经移植过UCOSIII的项目程序,添加STEMWIN的移植,因为同是STM32F103系列,所以移植UCOSIII方法用正点原子的方法几乎不用改代码,甚至可以直接用正点的工程文件,只要添加文件路径即可。
2、向自己的工程添加文件
将STEMWIN源码复制到EMWIN文件夹后,按下图向工程中添加文件和头文件路径。
其中各个文件简介
GUI_X.c:GUI所依赖的外部配置。裸板时用这个文件
GUI_X_UCOSIII.c:当用系统时,用这个文件
GUIConf.c:GUI初始化配置,使用内部内存还是外部内存,可以在这儿更改。
GUIConf.h:GUI配置设置,宏定义,更改是否支持窗口,操作系统,触摸等。
GUIDRV_Template.c: GUI读点、画点、划线等函数配置。
LCDConf_FlexColor_Template.c: LCD初始化配置,屏幕大小,分辨率,初始化函数等。
————————————————
3、修改工程文件
1)修改GUIConf.h文件
文件中定义是否使用操作系统,鼠标,窗口管理等信息,还定义了默认字体。 #ifndef GUICONF_H
#define GUICONF_H
#define GUI_NUM_LAYERS 10 // 显示的最大层数
#define GUI_OS (1)// 使用操作系统
#define GUI_MAXTASK (5)// 最大可调用EMWIN任务数
#define GUI_SUPPORT_TOUCH (0)// 支持触摸
#define GUI_DEFAULT_FONT &GUI_Font6x8 //默认字体
#define GUI_SUPPORT_MOUSE (0) //支持鼠标
#define GUI_WINSUPPORT (1) //窗口管理
#define GUI_SUPPORT_MEMDEV (1) //存储设备
#define GUI_SUPPORT_DEVICES (1) //使用设备指针
#endif
2)修改GUIConf.c文件
该文件定义了STEMWIN所使用的内存,在这里使用内存管理函数为STEMWIN分配内存,这样做的好处是可以使用外部SRAM,注意,USE_EXRAM为0,表示不用外部内存,为1,则表示使用外部内存,我的板子没有外部ram,所以令其为0. #include "GUI.h"
//#include "sram.h"
#include "malloc.h"
#define USE_EXRAM0 //使用内部RAM,STM32F103精英板没有外部SRAM,只能使用内部的!
//设置EMWIN内存大小
#define GUI_NUMBYTES(32*1024)
#define GUI_BLOCKSIZE 0X80//块大小
//GUI_X_Config
//初始化的时候调用,用来设置emwin所使用的内存
void GUI_X_Config(void) {
if(USE_EXRAM) //使用外部RAM
{
U32 *aMemory = mymalloc(SRAMEX,GUI_NUMBYTES); //从外部SRAM中分配GUI_NUMBYTES字节的内存
GUI_ALLOC_AssignMemory((void*)aMemory, GUI_NUMBYTES); //为存储管理系统分配一个存储块
GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE); //设置存储快的平均尺寸,该区越大,可用的存储快数量越少
GUI_SetDefaultFont(GUI_FONT_6X8); //设置默认字体
}else//使用内部RAM
{
U32 *aMemory = mymalloc(SRAMIN,GUI_NUMBYTES); //从内部RAM中分配GUI_NUMBYTES字节的内存
GUI_ALLOC_AssignMemory((U32 *)aMemory, GUI_NUMBYTES); //为存储管理系统分配一个存储块
GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE); //设置存储快的平均尺寸,该区越大,可用的存储快数量越少
GUI_SetDefaultFont(GUI_FONT_6X8); //设置默认字体
}
}
GUI_NUMBYTES设置的是分配内存大小,注意该内存大小必须小于MALLOC管理的内存,我的最大管理内存是40k。 3)修改GUIDRV_Template.c文件
在这文件,需完成画,读点,填充等函数的实现,16BPP的优化暂时不做,暂时修改三个函数:_SetPixelIndex(),_GetPixelIndex(),FillRect() //画点函数
static void _SetPixelIndex(GUI_DEVICE * pDevice, int x, int y, int PixelIndex) {
DrawPixel(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 = GetPoint(x, y);//主要是加这个读点函数
}
#if (LCD_MIRROR_X == 0) && (LCD_MIRROR_Y == 0) && (LCD_SWAP_XY == 0)
#undef xPhys
#undef yPhys
#endif
return PixelIndex;
}
//填充函数
static void _FillRect(GUI_DEVICE * pDevice, int x0, int y0, int x1, int y1) {
Lcd_ColorBox(x0,y0,x1-x0+1,y1-y0+1,LCD_COLORINDEX);
}
4)修改LCDConf_FlexColor_Template.c文件
#include "GUI.h"
#include "LCD1.h"
#include "touch.h"
#include "GUIDRV_Template.h"
#include "GUIDRV_FlexColor.h"
//与触摸屏有关定义,根据实际情况填写
#define TOUCH_AD_TOP 160 //按下触摸屏的顶部,写下 Y 轴模拟输入值。
#define TOUCH_AD_BOTTOM 3990 //按下触摸屏的底部,写下 Y 轴模拟输入值。
#define TOUCH_AD_LEFT 160 //按下触摸屏的左侧,写下 X 轴模拟输入值。
#define TOUCH_AD_RIGHT 3990 //按下触摸屏的右侧,写下 X 轴模拟输入值。
//屏幕大小
#define XSIZE_PHYS854 //X轴
#define YSIZE_PHYS480 //Y轴
#define VXSIZE_PHYS 854
#define VYSIZE_PHYS 480
//配置检查
#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, XSIZE_PHYS,YSIZE_PHYS);
LCD_SetVSizeEx (0, VXSIZE_PHYS,VYSIZE_PHYS);
//需要添加代码
//用到触摸时再改动
}
//显示器驱动的回调函数
int LCD_X_DisplayDriver(unsigned LayerIndex, unsigned Cmd, void * pData) {
int r;
(void) LayerIndex;
(void) pData;
switch (Cmd) {
case LCD_X_INITCONTROLLER: {
//当初始化的时候被调用,主要是设置显示控制器,如果显示控制器在外部初始化则需要用户初始化
Lcd_Initialize();
// TFTLCD_Init(); //初始化LCD 已经在开始初始化了,所以此处不需要初始化。
return 0;
}
default:
r = -1;
}
return r;
}
这里和正点原子的不同,特别注意GUI_DEVICE_CreateAndLink(&GUIDRV_Template_API, GUICC_M565, 0, 0); //创建显示驱动器件
LCD_SetSizeEx (0, XSIZE_PHYS,YSIZE_PHYS);
LCD_SetVSizeEx (0, VXSIZE_PHYS,VYSIZE_PHYS);
这三个函数,屏幕大小及分辨率的实现。
以及LCD_X_DisplayDriver函数中添加LCD初始化函数。
5)测试代码
初始化部分
CPU_SR_ALLOC();
delay_init(); //延时初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组配置
my_mem_init(SRAMIN); //内部内存初始化 注意要放在GUI_Init之前,之前放在之后,调试好久才找到问题
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC,ENABLE); //只有执行这一句,才能用STEMWIN,相当于认证使用
WM_SetCreateFlags(WM_CF_MEMDEV);
GUI_Init();
单独任务里面的函数
GUI_SetBkColor(GUI_BLUE);
GUI_SetColor(GUI_YELLOW);
GUI_Clear();
GUI_SetFont(&GUI_Font24_ASCII);
GUI_DispStringAt("HELLOW",10,10);
4、注意事项
1、将LCD自带库与GUI接口函数时,将文件名改掉,不要用LCD.h和LCD.c,否则和STEMWIN里面文件重名。我的工程用LCD1.h和LCD1.c
2、编译如果出现问题,先把触摸那部分代码注释,以后用触摸功能再来修改。
3、遗留问题,触摸部分以及16BPP的优化。
又对照着重做了一遍,是成功
————————————————
许多开发人员从来没有前进到更合适的分支策略
当端口P1.0输出高电平时,小灯D不亮
直接查看该脚的IDR位的电平
速的印制线或器件与参考接地板之间的容性耦合
TIM4只是做基本时钟,不涉及外面其它硬件,
页:
[1]