基于STM32emWin5.32的移植

2023-11-01

移植前提

1、下载所需源码

下载地址
下载完成后目录结构如下(demo目录来自CubeMAX的拷贝):重点关注Config、Lib、OS文件夹
在这里插入图片描述

2、直接拷贝Cubemx的STemwin

在这里插入图片描述
看到仓库地址路径信息,打开它
在这里插入图片描述
在这里插入图片描述

文件说明

参考

目录/文件名 说明
config 液晶驱动接口、emwin配置文件
GUIConf.c 用于配置emwin使用RAM空间的大小
GUIConf.H 用于剪裁emwin的功能
GUIDRV_Template.c LCDConf_XXXX_Template.c 应用在不同液晶时使用的驱动文件
inc emwin库核心的头文件
XXXX.h 各种关于库函数的申明、定义
Lib emwin的核心库文件
MCD-ST Image SW License Agreement V2.pdf 软件许可协议
emwin核心库文件
STemWin_CM4_wcXX.a XX=16时 适用于EWARM7 和 Keil5
STemWin_CM4_wcXX.a XX=32时 适用于EWARM8和SW4STM32
STemWin_CM4_wcXX_ot.a ot表示此核心库已做优化
STemWin_CM4_wcXX_ARGB.a ARGB 表示此核心库的逻辑颜色从高位到低位的排列顺序为 ARGB
STemWin_CM4_wcXX_to_ARGB.a 优化使用ARGB颜色排列
STemWin_CM4_OS_wcXX.a OS表示操作系统环境下使用的核心库,
其余同上
STemWin_CM4_OS_wcXX_to.a
STemWin_CM4_OS_wcXX_ARGB.a
STemWin_CM4_OS_wcXX_to_ARGB.a
STemWin_WIN32.lib STemWin_WIN32_ARGB.lib 在Windows系统中仿真使用的核心库
OS emwin 的时间相关文件
GUI_X.C 裸机环境下的延时和时基相关文件
GUI_X_OS.C 提供给操作系统的接口,用于在操作系统环境下的延时和进程调度管理
Software 包含emwin的各种PC端软件工具
JPEG2MovieScripts 视频格式转换器用到的一些脚本文件
Bin2C.exe 二进制C转换器
BmpCvtST.exe 位图转换器
emVNC.exe 通用VNC客户端
emWinPlayer.exe 视频播放器
emWinSPY.exe 运行时资源查看器
emWinView.exe 模拟查看器
FontCvST.exe 字体生成器
GUIBulider.exe 界面编辑器
JPEG2Movie.exe 视频格式转换器
license.txt 软件许可协议
U2C.EXE UTF-8编码到C转换器
Release_Notes.html 关于 emwin 库不同发行版本的简要更新说明文档

2、需已完成底层绘制LCD的驱动调试

移植

在项目工程目录增加以下文件夹及文件

在这里插入图片描述

配置单次图像刷写最大允许字节

GUIConf.c中配置:
在这里插入图片描述

配置驱动API接口及屏幕属性

LCDConf_FlexColor_Template.c配置实现画点函数等API接口选择依据液晶芯片IC型号
在这里插入图片描述

#define XSIZE_PHYS  480 // To be adapted to x-screen size
#define YSIZE_PHYS  272 // To be adapted to y-screen size
//```
//```
//````
void LCD_X_Config(void) {
  GUI_DEVICE * pDevice;
  CONFIG_FLEXCOLOR Config = {0};
  GUI_PORT_API PortAPI = {0};
  //
  // Set display driver and color conversion
  //
  pDevice = GUI_DEVICE_CreateAndLink(&GUIDRV_FLEXCOLOR, GUICC_M565, 0, 0);
  //
  // Display driver configuration, required for Lin-driver
  //
  LCD_SetSizeEx (0, XSIZE_PHYS , YSIZE_PHYS);
  LCD_SetVSizeEx(0, VXSIZE_PHYS, VYSIZE_PHYS);
  //
  // Orientation
  //
  Config.Orientation = 0;//GUI_SWAP_XY | GUI_MIRROR_Y;
  GUIDRV_FlexColor_Config(pDevice, &Config);
  //
  // Set controller and operation mode
  //
  PortAPI.pfWrite16_A0  = LcdWriteReg;
  PortAPI.pfWrite16_A1  = LcdWriteData;
  PortAPI.pfWriteM16_A1 = LcdWriteDataMultiple;
  PortAPI.pfReadM16_A1  = LcdReadDataMultiple;
  GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66708, GUIDRV_FLEXCOLOR_M16C0B16);
}


/*找不到适合的驱动*/
void LCD_X_Config(void) {
	CONFIG_FLEXCOLOR Config = {0};
	 // Set display driver and color conversion
	 //
	 GUI_DEVICE_CreateAndLink(&GUIDRV_Template_API, GUICC_M565, 0, 0);
	 //
	 // Display driver configuration, required for Lin-driver
	 //
	 LCD_SetSizeEx (0, XSIZE_PHYS , YSIZE_PHYS);
	 LCD_SetVSizeEx(0, XSIZE_PHYS, YSIZE_PHYS);
	  //
	  // Orientation
	  //
	  Config.Orientation = 0;//GUI_SWAP_XY | GUI_MIRROR_Y;
	  GUIDRV_FlexColor_Config(pDevice, &Config);
}

配置底层绘制调用接口

GUIDRV_Template.c

static void _SetPixelIndex(GUI_DEVICE * pDevice, int x, int y, int PixelIndex) {
    //
    // Convert logical into physical coordinates (Dep. on LCDConf.h)
    //
    #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);
    GUI_USE_PARA(PixelIndex);
    {
      //
      // Write into hardware ... Adapt to your system
      //
      // TBD by customer...
      //
      LCD_DrawPoint(xPhys ,yPhys ,PixelIndex); //此处调用画点函数
    }
    #if (LCD_MIRROR_X == 0) && (LCD_MIRROR_Y == 0) && (LCD_SWAP_XY == 0)
      #undef xPhys
      #undef yPhys
    #endif
}
static unsigned int _GetPixelIndex(GUI_DEVICE * pDevice, int x, int y) {
  unsigned int PixelIndex;
    //
    // Convert logical into physical coordinates (Dep. on LCDConf.h)
    //
    #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);
    {
      //
      // Write into hardware ... Adapt to your system
      //
      // TBD by customer...
      //
      //PixelIndex = 0;
      PixelIndex = LCD_ReadPoint(xPhys ,yPhys);//次处调用读点函数
    }
    #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_PIXELINDEX PixelIndex;
  int x;

  PixelIndex = LCD__GetColorIndex();
  if (GUI_pContext->DrawMode & LCD_DRAWMODE_XOR) {
    for (; y0 <= y1; y0++) {
      for (x = x0; x <= x1; x++) {
        _XorPixel(pDevice, x, y0);
      }
    }
  } else {
//    for (; y0 <= y1; y0++) {
//      for (x = x0; x <= x1; x++) {
//        _SetPixelIndex(pDevice, x, y0, PixelIndex);
//      }
//    }
    //填充画矩形
    LCD_Fill(x0,y0,x1,y1,LCD_COLORINDEX);//此处修改为画矩形函数
  }
}

配置定时器所需计时功能读写锁信号量等

GUI_X.c
在这里插入图片描述
硬件启动定时器或者直接使用systick1ms中断,本例使用定时器
在这里插入图片描述
注意需要包含头文件引用:#include "GUI.h"
在这里插入图片描述

依据操作系统增加修改以下代码,本例FreeRTOS

#include "cmsis_os.h"
    
/*********************************************************************
*
* Global data
*/
static osMutexId osMutex;
static osSemaphoreId osSemaphore;
/**********************************************************************/

/* Init OS */
void GUI_X_InitOS(void)
{ 
  /* Create Mutex lock */
  osMutexDef(MUTEX);
  
  /* Create the Mutex used by the two threads */
  osMutex = osMutexCreate(osMutex(MUTEX));
  
  /* Create Semaphore lock */
  osSemaphoreDef(SEM);
  
  /* Create the Semaphore used by the two threads */
  osSemaphore= osSemaphoreCreate(osSemaphore(SEM), 1);  
}

void GUI_X_Unlock(void)
{ 
  osMutexRelease(osMutex);
}

void GUI_X_Lock(void)
{
  osMutexWait(osMutex , osWaitForever) ;
}

/* Get Task handle */
U32 GUI_X_GetTaskId(void) 
{ 
  return ((U32) osThreadGetId());
}


void GUI_X_WaitEvent (void) 
{
  osSemaphoreWait(osSemaphore , osWaitForever) ;
}


void GUI_X_SignalEvent (void) 
{
  osMutexRelease(osSemaphore);
}

加入静态库文件

这个依据编译器选择,keil选择时注意文件类型应为lib型否则无法编译
在这里插入图片描述
在这里插入图片描述

测试代码

常用颜色及格式转换

/*常用转换*/
#define TL_GET_ARGB8888(a, r, g, b) ((((unsigned int)(a)) << 24) | (((unsigned int)(r)) << 16) | (((unsigned int)(g)) << 8) | ((unsigned int)(b)))
#define TL_GET_ARGB8888_A(rgb) ((((unsigned int)(rgb)) >> 24) & 0xFF)
#define TL_GET_RGB888(r, g, b) ((0xFF << 24) | (((unsigned int)(r)) << 16) | (((unsigned int)(g)) << 8) | ((unsigned int)(b)))
#define TL_GET_RGB888_R(rgb) ((((unsigned int)(rgb)) >> 16) & 0xFF)
#define TL_GET_RGB888_G(rgb) ((((unsigned int)(rgb)) >> 8) & 0xFF)
#define TL_GET_RGB888_B(rgb) (((unsigned int)(rgb)) & 0xFF)
#define TL_CV_RGB_32_to_16(rgb) (((((unsigned int)(rgb)) & 0xFF) >> 3) | ((((unsigned int)(rgb)) & 0xFC00) >> 5) | ((((unsigned int)(rgb)) & 0xF80000) >> 8))
#define TL_CV_RGB_16_to_32(rgb) ((0xFF << 24) | ((((unsigned int)(rgb)) & 0x1F) << 3) | ((((unsigned int)(rgb)) & 0x7E0) << 5) | ((((unsigned int)(rgb)) & 0xF800) << 8))
/*RGB565*/
#define TL_GET_RGB565_R(rgb) ((((unsigned short)(rgb)) >> 11) & 0xF800)/*11111 111111 11111*/
#define TL_GET_RGB565_G(rgb) ((((unsigned short)(rgb)) >> 5) & 0x07E0)
#define TL_GET_RGB565_B(rgb) (((unsigned short)(rgb)) & 0x001F)
#define ASSEMBLE_RGB(R, G, B)    ((((R)& 0xF8) << 8) | (((G) & 0xFC) << 3) | (((B) & 0xF8) >> 3))
/*红蓝交换*/
#define TL_CV_RGB888_SWAP(RGB)   (((unsigned int)RGB>>16&0xFF)|((unsigned int)RGB&0x00FF00)|((unsigned int)RGB<<16&0xFF0000))
/*LCD color*/
#define LCD_COLOR_WHITE          0xFFFFU
#define LCD_COLOR_BLACK          0x0000U
#define LCD_COLOR_GREY           0xF7DEU
#define LCD_COLOR_BLUE           0x001FU
#define LCD_COLOR_BLUE2          0x051FU
#define LCD_COLOR_RED            0xF800U
#define LCD_COLOR_MAGENTA        0xF81FU
#define LCD_COLOR_GREEN          0x07E0U
#define LCD_COLOR_CYAN           0x7FFFU
#define LCD_COLOR_YELLOW         0xFFE0U
#define     RED          0xF800   //红色
#define     GREEN        0x07E0   //绿色
#define     BLUE         0x001F   //蓝色
#define     WHITE        0xFFFF   //白色
#define     GRAY        0x8430    //灰色
#define     LGRAY        0xC618   //浅灰色
#define     DARKGRAY     0x8410   //深灰色
#define     PORPO        0x801F   //紫色
#define     PINK         0xF81F	  //粉色	 
#define     GRAYBLUE     0x5458   //灰蓝色
#define     LGRAYBLUE    0xA651   //浅灰蓝色
#define     DARKBLUE     0x01CF   //深灰蓝色
#define     LIGHTBLUE    0x7D7C   //浅蓝色
#define     BLACK        0x0000   //黑色
#define     YELLOW       0xFFE0   //黄色
#define     ORANGE       0xFC08   //橙色

IAR与Keil指定缓冲区地址的两种方式

#if defined(__ICCARM__) 
/*IAR版本:定义帧缓冲区地址*/ 
uint16_t ltdc_layer0[LCD_PIXEL_HEIGHT][LCD_PIXEL_WIDTH] @LCD_FRAME_BUFFER;  
uint16_t ltdc_layer1[LCD_PIXEL_WIDTH][LCD_PIXEL_HEIGHT] @(LCD_FRAME_BUFFER+BUFFER_OFFSET);  
#else defined(__CC_ARM) || defined(__GNUC__)
/*MDK版本:定义帧缓冲区地址*/ 
uint16_t ltdc_layer0[LCD_PIXEL_HEIGHT][LCD_PIXEL_WIDTH] __attribute__((at(LCD_FRAME_BUFFER)));
uint16_t ltdc_layer1[LCD_PIXEL_HEIGHT][LCD_PIXEL_WIDTH] __attribute__((at(LCD_FRAME_BUFFER+BUFFER_OFFSET)));

测试GUI绘制接口

void MainWindow_Init(void)
{
    GUI_Init();
  
    GUI_SetBkColor(GUI_BLUE);   //设置背景颜色
    GUI_SetColor(GUI_YELLOW);   //设置颜色
    GUI_Clear();                //清屏
  
    GUI_SetFont(GUI_FONT_24_ASCII); //设置字体
    GUI_DispStringAt("HELLO WORD!", 0, 0);
    GUI_DispStringAt("123456789", 0, 200);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于STM32emWin5.32的移植 的相关文章

  • 网站服务器ip地址在哪里改,网站服务器ip地址在哪里改

    网站服务器ip地址在哪里改 内容精选 换一换 成功访问网站包含以下两个阶段 这两个阶段缺一不可 需要同时成功才能正常访问网站 如图1所示 阶段一 DNS根据访问请求中的域名解析出对应的IP地址 阶段二 访问网站服务器IP获取网站内容 阶段一

随机推荐

  • spring使用AOP技术对DAO层操作进行增强功能

    AOP的概述 1 什么是AOP的技术 在软件业 AOP为Aspect Oriented Programming的缩写 意为 面向切面编程 AOP是一种编程范式 隶属于软工范畴 指导开发者如何组织程序结构 AOP最早由AOP联盟的组织提出的
  • 10.Docker容器镜像体积缩小之奇技淫巧

    文章目录 0x00 前言简述 0x01 基础环境 0x02 Docker 最佳实践补充 0x03 镜像体积缩减实战 1 奇技淫巧构建镜像体积减小 99 2 FROM scratch 的魔力 0x04 补充说明 openjdk镜像的tag说明
  • vue-cli3.0引入高德3d动画效果方法一:

    前言 因为两个方法代码量都特别大 这里分2个页面详细说一下 这个页面是方法一 包括vue cli3 0中使用和html中使用两种示例 注意 这里有想看另一种方法的童鞋请点入口 https blog csdn net qq 41619796
  • VuePress在Node.js高版本报digital envelope routines::unsupported错误的解决方法

    前言 本篇在讲什么 博主之前使用Node js的版本时10 几 如今更新系统到Win10后 之前的项目在编译的时候碰到了错误digital envelope routines unsupported 提高阅读体验 一级标题 二级标题 三级标
  • Python 学习第一天 感谢嵩天老师

    Hello World I 描述 这是学习每种程序设计语言的第一个实例 输出Hello World 注意大小写 print Hello World
  • HTTPS原理

    前置知识 在阅读本文章之前需要知道什么是哈希 什么是对称加密 什么是非对称加密 什么是数字证书 什么是数字签名 什么是数字证书 Digital Certificate 什么是数字签名 Digital Signature codereasy的
  • 【计算机毕业设计】基于微信小程序的高校实验室管理系统 基于微信小程序的实验室预约系统

    毕设帮助 源码交流 技术解答 见文末 一 前言 高校实验室是进行教学 科研 创新与实践的重要基地 其建设与管理水平直接关系到人才培养的质量问题 随着国家中长期发展纲要的颁布以及对高等教育的大量投入 高校实验教学与科学研究条件得到根本性改善
  • RocektMQ社区"每周直播分享第6期"如约而至

    分享题目 RocketMQ路由机制与联通性交互设计原理 直播方式 钉钉群直播方式 群号 21791227 分享时间 2019 01 10 20 00 21 30 本周四 内容简介 源码分析RocketMQ Topic路由机制与NameSer
  • GoLand系统当前时间的前一天或后一天

    前一天 curTime time Now 获取系统当前时间 h fmt Sprintf dh 24 减去24小时 前一天 dh time ParseDuration h timeStr curTime Add dh Format 20060
  • C++ Primer Plus 第10章 对象和类

    第10章 对象和类 思维导图 1 OOP特性和相关概念 1 1 接口 接口是一个共享框架 由编写类的人提供的方法组成 使得程序能够使用类对象 1 2 抽象 类的公共接口就是对类的抽象 1 3 用户定义类型 构成基本类型的要素 决定数据对象需
  • 小程序 图片和文字放在一行对齐的方法

  • MYSQL索引与B+树

    什么是索引 索引是一种排好序的可以快速查找数据的数据结构 索引存储位置 通常 索引本身很大 不能完全存储在内存中 因此索引通常作为索引文件存储在磁盘上 在这种情况下 在索引查找过程中会生成磁盘I O消耗 I O访问消耗比内存访问高几个数量级
  • 系统环境变量PATH,无法编辑和新增路径时的解决办法

    场景 新电脑配置环境变量 在系统已经配置MAVEN HOME 加PATH路径时 显示已经添加成功 mvn脚本无法执行 再次看PATH路径 显示并没有保存 试了几次后还是一样 解决思路 先百度了这个情况 都说关闭杀毒软件 可是本人电脑并未安装
  • 读者手册(必读)

    目录 一 代码报错求助 二 关于资源下载 三 CSDN文章质量分查询 四 各个操作系统的ISO纯净版 一 代码报错求助 1 任何资源和问题可以关注公众号 云边的快乐猫 一定可以给你解决 2 我的动态交流地方 大家有什么问题可以私信我或者动态
  • 【论文&模型讲解】CLIP(Learning Transferable Visual Models From Natural Language Supervision)

    文章目录 前言 0 摘要 1 Introduction and Motivating Work 2 Approach 2 0 模型整体结构 2 1 数据集 2 2 选择一种高效的预训练方法 2 3 模型选择与缩放 2 4 训练 3 实验 3
  • 前端自动埋点

    起源是在测试时候没有报错 系统功能不正常 和测试查找错误很麻烦 埋点就是在某个功能函数里上报一些信息 比较类试express的中间件机制 但是没有操作的权限 自定义express的打印日志中间件 app get req res gt con
  • uniapp关闭顶部导航栏

    在page json中输入以下代码 navigationStyle custom app plus titleNView false
  • 微信小程序+uni-app知识点总结

    微信小程序知识点合集 1 小程序的优势和劣势有哪些 优势 1 容易推广 在微信中 小程序拥有众多入口 例如附近的小程序 小程序码 分享 发现 小程序等五十多个的入口 这些都有助于推广小程序 2 使用便捷 用户在使用小程序时 只需要轻轻点一下
  • Varnish的简单配置及使用

    一 Varnish的简单介绍 1 varnish是什么 Varnish是一个web加速器 被安装在web应用程序前面 缓存web应用程序 并响应用户请求 是一款具有高性能的开源HTTP加速器 具有方向代理及缓存的功能 功能与squid服务器
  • 基于STM32emWin5.32的移植

    基于STM32emWin532版本的移植 移植前提 1 下载所需源码 2 直接拷贝Cubemx的STemwin 文件说明 2 需已完成底层绘制LCD的驱动调试 移植 在项目工程目录增加以下文件夹及文件 配置单次图像刷写最大允许字节 配置驱动