STM32移植STemwin

        一、准备基础程序

基于正点原子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:

STM32CubeF1 - STM32Cube MCU包,用于STM32F1系列(HAL、底层API和CMSIS(CORE、DSP和RTOS)、USB、TCP/IP、File system、RTOS和Graphic - 附带在以下ST板上运行的示例:STM32 Nucleo、探索套件和评估板) - STMicroelectronics

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

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值