- 博客(73)
- 收藏
- 关注
原创 TouchGFX (ModelListener和Model)类的cpp定义和说明(1.2)
这样做的好处在于,相比于在构造函数体内部进行赋值操作,初始化列表在处理一些复杂类型的成员变量(例如包含引用成员、const 成员等情况)或者对初始化效率有要求的场景下,能够更准确、高效地完成成员变量的初始状态设置。总体而言,这段代码是对 Model 类相关函数的具体实现部分,通过头文件包含获取了必要的类型定义,实现了构造函数来初始化关键的成员变量,并给出了 tick 函数的框架,但 tick 函数还需要进一步根据具体应用场景补充完善相应的功能代码,以实现 Model 类预期的功能。一)Mode.cpp。
2025-01-14 10:54:04
385
原创 TouchGFX (ModelListener和Model)类的hpp定义和说明(1.1)
【代码】TouchGFX (ModelListener和Model)类的hpp定义和说明(1.1)
2025-01-13 08:43:46
705
原创 C++中 为什么要把基类指针指向子类对象?
当基类中有虚函数,并且子类重写了这些虚函数时,通过基类指针调用虚函数,实际调用的是对象所属子类中重写后的函数。可以调用start和stop这样的基类方法,无论指针实际指向的是Car还是Truck对象,都能复用基类中定义的这些通用功能,同时每个子类还可以有自己特有的功能(如Car的honk和Truck的loadCargo),这种方式提高了代码的模块性,使得基类和子类的功能划分更加清晰。}),这样就可以用统一的方式来处理不同类型的游戏角色的行为,而不需要为每个子类单独编写处理代码,使得代码更加简洁和易于维护。
2025-01-12 00:00:00
545
原创 C++例程:使用I/O模拟IIC接口(6)
完整的STM32F405代码工程I2C驱动源代码跟踪。五)stm32f4xx_rcc.h。六)stm32f4xx_rcc.c。四)stm32f4xx.h。二) myiic.h。
2025-01-11 00:00:00
782
原创 C++例程:使用I/O模拟IIC口(5)
本例程基于STM32F103ZE主控,使用其I/O模拟IIC接口:SCL_PB6(GPIOB),SDA_PB7(GPIOB)与RJGT102芯片交互,状态信息通过主控的串口1进行打印,以下是正确执行本例程后的状态信息,主要展示了版保芯片安全认证设备、安全认证写/读及看门狗的应用过程。 看门狗应用状态信息。 认证应用状态信息。
2025-01-10 09:59:21
184
原创 C++例程:使用I/O模拟IIC接口(4)
一)stddef.h/* stddef.h: ANSI 'C' (X3J11 Oct 88) library header, section 4.1.4 *//* Copyright (C) ARM Ltd., 1999 * All rights reserved * RCS $Revision$ * Checkin $Date$ * Revising $Author: agrant $ *//* Copyright (C) Codemist Ltd., 1988
2025-01-09 09:29:28
1016
原创 C++例程:使用其I/O模拟IIC接扣(3)
二) rjgt102_security.c。一)rjgt102_security.h。三)sha256.h。四)sha256.c。
2025-01-08 08:48:37
445
原创 C++的23种设计模式简介--模板方法模式template method
例如,在一个游戏角色升级系统的模板方法中,升级流程的基本框架(如检查是否达到升级条件、更新角色等级等)是固定的,但是不同角色(战士、法师等)的经验获取方式和属性提升方式可以通过子类实现抽象方法来定制,方便扩展新的角色类型。例如,在制作饮品的过程中,烧水和倒入杯子的步骤是固定的,而冲泡和添加调料的步骤因饮品(如咖啡、茶)而异,模板方法模式可以定义制作饮品的通用流程,让子类实现具体的冲泡和添加调料步骤。其中一些方法是抽象方法(纯虚函数),这些抽象方法代表了算法中的可变步骤,它们的具体实现被延迟到子类中;
2025-01-07 08:33:14
894
原创 TouchGFX 5寸液晶屏工程的移植(LTDC RGB 接口 LCD)
需要再原来的工程中把7寸屏改为5寸屏,需要进行一些配置更改。主要更改配置过程中的组件(GUI功能需要)
2025-01-06 16:51:54
362
原创 STM32烧写失败之Contents mismatch at: 0800005CH (Flash=FFH Required=29H) !
由于我的MCU的NRST连接到了ULink2的nSRST/nRESET引脚和PCB板上另一个芯片的复位管脚,可能的原因是:SYSRESETREQ复位方式由于另一个芯片的影响,无法进行MCU的正常复位,然而,HW RESET方式下,ULINK2可以通过硬件反转NRST复位引脚,成功复位MCU。将Debug菜单 - Reset菜单选项(HWreset/sysresetReq/Vectreset)由“sysresetReq”改为“HWreset”,下载正常,调试也正常。Cortex-M内核和片上外设被重置。
2025-01-04 17:49:37
1365
原创 STM32 NOR FLASH(SPI FLASH)驱动移植(2)
当所需要写入的数据长度超过一个扇区的长度的时候,我们先按照前面的步骤把扇区剩余部分写完,再在新扇区内执行同样的操作,如此循环,直到写入结束。我们也定义了一个函数 norflash_read_sr,去读取 25Q256 状态寄存器的值,这里就不列出来了,主要实现的方式也是老套路:根据传参判断需要获取的是哪个状态寄存器,然后拉低片选线,调用 spi5_read_write_byte函数发送该寄存器的命令,然后通过发送一字节空数据获取读取到的数据,最后拉高片选线,函数返回读取到的值。除,最后拉高片选线结束通信。
2025-01-04 00:00:00
329
原创 LED背光驱动芯片RT9293应用电路
误差放大器会回送反馈信号 FB,通过对输出电流的监测和反馈,与内部参考电压进行比较,然后根据比较结果调整 MOSFET 的导通占空比等参数,从而实现对输出电流和电压的稳定控制。当输出电压超过设定的过压保护阈值时,芯片会采取相应的保护措施,如切断输出或调整输出电压等,以防止下游电路因过压而损坏。过温保护:在芯片工作过程中,如果温度升高到一定程度,超过了芯片的过温保护阈值,芯片会自动降低工作效率或停止工作,待温度降低到安全范围内后再恢复正常工作,以防止芯片因过热而损坏。RT9293的主要功能为上图的Q1.
2025-01-03 15:11:41
1126
原创 STM32 NOR FLASH(SPI FLASH)驱动移植(1)
4,FLASH 芯片有很多种芯片型号, norflash.h 头文件中有定义芯片 ID 的宏定义,对应的就是不同型号的 NOR FLASH 芯片,比如有:W25Q128、W25Q256、BY25Q128、NM25Q128,它们是来自不同的厂商的同种规格的 NOR FLASH 芯片,内存空间都是 128M 字,即 16M 字节。2,NAND 的数据和地址线共用,只能按“块”来读写数据,假如 NAND 上存储了代码指令,CPU 给 NAND 地址后,它无法直接返回该地址的数据,所以不符合指令译码要求。
2025-01-03 08:34:48
1166
原创 C++中的类设计回顾知识点总结2(13章)
其次,应返回引用而不是返回对象的的原因在于,返回对象涉及生成返回对象的临时副本,这是调用函数的程序可以使用的副本。第二条语句将调用 Star:operator=(const Star*)函数,使用 Star::star(const char*)生成一个 Star对象,该对象将被用作上述赋值运算符函数的参数。通用的规则是,如果函数返回在函数中创建的临时对象,则不要使用引用。另外,如果派生类构造函数的成员初始化列表中没有显式调用基类构造函数,则编译器将使用基类的默认构造函数来构造派生类对象的基类部分。
2025-01-01 09:42:42
788
原创 C++ 类继承(13章1)
除非厂商提供了库函数的源代码(通常是不提供的),否则您将无法根据自己特定的需求,对函数进行扩展或修改,而必须根据库的情况修改自己的程序。因此,如果购买的类库只提供了类方法的头文件和编译后代码,仍可以使用库中的类派生出新的类。首先,这个类使用标准 string类来存储姓名,相比于使用字符数组,这更方便、更灵活、更安全,而与第12章的 String类相比,这更专业。从一个类派生出另一个类时,原始类称为基类,继承类称为派生类。,它能够从已有的类派生出新的类,而派生类继承了原有类(称为基类)的特征,包括方法。
2024-12-30 18:44:55
1152
原创 TouchGFX软件介绍 基本控件,交互设计与仿真(2)
• 当Tiled Image控件宽度或高度大于图像时,图像就会在水平和垂直方向进行重复填满控件区域。• X Origo 和Y Origo 的坐标与Texture Mapper的宽度和高度相关。• Repeat Button按下不松开,在延时时间后,会按配置的间隔重复触发回调。支持缩放,旋转.属性: • 旋转角度• 水平,垂直方向缩放 • 添加顶点。• Camera Distance 会改变图像旋转时显示的透视量。属性 • 圆心 • 半径 • 起始角度 • 线宽。
2024-12-29 00:00:00
737
原创 TouchGFX 中MCU 负载的计算过程介绍
如图3所示,添加以下代码,这样用STM32CubeMX生成代码时,就会自动把CortexMMCUInstrumentation.cpp添加到对应的IDE中。从TouchGFX Desinger 下载的TBS(TouchGFX Board Setup)大都带有MCU 的。TouchGFX Designer 上下载的STM32F746 的TBS,讲解MCU 负载计算的实现过程。以上就是添加MCU负载计算的过程,更多详细信息大家可参考下载TBS中的代码注释。参考下载的代码,调用以下函数,即是MCU负载值的获取。
2024-12-28 00:00:00
348
原创 TouchGFX软件介绍 基本控件,交互设计与仿真(1)
子节点的z-order值,取决于子节点加入容器的先后顺序。• 在一个交互的动作响应中,如果让某个控件淡出,并且时间不为零,则此控件会自动使能FadeAnimator Mixins。用户通过调用内部模型上的方法来处理屏幕上组件的配置,而不考虑实际的绘图操作。• MoveAnimator Mixins 为控件添加动画能力,控件能从当前位置移动到指定的结束位置。• 图形引擎更新的一块内存,其中包含要在Display上显示的下一个图像。• 在减少TouchGFX 的场景模型使用的内存量方面付出了巨大的努力。
2024-12-28 00:00:00
1326
原创 TouchGFX 工程的移植步骤(LTDC RGB 接口 LCD)
不同的IDE,它的链接文件是不同的。TouchGFX可以运行在有RTOS和无RTOS的工程中,本工程移植的是带有RTOS,RTOS选择FreeRTOS,在本工程中新增了2个task,TouchGFXTask任务用于运行ToucGFX图形引擎,VideoTask任务用于进行Mjpeg视频的编解码,如果您的项目不用video控件,那么videoTask可以不用添加。至此,外设配置基本完成,选择所使用的IDE(这里选择的是STM32CubeIDE),点击Generate Code 按钮,生成代码。
2024-12-27 00:00:00
1084
原创 C++中的类继承知识点总结1(13章)
因为对于派生对象的基类部分,C++将使用基类的赋值运算符,所以不需要为派生类重新定义赋值运算符,除非它添加了需要特别留意的数据成员。”的答案是“也许”。如果希望派生类能够重新定义方法,则应在基类中将方法定义为虚的,这样可以启用晚期联编(动态联编):如果不希望重新定义方法,则不必将其声明为虚的,这样虽然无法禁止他人重新定义方法,但表达了这样的意思:您不希望它被重新定义。这样,当通过指向对象的基类指针或引用来删除派生对象时,程序将首先调用派生类的析构函数,然后调用基类的析构函数,而不仅仅是调用基类的析构函数。
2024-12-26 00:00:00
931
原创 TouchGFX 实现图片资源存储在外部flash中(2)
烧录的起始地址为0x08000000,这个地址是存放代码的,而0x90000000地址处是存放图片素材的,通过上面那条命令可以把代码和图片素材全部下载完成!5)编译并下载到外部Flash中。6)TouchGFX的相关配置。
2024-12-25 08:39:48
659
原创 TouchGFX移植(6)调试触屏驱动CYTMA568
4)移植成功后SDA(黄色)和SCL(紫色)的波形图。3)添加4.7K上拉电阻后SDA波形。1)没有上拉时SCL波形。其中时钟周期为155K。
2024-12-24 09:08:57
616
原创 TouchGFX移植(3)增加SDRAM驱动
2)在fmc.c文件里指定位置增加代码 SDRAM_Init();另外需要包含文件:#include “sdram.h”2,重写初始化函数:void TouchGFXHAL::initialize()4)增加系统文件sys.c和sys.h到工程里的BSP目录中。1)加入驱动sdram.c文件,文件在上节课里有源代码。一)SDRAM驱动增加到工程中。
2024-12-20 00:00:00
968
原创 TouchGFX移植(2)STM32CubeMX配置
1,配置参数,只需要修改栈空间大小为32768 其他的不用更改。注意LTDC的像素时钟,要和具体的液晶屏匹配,这里是42MHZ.这里涉及到SDRAM的上电初始化文件:(后面会具体用到)原理图中的BA0和BA1决定了配置中有4个BANK。屏:7寸RGB, 1024 X 600分辨率。4,GPIO设置(必须和硬件连接一致)想用TouchGFX 必须使能CRC.硬件平台:STM32F429IGT6。打开LTDC全局中断。
2024-12-19 00:00:00
891
原创 TouchGFX移植(1)软件安装目录
1)STM32cube MCU Packages版本(本机使用的版本)一)STM32cubeMX+TouchGFX +FreeRTOS。TouchGFX在操作系统下才能发挥它的最佳性能;TouchGFX是通过STM32CubeMX安装的。2)固件库存放位置:Repository(仓库)2)TouchGFX版本(本机使用的版本)二)STM32cubeMX相关固件版本。因为后面的下载脚本用的就是默认路径。3)安装下载软件位置:(
2024-12-18 09:35:02
301
原创 C和C++的函数指针
这里int (MyClass::*member_func_ptr)(int)是类成员函数指针的声明,通过(obj.*member_func_ptr)(3)或者(ptr->*member_func_ptr)(3)的方式来调用成员函数。在这个例子中,func_ptr只能指向参数为int的print函数,不能直接指向参数为double的print函数。与类成员函数的结合(需要注意):在 C++ 中,普通函数指针不能直接指向类的成员函数,因为类成员函数有一个隐含的this指针。,这两种写法在 C 语言中是等价的。
2024-12-17 13:02:33
1437
原创 C++ 赋值运算符重载
如果不是自赋值情况,首先释放当前对象data指针所指向的内存(避免内存泄漏),然后重新根据源对象other的length值分配新的内存空间给当前对象的data指针,再通过strcpy函数将源对象other的data所指向的字符串内容复制到当前对象新分配的内存中,实现了深拷贝。这样每个对象的data指针都有独立的内存区域,避免了浅拷贝带来的内存相关错误。如果不是自赋值,就将other对象的x和y坐标值赋给当前对象的相应成员变量,最后返回当前对象的引用,以便支持连续赋值操作。
2024-12-16 13:42:00
317
原创 C++ 拷贝构造函数
每当程序生成了对象的副本时,编译器都将使用复制(拷贝)构造函数,具体的说,当函数按值传递对象或者函数返回对象时,都将使用复制构造函数,记住,按值传递意味着创建原始变量的一个副本。这可能导致问题,如多个对象的指针指向同一块内存,当一个对象通过指针修改数据时,其他对象的数据也会被修改。避免资源泄漏和错误释放:在深拷贝的情况下,要注意正确地分配和释放内存,确保新对象和源对象的资源管理都正确无误,避免出现内存泄漏(如忘记释放内存)或重复释放内存的情况。当使用一个已有的对象来初始化一个新对象时,会调用拷贝构造函数。
2024-12-16 12:05:55
475
原创 C++(举例说明类的实例化方式)
2.使用 new 关键字动态分配内存:使用 new 关键字来在堆上动态分配内存,并返回指向新对象的指针MyClass* ptr = new MyClass();太多的信息会让你抓不住重点,下面通过间短的举例说明了类的几种实例化方式,熟悉以后再阅读代码的时候就能减少疑惑。4.使用拷贝构造函数进行实例化:使用已有对象来创建一个新对象,通过调用拷贝构造函数。7.数组形式的对象实例化: 创建对象数组时,可以指定数组的大小并初始化每个元素。1.直接实例化:使用类名直接实例化对象 MyClass obj;
2024-12-15 00:00:00
222
原创 5.3 C++ 容器的嵌套
在遍历map时,通过迭代器it获取键it->first和值(vector)it->second,再遍历vector输出其中的元素,这种结构可以用于根据某个键来关联一组数据,比如可以根据学生的学号(键)来关联该学生的成绩列表(vector值)。在遍历set中的map元素时,需要使用两层嵌套的迭代器。例如,在一个组织结构图中,可以使用vector嵌套vector来表示部门和员工的关系,外层vector表示部门,每个部门对应的内层vector表示该部门的员工。2)map嵌套vector(关联容器与序列容器组合)
2024-12-14 00:00:00
437
原创 C++关键字“extern”和“static”
这里static_member_var是MyClass类的static成员变量,通过MyClass::static_member_var来访问,可以在任何一个MyClass对象之外访问和修改这个变量,并且所有MyClass对象共享这个变量的值。在类中,static成员变量是被类的所有对象共享的。在这个例子中,static_member_func是MyClass类的static成员函数,它可以直接访问和操作static成员变量static_member_var,程序输出为2。程序的输出结果是1 2 3。
2024-12-13 10:10:31
970
原创 5.2 C++ 标准模板库(STL)
它结合了 vector 和 list 的一些特点,既可以像 vector 一样高效地在两端进行插入和删除操作,又可以像 vector 一样通过索引快速访问元素(在内部实现上,元素的存储可能不是完全连续的,但提供了类似连续存储的接口)。与 set 和 map 不同的是,它们是无序的容器,内部是基于哈希表(Hash Table)实现的,插入和查找元素的平均时间复杂度接近常数,但最坏情况可能较差。迭代器是一种用于遍历容器中元素的对象,它提供了一种统一的方式来访问不同容器中的元素,就像指针一样。
2024-12-12 12:32:41
1254
原创 C和C++语言中的函数指针
这里int (MyClass::*member_func_ptr)(int)是类成员函数指针的声明,通过(obj.*member_func_ptr)(3)或者(ptr->*member_func_ptr)(3)的方式来调用成员函数。在这个例子中,func_ptr只能指向参数为int的print函数,不能直接指向参数为double的print函数。与类成员函数的结合(需要注意):在 C++ 中,普通函数指针不能直接指向类的成员函数,因为类成员函数有一个隐含的this指针。,这两种写法在 C 语言中是等价的。
2024-12-11 09:54:54
773
原创 KEIL中编译结果详解:Program Size: Code=78260 RO-data=103448 RW-data=628 ZI-data=52660
这样的全局变量,它在程序启动时被初始化为 10,其存储的数据就属于rw - data部分。在资源受限的系统中,特别是 RAM 资源紧张的情况下,需要关注rw - data的大小,确保不会因为这部分数据占用过多的 RAM 而导致程序运行出现问题,比如栈溢出(如果栈空间和rw - data等共同占用的 RAM 超过了总 RAM 容量)。潜在的性能影响:由于zi - data中的变量在程序启动时需要进行初始化,对于大型的zi - data区域,这个初始化过程可能会消耗一定的时间,从而影响程序的启动速度。
2024-12-10 00:00:00
508
原创 C++结构中的位字段
例如,对于一个字节(8 位)的存储单元,若有两个位字段a : 3和b : 5,如果是从低位开始存储,a将占用最低的 3 位,b占用高 5 位;例如,在一个存储学生成绩等级(A - F,共 6 个等级)的系统中,如果使用普通的char类型来存储每个学生的成绩等级,每个学生需要占用 8 位(1 字节)。例如,在某些硬件设备的寄存器映射或者通信协议的数据封装中,数据可能是以位为单位进行组织的,位字段就可以很好地用于表示这些数据。3)协议数据封装:在网络协议或者数据存储协议中,数据可能是以特定的位模式进行封装的。
2024-12-09 10:54:32
881
06-TouchGFX4.2x 新功能,助力STM32用户快速设计美观统一友好的人机交互产品.pdf
2024-12-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人