c++ opencv4.5.0 头文件_移植STemWin5.32 基于STM32F103VCT6+5.0寸TFT+FSMC

本文主要是介绍c++ opencv4.5.0 头文件_移植STemWin5.32 基于STM32F103VCT6+5.0寸TFT+FSMC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

         本文转自stmcu论坛,作者springyyy。

        最近老板想用彩屏做一款新产品,于是T宝上买了一块屏让我学学捣鼓一下。网上看到人家移植emWin也想试一下,结果还不错,成功了。其实我还移植了UCGUI,嘿嘿。不过这里只说移植StemWin。

d8305170743c9fce35b020c6345a6e69.png 

      平台:T宝上买的5寸TFT屏和评估板工程文件和StemWin以及emWin5.42中文手册的链接(StemWin_V1.2.0是我从官网下的):

      链接:https://pan.baidu.com/s/1LyI6shZBq5iybDtv4m5noA密码:q0an

801de2dc9d1a070177849262b98ef66d.png

先上图:不知为何红圈处的字有点模糊,可能是分辨率问题。

b93aa8ed89c5c4c2182a102c6b53ba4f.png

ac1590ef3c54d346c95611972a8828ba.png

4212b6400bcf9b0aae13921fefb5578a.png

a08619d4797c1c380be1d2633286b73e.png

d652dacb62b4c6164a957c38c18d37f7.png

4b1a7e28904c1e5fd7749bbdda985fa4.png

147b4fd112709c83725106fe0b59f879.png

32f1f89185455cdf29b46f0a235cae5b.png

开始移植:

      因为是买的5寸的液晶屏和评估板所以液晶驱动不用自己写了。直接复制一个就好。注意:不论是自己写的驱动还是哪里来的驱动,一定要保证能驱动你的屏。这里我的文件是ILI9806.c和ILI9806.h。不可以用LCD.c和LCD.h命名,不然会重复(StemWin532中有LCD.c和LCD.h这2个文件)。

      接下来我们开始把STemWin5.32加入工程项目中。在STemWin_Library_V1.2.0\Libraries下找到一个名为“STemWinLibrary532”的文件夹:

600bc786ba0e275c7351897bf10a292b.png

把这个文件夹复制到我们的工程目录下,然后在工程项目组中为其新建一个分组,并添加路径和包含头文件。如下:

17684fbd79fd6c809cb221a8027403e5.png 

61b05cd5bf4a461c6e2b0244f775ccd9.png

422177a47cfb7b4b85e322ebba6cb8e6.png

      相信以上步骤大家都没问题的。完成以上步骤后,接下来就可以修改程序了。

1.打开“GUIConf.C”,并找到这样一个宏:
                  ”#define GUI_NUMBYTES  0x200000”
      把“0x200000”改为“1024*40”(这个宏定义服务于在函数中向系统申请一个静态空间 aMemory ,接着调用 emWin的库函数GUI_ALLOC_AssignMemory 把该空间分配给 emWin。还有“1024*50”并不是定值,我们也可以改成“1024*40”或其它,视情况而定,但一般建议设置成小于“1024*50”)。然后在“GUIConf.C”中就没有需要修改的了。
      如果想修改字体大小,找到void GUI_X_Config(void)函数,并修改最后一句GUI_SetDefaultFont(GUI_FONT_8X16); 里的入口参数即可。
2.打开“LCDConf_FlexColor_Template.c”。
      在这个 .C 文件中我们先把TFT液晶驱动的头文件添加进来(如我的是#include “ILI9806.h”)。接下来我们会看到里面有这样的四个函数void LcdWriteReg(U16 Data)、voidLcdWriteData(U16 Data)、void LcdWriteDataMultiple(U16 * pData, int NumItems)、voidLcdReadDataMultiple(U16 * pData, int NumItems)  然后像下面那样分别添加一句语句(红色为我添加的):

static void LcdWriteReg(U16 Data) 
{
  // ... TBD by user
        *(__IO u16 *) (Bank1_LCD_C)=Data;
}
static void LcdWriteData(U16 Data) 
{
  // ... TBD by user
       *(__IO u16 *) (Bank1_LCD_D)=Data;
}
static void LcdWriteDataMultiple(U16 * pData, int NumItems) 
{
  while (NumItems--) 
        {
    // ... TBD by user
                *(__IO u16 *) (Bank1_LCD_D)=* pData++;
  }
}
static void LcdReadDataMultiple(U16 * pData, int NumItems) 
{
  while (NumItems--) 
        {
    // ... TBD by user
                * pData++=*(__IO u16 *) (Bank1_LCD_D);
  }
}
      注意:Bank1_LCD_C ,Bank1_LCD_D在我的ILI9806.h中已经定义了,它们是写LCD,命令寄存器的地址和写数据的地址。
               #define Bank1_LCD_D    ((u32)0x60020000)         //Disp Data ADDR
               #define Bank1_LCD_C    ((u32)0x60000000)         //Disp Reg ADDR
      然后再找到void LCD_X_Config(void)这个函数。注意红圈处。

c492d8cb5f9b63cb62145085c9c6d291.png 

      pDevice = GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, GUICC_M565, 0, 0);  //GUICC_M565/GUICC_565用于红蓝翻转,默认GUICC_565,如果你用GUICC_565发现红蓝是反的就修改成GUICC_M565。
      Config.Orientation = GUI_SWAP_XY | GUI_MIRROR_Y; //这里是进行屏幕显示方向设置,如果这一句注释掉的话,那么你原来初始化TFT的时候屏的什么方向就是什么方向。PS:如果屏幕显示出现显示反转或者镜像情况,可通过GUI_MIRROR_X、GUI_MIRROR_Y以及GUI_SWAP_XY 等不同组合进行调整。
      GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66709, GUIDRV_FLEXCOLOR_M16C0B16); //这里我们需要修改的是GUIDRV_FLEXCOLOR_F66708这个参数。这个参数的修改要根据你的TFT屏所使用的驱动芯片,我的TFT使用的驱动芯片是“ILI9806”,所以是GUIDRV_FLEXCOLOR_F66709(实际上在手册中找不到ILI9806,所以我是用适合ILIxxxx的一个个试出来的)。如果是其它型号的驱动芯片则需要查询emWin5.42的用户手册然后进行修改。

08a09bf46e55953dec380365e04034d7.png 

      注意:如果选错了,屏会什么都不显示,黑屏。很多人移植不成功都是在这一步没做好。如果里面没有你用的驱动芯片,可以先不修改,等最后修改完成编译没错误后,下载到板子上,看是否能显示,不显示的话就试一试其他的(一定要保证其他地方没问题)。
      接下来找到函数int LCD_X_DisplayDriver(unsigned LayerIndex,unsigned Cmd, void * pData)。在这里我们仅需在case LCD_X_INITCONTROLLER: 项中加入我们TFT液晶的初始化函数即可。

b99012a3d18bdc3f221edbf096d1fa9c.png 

3. GUI心跳。emWin在运行过程中有时会调用延时之类的函数,为了实现精确定时,我们还需要为emWin开一路定时器,这里我们选用StsTick。也即需要我们在mian()函数中加入SysTick_Config(SystemCoreClock /1000);来初始化SysTick定时器,而在“stm32f10x_it.c”文件中,我们需要进行这样的修改:
extern __IO int32_t    OS_TimeMS;
void SysTick_Handler(void)
{
        //SysTick_ISR();   //原来的
        OS_TimeMS ++;  //添加的
}
      这些工作完成后我们再回到main()中,在main()中我们需要添RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC,ENABLE);函数,注意如果不添加将无法使用emWin.然后进行GUI初始化,记得先包含“GUI.h”。如我的程序是这样子的:

0ba8bfa787658732b6f2cfd29a999563.png 

      InitBoard()是我其他的函数,请忽略。GUIDEMO_Main()是用于添加官方Demo例程的。下面会说明。
      程序编译通过之后下载到板子上,移植成功的话会显示如下。

9c6dc7d57c9f412a3cb01d556d4dd7b6.png 

      接下来就是添加官方的Demo程序:
      将STemWin_Library_V1.2.0\Project\STM3210E-EVAL\Standalone中的Demo文件夹拷贝到工程中来,这里面我的MCU是STM32F103VCT6的,不带操作系统的,所以我这里选择了STM3210E-EVAL\Standalone这个路径下的,至于带操作系统的,自己选择即可哈。如果你的MCU不是103系列的请往下看。STemWin_Library_V1.2.0\Project\STM3210C-EVAL\Standalone文件夹下有一个readme.txt文本,里面有说明适用于那个系列的。

dbd585b546953e9c9f0387eeda31832b.png 

e54030a2724034238f96f1783ecba4e5.png

785fef9694cb2581482a4274d0738d78.png

      在main函数文件中添加#include "GUIDEMO.h"头文件,接着在函数中增加SysTick_Config(SystemCoreClock / 1000);这个函数,我是利用这个SysTick定时器来做GUI的心跳的(前面已经说明),至于用定时器的方式的,请另行修改;接着增加demo的演示GUIDEMO_Main();这个函数。
      在guidemo.h文件中找到下图这个家伙,这里是demo的开关哦,我这里打开了9个。如图。注意有些打开后占用空间较大可能会超出报错。

630739737d11162853e9d62687ac5eb5.png 

      到此移植完毕。

这篇关于c++ opencv4.5.0 头文件_移植STemWin5.32 基于STM32F103VCT6+5.0寸TFT+FSMC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/212604

相关文章

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给

2024/9/8 c++ smart

1.通过自己编写的class来实现unique_ptr指针的功能 #include <iostream> using namespace std; template<class T> class unique_ptr { public:         //无参构造函数         unique_ptr();         //有参构造函数         unique_ptr(