打印
[其他ST产品]

STM32F103+UCOSIII+STEMWIN移植

[复制链接]
419|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
o88ne|  楼主 | 2022-6-30 21:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
移植步骤
1、移植源码
移植源码用正点原子已经裁剪后的源码,由于正点原子开发板与我的项目板子电路,引脚接口,LCD屏幕不同,所以移植中得做一下改动。我的板子MCU是用的STMF103ZET6。

直接用已经移植过UCOSIII的项目程序,添加STEMWIN的移植,因为同是STM32F103系列,所以移植UCOSIII方法用正点原子的方法几乎不用改代码,甚至可以直接用正点的工程文件,只要添加文件路径即可。

使用特权

评论回复
沙发
o88ne|  楼主 | 2022-6-30 21:05 | 只看该作者
2、向自己的工程添加文件
将STEMWIN源码复制到EMWIN文件夹后,按下图向工程中添加文件和头文件路径。

使用特权

评论回复
板凳
o88ne|  楼主 | 2022-6-30 21:06 | 只看该作者
其中各个文件简介
GUI_X.c:GUI所依赖的外部配置。裸板时用这个文件
GUI_X_UCOSIII.c:当用系统时,用这个文件
GUIConf.c:GUI初始化配置,使用内部内存还是外部内存,可以在这儿更改。
GUIConf.h:GUI配置设置,宏定义,更改是否支持窗口,操作系统,触摸等。
GUIDRV_Template.c: GUI读点、画点、划线等函数配置。
LCDConf_FlexColor_Template.c: LCD初始化配置,屏幕大小,分辨率,初始化函数等。
————————————————

使用特权

评论回复
地板
o88ne|  楼主 | 2022-6-30 21:07 | 只看该作者
3、修改工程文件
1)修改GUIConf.h文件
文件中定义是否使用操作系统,鼠标,窗口管理等信息,还定义了默认字体。

使用特权

评论回复
5
o88ne|  楼主 | 2022-6-30 21:08 | 只看该作者
#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  

使用特权

评论回复
6
o88ne|  楼主 | 2022-6-30 21:09 | 只看该作者
2)修改GUIConf.c文件
该文件定义了STEMWIN所使用的内存,在这里使用内存管理函数为STEMWIN分配内存,这样做的好处是可以使用外部SRAM,注意,USE_EXRAM为0,表示不用外部内存,为1,则表示使用外部内存,我的板子没有外部ram,所以令其为0.

使用特权

评论回复
7
o88ne|  楼主 | 2022-6-30 21:15 | 只看该作者
#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); //设置默认字体
        }
}

使用特权

评论回复
8
o88ne|  楼主 | 2022-6-30 21:16 | 只看该作者
GUI_NUMBYTES设置的是分配内存大小,注意该内存大小必须小于MALLOC管理的内存,我的最大管理内存是40k。

使用特权

评论回复
9
o88ne|  楼主 | 2022-6-30 21:17 | 只看该作者
3)修改GUIDRV_Template.c文件
在这文件,需完成画,读点,填充等函数的实现,16BPP的优化暂时不做,暂时修改三个函数:_SetPixelIndex(),_GetPixelIndex(),FillRect()

使用特权

评论回复
10
o88ne|  楼主 | 2022-6-30 21:18 | 只看该作者
//画点函数
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);
}

使用特权

评论回复
11
o88ne|  楼主 | 2022-6-30 21:19 | 只看该作者
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;
}

使用特权

评论回复
12
o88ne|  楼主 | 2022-6-30 21:19 | 只看该作者
这里和正点原子的不同,特别注意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初始化函数。

使用特权

评论回复
13
o88ne|  楼主 | 2022-6-30 21:20 | 只看该作者
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();

使用特权

评论回复
14
o88ne|  楼主 | 2022-6-30 21:21 | 只看该作者
单独任务里面的函数
GUI_SetBkColor(GUI_BLUE);
       
        GUI_SetColor(GUI_YELLOW);
        GUI_Clear();
        GUI_SetFont(&GUI_Font24_ASCII);
        GUI_DispStringAt("HELLOW",10,10);

使用特权

评论回复
15
o88ne|  楼主 | 2022-6-30 21:21 | 只看该作者
4、注意事项
1、将LCD自带库与GUI接口函数时,将文件名改掉,不要用LCD.h和LCD.c,否则和STEMWIN里面文件重名。我的工程用LCD1.h和LCD1.c
2、编译如果出现问题,先把触摸那部分代码注释,以后用触摸功能再来修改。
3、遗留问题,触摸部分以及16BPP的优化。


又对照着重做了一遍,是成功
————————————————

使用特权

评论回复
16
Uriah| | 2022-10-5 08:23 | 只看该作者

许多开发人员从来没有前进到更合适的分支策略

使用特权

评论回复
17
Bblythe| | 2022-10-5 11:22 | 只看该作者

当端口P1.0输出高电平时,小灯D不亮

使用特权

评论回复
18
Pulitzer| | 2022-10-5 14:21 | 只看该作者

直接查看该脚的IDR位的电平

使用特权

评论回复
19
万图| | 2023-4-1 07:20 | 只看该作者

速的印制线或器件与参考接地板之间的容性耦合

使用特权

评论回复
20
Uriah| | 2023-4-1 08:23 | 只看该作者

TIM4只是做基本时钟,不涉及外面其它硬件,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

418

帖子

3

粉丝