[其他ST产品] STM32F103+UCOSIII+STEMWIN移植

[复制链接]
793|19
 楼主| o88ne 发表于 2022-6-30 21:04 | 显示全部楼层 |阅读模式
移植步骤
1、移植源码
移植源码用正点原子已经裁剪后的源码,由于正点原子开发板与我的项目板子电路,引脚接口,LCD屏幕不同,所以移植中得做一下改动。我的板子MCU是用的STMF103ZET6。

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

 楼主| o88ne 发表于 2022-6-30 21:05 | 显示全部楼层
2、向自己的工程添加文件
将STEMWIN源码复制到EMWIN文件夹后,按下图向工程中添加文件和头文件路径。
1231162bd9fb4a0443.png
 楼主| 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文件
文件中定义是否使用操作系统,鼠标,窗口管理等信息,还定义了默认字体。
 楼主| o88ne 发表于 2022-6-30 21:08 | 显示全部楼层
  1. #ifndef GUICONF_H
  2. #define GUICONF_H

  3. #define GUI_NUM_LAYERS            10   // 显示的最大层数

  4. #define GUI_OS                    (1)  // 使用操作系统
  5. #define GUI_MAXTASK                                  (5)  // 最大可调用EMWIN任务数
  6. #define GUI_SUPPORT_TOUCH         (0)  // 支持触摸

  7. #define GUI_DEFAULT_FONT          &GUI_Font6x8        //默认字体
  8. #define GUI_SUPPORT_MOUSE             (0)            //支持鼠标
  9. #define GUI_WINSUPPORT                (1)            //窗口管理
  10. #define GUI_SUPPORT_MEMDEV            (1)            //存储设备
  11. #define GUI_SUPPORT_DEVICES           (1)            //使用设备指针
  12. #endif  

 楼主| o88ne 发表于 2022-6-30 21:09 | 显示全部楼层
2)修改GUIConf.c文件
该文件定义了STEMWIN所使用的内存,在这里使用内存管理函数为STEMWIN分配内存,这样做的好处是可以使用外部SRAM,注意,USE_EXRAM为0,表示不用外部内存,为1,则表示使用外部内存,我的板子没有外部ram,所以令其为0.
 楼主| o88ne 发表于 2022-6-30 21:15 | 显示全部楼层
  1. #include "GUI.h"
  2. //#include "sram.h"
  3. #include "malloc.h"

  4. #define USE_EXRAM  0        //使用内部RAM,STM32F103精英板没有外部SRAM,只能使用内部的!
  5. //设置EMWIN内存大小
  6. #define GUI_NUMBYTES  (32*1024)
  7. #define GUI_BLOCKSIZE 0X80  //块大小

  8. //GUI_X_Config
  9. //初始化的时候调用,用来设置emwin所使用的内存
  10. void GUI_X_Config(void) {
  11.         if(USE_EXRAM) //使用外部RAM
  12.         {
  13.                 U32 *aMemory = mymalloc(SRAMEX,GUI_NUMBYTES); //从外部SRAM中分配GUI_NUMBYTES字节的内存
  14.                 GUI_ALLOC_AssignMemory((void*)aMemory, GUI_NUMBYTES); //为存储管理系统分配一个存储块
  15.                 GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE); //设置存储快的平均尺寸,该区越大,可用的存储快数量越少
  16.                 GUI_SetDefaultFont(GUI_FONT_6X8); //设置默认字体
  17.         }else  //使用内部RAM
  18.         {
  19.                 U32 *aMemory = mymalloc(SRAMIN,GUI_NUMBYTES); //从内部RAM中分配GUI_NUMBYTES字节的内存
  20.                 GUI_ALLOC_AssignMemory((U32 *)aMemory, GUI_NUMBYTES); //为存储管理系统分配一个存储块
  21.                 GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE); //设置存储快的平均尺寸,该区越大,可用的存储快数量越少
  22.                 GUI_SetDefaultFont(GUI_FONT_6X8); //设置默认字体
  23.         }
  24. }

 楼主| o88ne 发表于 2022-6-30 21:16 | 显示全部楼层
GUI_NUMBYTES设置的是分配内存大小,注意该内存大小必须小于MALLOC管理的内存,我的最大管理内存是40k。
 楼主| o88ne 发表于 2022-6-30 21:17 | 显示全部楼层
3)修改GUIDRV_Template.c文件
在这文件,需完成画,读点,填充等函数的实现,16BPP的优化暂时不做,暂时修改三个函数:_SetPixelIndex(),_GetPixelIndex(),FillRect()
 楼主| o88ne 发表于 2022-6-30 21:18 | 显示全部楼层
  1. //画点函数
  2. static void _SetPixelIndex(GUI_DEVICE * pDevice, int x, int y, int PixelIndex) {
  3.         DrawPixel(x,y,PixelIndex);
  4.         }

  5. //读点函数
  6. static unsigned int _GetPixelIndex(GUI_DEVICE * pDevice, int x, int y) {
  7.         unsigned int PixelIndex;
  8.     #if (LCD_MIRROR_X == 1) || (LCD_MIRROR_Y == 1) || (LCD_SWAP_XY == 1)
  9.       int xPhys, yPhys;

  10.       xPhys = LOG2PHYS_X(x, y);
  11.       yPhys = LOG2PHYS_Y(x, y);
  12.     #else
  13.       #define xPhys x
  14.       #define yPhys y
  15.     #endif
  16.     GUI_USE_PARA(pDevice);
  17.     GUI_USE_PARA(x);
  18.     GUI_USE_PARA(y);
  19.     {
  20.                         PixelIndex = GetPoint(x, y);  //主要是加这个读点函数
  21.     }
  22.     #if (LCD_MIRROR_X == 0) && (LCD_MIRROR_Y == 0) && (LCD_SWAP_XY == 0)
  23.       #undef xPhys
  24.       #undef yPhys
  25.     #endif
  26.   return PixelIndex;       
  27. }

  28. //填充函数
  29. static void _FillRect(GUI_DEVICE * pDevice, int x0, int y0, int x1, int y1) {
  30.         Lcd_ColorBox(x0,y0,x1-x0+1,y1-y0+1,LCD_COLORINDEX);
  31. }

 楼主| o88ne 发表于 2022-6-30 21:19 | 显示全部楼层
4)修改LCDConf_FlexColor_Template.c文件
  1. #include "GUI.h"
  2. #include "LCD1.h"
  3. #include "touch.h"
  4. #include "GUIDRV_Template.h"
  5. #include "GUIDRV_FlexColor.h"

  6. //与触摸屏有关定义,根据实际情况填写
  7. #define TOUCH_AD_TOP                160          //按下触摸屏的顶部,写下 Y 轴模拟输入值。
  8. #define TOUCH_AD_BOTTOM                3990         //按下触摸屏的底部,写下 Y 轴模拟输入值。
  9. #define TOUCH_AD_LEFT                 160                //按下触摸屏的左侧,写下 X 轴模拟输入值。
  10. #define TOUCH_AD_RIGHT                3990        //按下触摸屏的右侧,写下 X 轴模拟输入值。


  11. //屏幕大小
  12. #define XSIZE_PHYS  854 //X轴
  13. #define YSIZE_PHYS  480 //Y轴
  14. #define VXSIZE_PHYS        854
  15. #define VYSIZE_PHYS 480



  16. //配置检查
  17. #ifndef   VXSIZE_PHYS
  18.   #define VXSIZE_PHYS XSIZE_PHYS
  19. #endif
  20. #ifndef   VYSIZE_PHYS
  21.   #define VYSIZE_PHYS YSIZE_PHYS
  22. #endif
  23. #ifndef   XSIZE_PHYS
  24.   #error Physical X size of display is not defined!
  25. #endif
  26. #ifndef   YSIZE_PHYS
  27.   #error Physical Y size of display is not defined!
  28. #endif
  29. #ifndef   GUICC_565
  30.   #error Color conversion not defined!
  31. #endif
  32. #ifndef   GUIDRV_FLEXCOLOR
  33.   #error No display driver defined!
  34. #endif

  35.   

  36. //配置程序,用于创建显示驱动器件,设置颜色转换程序和显示尺寸
  37. void LCD_X_Config(void) {
  38.         GUI_DEVICE_CreateAndLink(&GUIDRV_Template_API, GUICC_M565, 0, 0); //创建显示驱动器件
  39.         LCD_SetSizeEx    (0, XSIZE_PHYS,YSIZE_PHYS);   
  40.         LCD_SetVSizeEx   (0, VXSIZE_PHYS,VYSIZE_PHYS);
  41.         //需要添加代码
  42.        
  43.         //用到触摸时再改动

  44. }


  45. //显示器驱动的回调函数
  46. int LCD_X_DisplayDriver(unsigned LayerIndex, unsigned Cmd, void * pData) {
  47.   int r;
  48.   (void) LayerIndex;
  49.   (void) pData;
  50.   
  51.   switch (Cmd) {
  52.   case LCD_X_INITCONTROLLER: {
  53.         //当初始化的时候被调用,主要是设置显示控制器,如果显示控制器在外部初始化则需要用户初始化
  54.         Lcd_Initialize();
  55.         //        TFTLCD_Init(); //初始化LCD 已经在开始初始化了,所以此处不需要初始化。
  56.     return 0;
  57.   }
  58.                 default:
  59.     r = -1;
  60.         }
  61.   return r;
  62. }
 楼主| 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初始化函数。
 楼主| o88ne 发表于 2022-6-30 21:20 | 显示全部楼层
5)测试代码
初始化部分
  1.     CPU_SR_ALLOC();
  2.         delay_init();       //延时初始化
  3.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组配置
  4.         my_mem_init(SRAMIN);   //内部内存初始化   注意要放在GUI_Init之前,之前放在之后,调试好久才找到问题
  5.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC,ENABLE);    //只有执行这一句,才能用STEMWIN,相当于认证使用
  6.         WM_SetCreateFlags(WM_CF_MEMDEV);
  7.         GUI_Init();
 楼主| o88ne 发表于 2022-6-30 21:21 | 显示全部楼层
单独任务里面的函数
  1. GUI_SetBkColor(GUI_BLUE);
  2.        
  3.         GUI_SetColor(GUI_YELLOW);
  4.         GUI_Clear();
  5.         GUI_SetFont(&GUI_Font24_ASCII);
  6.         GUI_DispStringAt("HELLOW",10,10);
 楼主| o88ne 发表于 2022-6-30 21:21 | 显示全部楼层
4、注意事项
1、将LCD自带库与GUI接口函数时,将文件名改掉,不要用LCD.h和LCD.c,否则和STEMWIN里面文件重名。我的工程用LCD1.h和LCD1.c
2、编译如果出现问题,先把触摸那部分代码注释,以后用触摸功能再来修改。
3、遗留问题,触摸部分以及16BPP的优化。


又对照着重做了一遍,是成功
————————————————
Uriah 发表于 2022-10-5 08:23 | 显示全部楼层

许多开发人员从来没有前进到更合适的分支策略
Bblythe 发表于 2022-10-5 11:22 | 显示全部楼层

当端口P1.0输出高电平时,小灯D不亮
Pulitzer 发表于 2022-10-5 14:21 | 显示全部楼层

直接查看该脚的IDR位的电平
万图 发表于 2023-4-1 07:20 | 显示全部楼层

速的印制线或器件与参考接地板之间的容性耦合
Uriah 发表于 2023-4-1 08:23 | 显示全部楼层

TIM4只是做基本时钟,不涉及外面其它硬件,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

426

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部