目录

一、资料准备

二、目录简介

三、裸机移植

3.1 添加文件

3.2 修改文件

四、含FreeRTOS移植

五、测试

5.1 裸机测试

5.2 含系统测试


一、资料准备

裸机时空工程:stm32H743+0.96寸OLED 屏幕

FreeRTOS空工程:stm32H743+0.96寸OLED 屏幕+FreeRTOS

STEmwin:STemWin_Library_V1.2.0:https://www.st.com/en/embedded-software/stemwin.htmlhttps://www.st.com/en/embedded-software/stemwin.html

二、目录简介

STemWin_Library_V1.2.0\Libraries\STemWinLibrary532

  1. Config文件夹:LCD接口以及emwin配置文件,移植时使用
  2. Documentation:STEmwin的函数说明文件
  3. inc:STEmwin函数的头文件,移植时使用
  4. Lib:STEmwin的函数库,移植时使用我们是H7,内核是CM7,开发环境为Keil。所以裸机程序选用STemWin532_CM7_Keil.lib,OS是选用STemWin532_CM7_OS_Keil.lib
  5. OS:裸机情况下的驱动文件:选用GUI_X.c,使用OS是使用GUI_X_OS.c
  6. Simulation:仿真用到的文件
  7. Software:STEmwin开发使用到的软件

三、裸机移植

3.1 添加文件

将STemWinLibrary532文件复制到工程文件夹中,并重名为STEmwin文件夹,

向工程里添加文件:

添加头文件路径后进行编译,发现提示没有LCDConf.h,我们自己新建一个该文件放到STEmwin下的Config文件夹中。再编译就没有报错了。

CUI_X.c:GUI所依赖的外部配置;

CUIConf.c:GUI初始化配置;

CUIConf.h:GUI配置设置;

CUIDRV_Template.c:GUI读点、画点、画线等函数配置,需要我们根据自己的LCD驱动函数进行修改;

LCDConf_FlexColor_Template.c:LCD的初始化配置

STemWin532_CM7_Keil.lib:裸机对应的STEmwin函数库文件

3.2 修改文件

GUIConf.h:

设置是否使用操作系统、是否支持触摸、默认字体、显示的最大层数等参数。由于是裸机,设置OS_SUPPORT为0,而0.96寸的OLED 屏幕不支持触摸,则设置GUI_SUPPORT_TOUCH为0, 设置默认字体 GUI_DEFAULT_FONT为 &GUI_Font6x8;其他参数如下。


#ifndef GUICONF_H
#define GUICONF_H#define GUI_NUM_LAYERS            2    // Maximum number of available layers
#define OS_SUPPORT                0
#define GUI_SUPPORT_TOUCH           0#ifdef OS_SUPPORT#define GUI_OS                    (1)  // Compile with multitasking support
#else#define GUI_OS                    (0)
#endif#ifndef   GUI_SUPPORT_TOUCH#define GUI_SUPPORT_TOUCH       (1)  // Support touchscreen
#endif#define GUI_DEFAULT_FONT          &GUI_Font6x8#define GUI_SUPPORT_MOUSE             (0)    /* Support a mouse */
#define GUI_WINSUPPORT                (1)    /* Use window manager */
#define GUI_SUPPORT_MEMDEV            (1)    /* Memory device package available */
#define GUI_SUPPORT_DEVICES           (1)    /* Enable use of device pointers */#endif  /* Avoid multiple inclusion */

GUIConf.c:定义了STEmwin所使用的的内存,并使用申请此内存。

#include "GUI.h"#define GUI_NUMBYTES  30*1024
#define GUI_BLOCKSIZE 0x80void GUI_X_Config(void) {static U32 aMemory[GUI_NUMBYTES / 4];GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES);GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);GUI_SetDefaultFont(GUI_FONT_6X8);
}

GUIDRV_Template.c中需要修改两个函数_SetPixelIndex、_GetPixelIndex。

_SetPixelIndex为画点函数,其中需要我们自己修改,添加OLED 屏幕驱动的画点函数,

static void _SetPixelIndex(GUI_DEVICE * pDevice, int x, int y, 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#endifGUI_USE_PARA(pDevice);GUI_USE_PARA(x);GUI_USE_PARA(y);GUI_USE_PARA(PixelIndex);{OLED_DrawPoint(xPhys,yPhys,PixelIndex);//0.96寸OLED 屏幕画点函数}#if (LCD_MIRROR_X == 0) && (LCD_MIRROR_Y == 0) && (LCD_SWAP_XY == 0)#undef xPhys#undef yPhys#endif
}

_GetPixelIndex为读点函数,其中也需要我们自己修改,添加OLED 屏幕驱动的读点函数,

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#endifGUI_USE_PARA(pDevice);GUI_USE_PARA(x);GUI_USE_PARA(y);{//PixelIndex = 0;PixelIndex = OLED_GetPixel(xPhys,yPhys);//0.96寸OLED 屏幕读点函数}#if (LCD_MIRROR_X == 0) && (LCD_MIRROR_Y == 0) && (LCD_SWAP_XY == 0)#undef xPhys#undef yPhys#endifreturn PixelIndex;
}

编译通过

四、含FreeRTOS移植

基本与裸机移植一致,不一样的是

  1. 裸机程序选用STemWin532_CM7_Keil.lib,现在OS是选用STemWin532_CM7_OS_Keil.lib
  2. 裸机选用GUI_X.c,现在OS是选用GUI_X_OS.c

最重要的现在使用的FreeRTOS,所以GUI_X_OS.c具体选用GUI_X_FreeRTOS.c文件。

/*File        : GUI_X_FreeRTOS.C*/
#include "GUI.h"/* FreeRTOS头文件 */
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"static xSemaphoreHandle xQueueMutex = NULL;
static xSemaphoreHandle xSemaTxDone = NULL;int GUI_X_GetTime(void)
{return ((int) xTaskGetTickCount());
}void GUI_X_Delay(int ms)
{vTaskDelay( ms );
}void GUI_X_Init(void) {
}void GUI_X_ExecIdle(void) {
}void GUI_X_InitOS(void)
{ /* 创建互斥信号量 用于资源共享 */xQueueMutex = xSemaphoreCreateMutex();configASSERT (xQueueMutex != NULL);/* 创建二值信号量 用于事件触发 */vSemaphoreCreateBinary( xSemaTxDone );configASSERT ( xSemaTxDone != NULL );
}void GUI_X_Unlock(void)
{/* 给出互斥量 */xSemaphoreGive(xQueueMutex);
}void GUI_X_Lock(void)
{if(xQueueMutex == NULL){GUI_X_InitOS();}/* 获取互斥量 */xSemaphoreTake(xQueueMutex,   /* 互斥量句柄 */portMAX_DELAY);/* 阻塞等待 */
}/* Get Task handle */
U32 GUI_X_GetTaskId(void)
{ return ((U32) xTaskGetCurrentTaskHandle());
}void GUI_X_WaitEvent (void)
{/* 获取信号量 */while(xSemaphoreTake(xSemaTxDone,              /* 信号量句柄 */portMAX_DELAY) != pdTRUE);/* 阻塞等待 */
}void GUI_X_SignalEvent (void)
{/* 给出信号量 */xSemaphoreGive(xSemaTxDone);
}void GUI_X_Log (const char *s) { }
void GUI_X_Warn (const char *s) { }
void GUI_X_ErrorOut(const char *s) { }

五、测试

5.1 裸机测试

#include "sys.h"
#include "delay.h"
#include "timer.h"
#include "oled.h"
#include "GUI.h"int main(void)
{Cache_Enable();                            //打开L1-CacheHAL_Init();                             //初始化HAL库Stm32_Clock_Init(160,5,2,4);           //设置时钟,400Mhzdelay_init(400);                       //延时初始化TIM3_Init(50000-1,200-1);        //定时器3初始化,定时器时钟为200M,分频系数为20000-1,  50ms  刷新屏幕__HAL_RCC_CRC_CLK_ENABLE();//使能CRC时钟,否则STemWin不能使用GUI_Init();GUI_SetBkColor(GUI_WHITE);       //设置背景颜色GUI_Clear();//全部显示背景色GUI_DispStringAt("hello world",0,0);while(1){delay_ms(1000);}
}

5.2 含系统测试

//main.c
#include "sys.h"
#include "delay.h"
#include "timer.h"
#include "oled.h"
#include "GUI.h"
#include "textdisplay.h"
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"//任务优先级
#define START_TASK_PRIO     1
//任务堆栈大小
#define START_STK_SIZE      128
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);//任务优先级
#define Screen_update_TASK_PRIO     2
//任务堆栈大小
#define Screen_update_STK_SIZE      50
//任务句柄
TaskHandle_t Screen_update_Task_Handler;
//任务函数
void Screen_update_task(void *pvParameters);int main(void)
{Cache_Enable();                            //打开L1-CacheHAL_Init();                             //初始化HAL库Stm32_Clock_Init(160,5,2,4);           //设置时钟,400Mhzdelay_init(400);                       //延时初始化TIM3_Init(50000-1,200-1);        //定时器3初始化,定时器时钟为200M,分频系数为20000-1,  50ms  刷新屏幕__HAL_RCC_CRC_CLK_ENABLE();//使能CRC时钟,否则STemWin不能使用//创建开始任务xTaskCreate((TaskFunction_t )start_task,            //任务函数(const char*    )"start_task",          //任务名称(uint16_t       )START_STK_SIZE,        //任务堆栈大小(void*          )NULL,                  //传递给任务函数的参数(UBaseType_t    )START_TASK_PRIO,       //任务优先级(TaskHandle_t*  )&StartTask_Handler);   //任务句柄              vTaskStartScheduler();          //开启任务调度}
//开始任务任务函数
void start_task(void *pvParameters)
{taskENTER_CRITICAL();           //进入临界区//创建LED0任务xTaskCreate((TaskFunction_t )Screen_update_task,      (const char*    )"Screen_update_task",      (uint16_t       )Screen_update_STK_SIZE, (void*          )NULL,             (UBaseType_t    )Screen_update_TASK_PRIO,   (TaskHandle_t*  )&Screen_update_Task_Handler);   vTaskDelete(StartTask_Handler); //删除开始任务GUI_Init();emwin_texttest();taskEXIT_CRITICAL();            //退出临界区
}void Screen_update_task(void *pvParameters)
{while(1){vTaskDelay(50);  //50msOLED_Refresh_Gram();}
}
#include "textdisplay.h"
#include "GUI.h"
void emwin_texttest(void)
{GUI_SetBkColor(GUI_BLUE);      //设置背景颜色GUI_Clear();                    //清屏GUI_SetPenSize(10);             //设置笔大小GUI_SetFont(&GUI_Font8_ASCII); //设置字体GUI_DispStringHCenterAt("HELLO WORD!",63,0);GUI_SetTextMode(GUI_TM_REV);    //反转文本GUI_DispStringHCenterAt("GUI_TM_REV"   ,63,8);GUI_SetTextMode(GUI_TM_TRANS);  //透明文本GUI_DispStringHCenterAt("GUI_TM_TRANS" ,63,16);GUI_SetTextMode(GUI_TM_XOR);       //异或文本GUI_DispStringHCenterAt("GUI_TM_XOR"   ,63,24);GUI_SetTextMode(GUI_TM_TRANS|GUI_TM_REV);//透明反转文本GUI_DispStringHCenterAt("GUI_EM_TRANS|GUI_TM_REV",63,32);
}

STEmwin教程零:STM32 STEmwin移植(裸机FreeRTOS系统)相关推荐

  1. 如何用建好的stm32模板来创建Free-Rtos系统

    文章目录 系列文章目录 一.Free-Rtos是什么? 二.在stm32工程模板里如何使用free-rtos系统 1.如何在官网下载free-rtos源码 2.如何在stm32工程中使用free-rt ...

  2. linux模块移植到freertos,opus移植到freertos系统

    硬件平台:cortex-M4F 200MHZ平台(RTL8721DM) 软件系统:FREERTOS 编译器: Using built-in specs. COLLECT_GCC=/home/kuili ...

  3. 基于STM32的实时操作系统FreeRTOS移植教程(手动移植)

    前言:此文为笔者FreeRTOS专栏下的第一篇基础性教学文章,其主要目的为:帮助读者朋友快速搭建出属于自己的公版FreeRTOS系统,实现后续在实时操作系统FreeRTOS上的开发与运用.操作系统的学 ...

  4. FreeRTOS应用开发笔记之一:FreeRTOS在STM32的移植

    FreeRTOS是如今在小型嵌入式领域应用比较广泛的一种实时操作系统.它是一种开源且免费的操作系统,而且移植和使用都非常的简单.在这里我们将学习并移植FreeRTOS. 1.必要的准备 工欲善其事,必 ...

  5. FreeRTOS系统下LwIP-1.4.1的移植

    转载至 基于FreeRTOS与MQTT的物联网技术应用系列--步进电机控制(四)FreeRTOS系统下LwIP-1.4.1的移植 怕以后查找麻烦,特粘贴至此~~~~~~ 本文使用的网卡PHY芯片型号是 ...

  6. linux模块移植到freertos,FATFS在嵌入式操作系统FreeRTOS中的移植与应用

    摘 要: FreeRTOS作为一款免费的实时操作系统,系统内核小.裁剪方便.移植性好,广泛应用于对成本敏感的小型嵌入式系统中,但是FreeRTOS本身不带文件管理功能,不便于很多需要经常进行文件存储与 ...

  7. uCOS-III应用开发笔记之一:uCOS-III在STM32的移植

    uCOS-III实时操作系统在MCU平台被广泛使用,在这里我们将简单的记录如何将uCOS-III实时操作系统移植到目标平台上并运行. 1.必要的准备 在开始uCOS-III实时操作系统的移植前,我们还 ...

  8. stm32移植paho_如何在STM32上移植Linux?超详细的实操经验分享

    原标题:如何在STM32上移植Linux?超详细的实操经验分享 刚从硬件跳槽为嵌软时,没有任何一丝的准备.一入职,领导就交代了一项特难的任务--在stm32上移植linux! 瞬间我就懵了,没办法硬着 ...

  9. cebemax hal库 stm32 OLED移植 解析

    cebemax hal库 stm32 OLED移植 序言: 这是一篇对于作者对于将OLED的驱动代码移植成hal库的文章,会有完整的过程,后面自然也会有完整的代码,希望能够帮到大家,同时也是做一个记录 ...

最新文章

  1. 从α到μ:DeepMind棋盘游戏AI进化史
  2. 裁剪图像周围空白区域_零基础PS纠正倾斜的图像效果
  3. 右手螺旋判断磁感应强度方向_高考丨电磁感应丨感应电动势
  4. [云炬创业基础笔记]第十一章创业计划书测试14
  5. HDU1066--高精度求阶乘最后非零位
  6. 用C++面向对象的方式动态加载so
  7. unbuntu 启动任务脚本_Ubuntu下服务启动脚本编写
  8. DistributionDB过大的原因
  9. 内温的整体优先效应实验_[心理学复习.doc
  10. 为什么自建深度学习机器?因为比AWS便宜10倍啊!
  11. jquery表单美化组件实例
  12. C++写OpenCV图像灰度化
  13. 企业ERP上云解决方案(金蝶/用友/OA等)
  14. POI Cannot add merged region XXX to sheet because it overlaps with an existing merged region问题解决
  15. Ubuntu Julia环境安装教程
  16. 【行业应用案例】区块链+珠宝应用案例分析
  17. 漫画解读:车规芯片为何比普通芯片贵?跟普通芯片有什么差异?
  18. Gradle构造Spring boot项目(使用私服地址)
  19. iTunes备份文件路径正确修改方法(亲测可用,2018.10.19更新)
  20. 深圳Java学习:Docker

热门文章

  1. html5 tdk,TDK等标签
  2. 基于PCL库的通过ICP匹配多幅点云方法
  3. 液压器大数据分析 需求调研计划
  4. 训练你的逆向思维能力
  5. 数据库SQL Server基本认识
  6. 天文学+云计算,国家天文台-阿里云战略合作首年成果丰硕
  7. Vista BitLocker 驱动器加密原理
  8. 【调剂】东北石油大学地球科学学院地震资料处理团队接受调剂研究生
  9. matlab实现sobel边缘检测图像,基于Sobel算子图像边缘检测的MATLAB实现
  10. Python日积月累_6_迭代器+生成器