STM32F103+UCOSIII+STEMWIN移植

1 篇文章 0 订阅
1 篇文章 0 订阅

移植步骤

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_EXRAM  0	//使用内部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_PHYS  854 //X轴
#define YSIZE_PHYS  480 //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的优化。

博客写完之后又对照着重做了一遍,是成功的。

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值