自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(124)
  • 收藏
  • 关注

原创 浮点数的表示

浮点数的表示

2024-04-26 14:44:34 188

原创 内存芯片的内部结构、存储原理和内存对齐

现在只给蓝色的字节线通电,这时导通控制极控制晶体管联通,电路变成通路,这时比特线上没有电,那么电容器上的电荷就会通过比特线流走,这时电容变回低电势,低电势对应二进制的0,所以在这个简单的电路中,电容可以存储1比特的数据。根据电容器高低电势分别对应二进制的1和0,由此我们可以得到,在内存中存储数据的最小单位就是这个基本单元电路,也就是1比特。

2024-04-26 14:42:54 1048

原创 字节序的理解

字节序(Byte Order),也称为字节顺序或端序,指的是在计算机内存中如何存储多字节数据类型(如整数、浮点数等)中的字节。根据字节的排列顺序,主要有两种类型的字节序:大端序(Big-Endian)和小端序(Little-Endian)。

2024-04-25 10:56:28 729

原创 STM32 float浮点数转换成四个字节

联合体的大小由其最大的成员决定,并且这个大小会按照需要满足最大成员对齐要求的方式来进行调整。但是,如果你先将这些浮点数复制到联合体中,由于联合体确保了四字节对齐,你就可以安全地对这些数进行操作,不会遇到总线错误。因此,编译器会确保联合体的对齐满足其内部最严格对齐要求的成员,这通常是最大的数据类型成员。使用联合体是一种解决方案,因为联合体内存的对齐会确保即使是从数组中取出的浮点数数据,也能满足FPU的对齐要求。这意味着,如果你修改了联合体中的一个成员,就可能改变另一个成员的值,因为它们共享相同的内存位置。

2024-04-25 10:54:52 455

原创 float类型的存储

在计算机科学中,float类型通常指的是单精度浮点数。它是一种用于近似表示实数的方法,特别适用于表示很大或很小的数。float类型在大多数编程语言中遵循IEEE 754标准,这是一个国际标准,用于确保在不同计算机和编程语言之间浮点数的行为一致。

2024-04-24 13:24:23 657

原创 STM32 串口打印乱码(Cubemx)

例如,如果晶振配置为8 MHz,但系统设置错误地认为是25 MHz,使用相同的PLL倍频设置将得到完全不同的输出频率。如果一个系统设计为使用25 MHz晶振,但实际装配了8 MHz晶振,没有相应调整时钟设置,则系统实际运行的核心频率可能远低于预期,或者PLL无法锁定导致系统不稳定。对于任何依赖精确时钟的应用,如串口通信、USB通信或任何形式的同步数据传输,确保晶振设置正确是至关重要的。总结来说,确保单片机的系统时钟配置正确是关键步骤,特别是在使用不同于标准设置的硬件配置时。

2024-04-24 13:23:19 1138

原创 STM32 ULINK

此外,ULINK 还可以用于对目标设备进行固件编程和更新,包括烧录程序、擦除存储器、更新固件等操作。总的来说,ULINK 是一种专业、高效的嵌入式系统调试和仿真工具,为 ARM Cortex-M 微控制器的开发和调试提供了方便、快捷的解决方案。:ULINK 提供了丰富的调试功能,包括设置断点、单步执行、观察变量和寄存器、跟踪程序执行流程等,帮助开发人员快速定位和解决问题。:ULINK 具有简单、直观的用户界面和操作流程,使得开发人员能够轻松进行调试和编程操作,适用于各种开发经验和水平的用户。

2024-04-23 22:53:28 199

原创 STM32 DAP

DAP(Debug Access Port)是一种调试访问端口,通常与调试接口一起使用,例如JTAG或SWD。DAP的作用是提供对目标设备内部的调试、测试和编程访问权限,允许开发人员通过调试工具与目标设备进行通信,并执行一系列调试操作。

2024-04-23 22:52:53 923

原创 STM32 J-LINK

J-Link是由SEGGER公司开发的一种专业嵌入式系统调试和编程工具,常用于连接主机计算机和目标设备,以实现调试、测试和编程功能。J-Link具有高度的灵活性和可扩展性,适用于各种嵌入式系统和调试场景。

2024-04-22 19:40:23 372

原创 STM32 ST-LINK

ST-Link是STMicroelectronics(ST)公司提供的一种用于嵌入式系统调试和编程的工具。它通常是一种集成在STMicroelectronics的开发板或评估板上的调试接口,用于连接主机计算机和目标设备,以实现调试、测试和编程功能。

2024-04-22 19:39:52 518

原创 STM32 SWD

SWD(Serial Wire Debug)是一种两线调试接口,专为微控制器和其他集成电路提供调试访问权限。它是一种相对较新的技术,旨在取代传统的JTAG接口,提供更简洁、更高效的调试功能。SWD只需要两条信号线:SWDIO(Serial Wire Debug Input/Output)和SWCLK(Serial Wire Debug Clock),相比于JTAG的多线接口,SWD显著减少了所需的物理连接数,从而简化了硬件设计和调试过程。

2024-04-19 12:25:34 522

原创 STM32 JTAG

JTAG(Joint Test Action Group)是一种广泛使用的接口标准,用于测试、调试和编程复杂的电子系统,特别是嵌入式系统和集成电路。JTAG接口主要由四个信号组成:TCK(测试时钟)、TMS(测试模式选择)、TDI(测试数据输入)和TDO(测试数据输出)。此外,还有一个可选的TRST(测试重置)信号,用于异步重置测试逻辑。

2024-04-19 12:25:03 412

原创 STM32 CAN接收中断细节

FOVIE1: FIFO1溢出中断允许:FFIE1: FIFO1满中断允许:FMPIE1: FIFO1消息挂号中断允许:FOVIE0: FIFO0溢出中断允许:FFIE0: FIFO0满中断允许:FMPIE0: FIFO0消息挂号中断允许:

2024-04-18 12:31:38 643

原创 STM32 CAN接收FIFO细节

【代码】STM32 CAN接收FIFO细节。

2024-04-18 12:30:46 1253

原创 STM32 CAN过滤器细节

【代码】STM32 CAN过滤器细节。

2024-04-17 19:15:20 1050

原创 STM32 CAN控制的相关结构体(标准库)

CAN_PrescalerCAN_ModeCAN_SJWCAN_BS1CAN_BS2CAN_TTCMCAN_ABOMCAN_ AWUMCAN_NARTCAN_RFLMCAN_TXFPStdIdExtIdIDERTRDLCData[8]

2024-04-17 19:13:58 1109

原创 STM32 CAN发送邮箱和接收FIFO

CAN外设一共有3个发送邮箱,即最多可以缓存3个待发送的报文。每个发送邮箱中包含有标识符寄存器CAN_TIxR、数据长度控制寄存器CAN_TDTxR及2个数据寄存器CAN_TDLxR、 CAN_TDHxR,它们的功能如下:

2024-04-15 22:45:56 528

原创 STM32 CAN的验收筛选器

CAN外设的验收筛选器,一共有28个筛选器组,每个筛选器组有2个寄存器, CAN1和CAN2共用的筛选器的。在 CAN 协议中,消息的标识符与节点地址无关,但与消息内容有关。因此,发送节点将报文广播给所有接收器时,接收节点会根据报文标识符的值来确定软件是否需要该消息,为了简化软件的工作, STM32的CAN外设接收报文前会先使用验收筛选器检查,只接收需要的报文到FIFO中。筛选器工作的时候,可以调整筛选ID的长度及过滤模式。

2024-04-15 22:45:05 488

原创 C++ 派生类

派生类是C++面向对象编程中的一个核心概念,它通过继承机制允许创建复杂的类层次结构,实现代码的重用和扩展。通过合理使用继承、多态和虚函数,可以设计出灵活且易于维护的程序。

2024-03-25 21:58:34 487

原创 C++ 程序块和作用域

C++中的变量和作用域是编程的基础概念,正确理解和使用它们对编写清晰、有效和可维护的代码至关重要。通过控制变量的作用域,可以提高程序的安全性和可读性,避免命名冲突和不必要的全局依赖。函数体:每个函数都是以程序块的形式定义的,其中包含了函数的执行语句。// 函数体程序块int x = 10;控制流语句:在if语句、switch语句、循环语句(如forwhiledo-while)中使用程序块来定义要执行的语句序列。// if语句程序块限制变量作用域。

2024-03-25 21:57:28 873

原创 STM32 CAN的位时序和波特率

STM32 CAN的位时序和波特率

2024-03-23 16:23:00 551

原创 STM32 CAN的工作模式

STM32 CAN的工作模式

2024-03-23 16:22:26 539

原创 C++中的类模板

类模板的定义以关键字template开始,后面跟着模板参数列表。模板参数列表包含在尖括号< >中,里面定义了一个或多个模板参数。模板参数可以是类或者类型(比如typename T或者class T),也可以是非类型参数(比如整型常量)。T get() {在这个例子中,Box是一个类模板,它有一个模板参数T。这意味着你可以用任意类型替换T,从而生成该类型的Box类。

2024-03-22 22:20:20 393

原创 C++中的虚函数和多态

在基类中,你可以通过在成员函数声明前加上关键字virtualpublic:虚函数是实现多态性的基础,它允许你使用基类指针或引用来操作派生类对象,并调用正确的成员函数。这种机制大大增强了语言的灵活性和表达能力,使得代码更加模块化和可扩展。通过纯虚函数和抽象类,C++还允许定义接口,进一步促进了面向对象设计原则的应用。多态性使得C++程序更加灵活和可扩展,是面向对象编程的一个关键特性。动态多态通过虚函数实现,允许在运行时根据对象的实际类型调用相应的方法。

2024-03-22 22:19:44 856

原创 ROS git使用

这里是使用 Git 和 Visual Studio Code (VSCode) 来管理一个 ROS 项目的完整指南,包括创建项目、初始化 Git 仓库、更改本地默认分支为main。

2024-03-21 17:55:26 1266

原创 C++中的内联函数

内联函数可以通过在函数声明或定义前加上inline关键字来实现。x : y;这个例子中的max函数是一个内联函数,当它被调用时,编译器会尝试将它的代码直接插入到调用点,而不是进行常规的函数调用。

2024-03-21 17:51:46 239

原创 C++ 运算符重载

运算符重载是C++中的一个强大特性,它提高了用户定义类型的表达力和代码的可读性。正确和谨慎地使用运算符重载可以让你的类更加直观和易于使用,但也需要注意不要滥用,以免造成代码的混乱和误解。

2024-03-21 17:51:16 389

原创 C++中的异常处理

可以通过继承类或任何其他标准异常类来创建自定义异常类型。这允许你为特定的错误情况提供更详细的错误信息。public:C++中的异常处理提供了一种结构化和灵活的方式来处理程序中的错误情况。通过使用trycatch和throw,可以编写出既安全又易于维护的代码。然而,也需要注意异常处理可能带来的性能开销,并尽量避免在性能敏感的代码中频繁使用异常。

2024-03-20 22:56:40 677

原创 C++ 拷贝构造函数和析构函数

对于需要深拷贝的情况,或者当默认拷贝行为不符合需求时,应该为类定义一个自定义的拷贝构造函数。自定义拷贝构造函数可以确保对象内部状态和资源被正确、完整地复制。拷贝构造函数在对象需要被拷贝创建新实例的场合被调用,这包括显式拷贝、函数参数传递、函数返回值、作为异常对象,以及在初始化数组、容器或类成员时。了解拷贝构造函数的调用时机对于管理对象的生命周期和资源至关重要,尤其是在处理动态分配资源时,正确使用拷贝构造函数可以帮助防止资源泄漏和深浅拷贝问题。

2024-03-20 22:56:10 708

原创 C++ 函数模板

在C++中,函数模板是一种允许函数以一种类型无关的方式来操作的工具。它们使得函数能够处理不同类型的数据而不需要为每种类型编写重复的代码。函数模板的核心思想是“参数化类型”,这意味着在定义函数时,可以使用一个或多个通用类型参数,而在函数被调用时,编译器会根据传入的实际参数类型来实例化一个具体的函数版本。

2024-03-19 20:47:32 854

原创 C++ 引用变量、引用形参

语法差异:引用使用更简洁的语法,不需要使用解引用操作符来访问值。可变性:指针可以在任何时候改变指向另一个对象,而引用一旦绑定到一个对象,就不能改变指向。安全性:引用比指针更安全,因为引用保证指向一个有效的存储单元。引用是C++中强大的特性,提供了一种安全且易于使用的方式来操作其他变量。它们在函数参数传递、返回值、以及需要直接操作调用者数据时特别有用。然而,使用引用时需要谨慎,特别是作为函数返回值时,确保不会返回局部变量的引用。函数定义时,参数类型后面加上*ptr = 10;// 通过指针修改指向的值。

2024-03-19 20:46:58 930

原创 C++中的this指针、访问控制和构造函数

尽管struct和class在C++中非常相似,两者都可以用来定义含有数据成员和成员函数的类型,但它们在默认访问控制和默认继承类型上有所不同。选择使用struct还是class取决于你的特定需求,以及你对类型成员的默认访问权限的期望。一般而言,如果一个类型主要用于存储数据,并且你希望其成员默认为公有,那么使用struct可能更合适;如果你需要更多的封装和面向对象的特性,那么class将是更好的选择。

2024-03-18 11:58:37 1037

原创 C++ 函数的默认形参和函数重载

函数的默认参数可以在函数声明时给出,也可以在函数定义时指定,但不应同时在声明和定义中为同一参数指定默认值。通常,在函数声明中指定默认值是较好的做法,这样函数的用户可以通过头文件看到默认参数值。

2024-03-18 11:58:07 923

原创 C++ typedef关键字

typedefpublic:这里,MyFuncPtr是指向MyClass类的成员函数的指针的别名。typedef在C++中是一个非常有用的特性,可以提高代码的可读性和可维护性。它允许程序员为复杂的类型声明创建简短、易于理解的别名。C++11通过引入using声明为类型别名提供了一个更现代的语法,但typedef依然被广泛使用。

2024-03-15 12:05:09 393

原创 C++ string和vector

在C++中,是一个表示文本字符串的类。它封装了字符数组的处理,提供了丰富的成员函数,用于执行各种字符串操作,如连接、查找、比较、替换等。类定义在标准库头文件中,是标准模板库(STL)的一部分。

2024-03-15 12:04:41 1017

原创 C++ const关键字

在C++中,const关键字用于定义常量值,即一旦初始化后就不能更改的值。const可以用于各种场景,包括变量、指针、函数参数、返回类型、成员函数等,提高了程序的可读性和执行时的安全性。

2024-03-14 17:55:28 334

原创 C++中的C标准库、注释和条件编译

第一部分代码展示了C++的基本输出操作,但由于#if 0的存在,这部分代码不会被编译。第二部分代码是一个完整的C程序,展示了C标准库在输入输出、数学计算和字符串处理中的应用,这部分代码由于#if 1会被编译和执行。这种使用#if 0和#if 1的技巧在开发中常用于临时启用或禁用代码部分,而无需完全删除不需要的代码段。

2024-03-14 17:54:37 493

原创 C++ 指针和动态内存分配

在C++中,指针是基础且强大的特性之一,它直接支持对内存的操作和管理。指针本质上是一个变量,用于存储另一个变量的内存地址。通过指针,你可以读取或修改存储在那个地址的数据。指针的使用使得程序能够以更动态和高效的方式处理数据和内存。

2024-03-13 13:04:41 1016

原创 C++中的操作符

当在类定义外部定义成员函数时,作用域解析操作符用于指明该函数属于哪个类。public:// 函数定义作用域解析操作符在C++中是一个非常重要的特性,它提供了一种明确指定标识符作用域的方法,无论是访问隐藏的全局变量、定义类外的成员函数、访问类的静态成员、指定命名空间中的标识符,还是访问枚举类的枚举值,都能派上用场,增强了代码的可读性和维护性。符号在C++中是多用途的,可以表示地址运算符、引用声明符和按位与运算符。在不同的上下文中,有着不同的含义和用途。

2024-03-13 13:03:53 1022

原创 C++标准输入输出和名字空间

std名字空间是C++标准库的核心,它封装了丰富的程序设计工具和功能。合理使用std名字空间中的组件可以大大提高编程效率,简化复杂的任务。然而,正确地管理名字空间的使用对于保持代码的清晰度和避免潜在的命名冲突是非常重要的。在实际开发中,推荐尽量使用完全限定名,特别是在头文件和库代码中,以最小化命名冲突的风险。使用namespace// 定义变量、函数、类等 }// 函数实现// 类实现名字空间是C++中用于组织代码、防止命名冲突的重要特性。

2024-03-12 22:47:00 1251

ros-arduino-bridge py3 双路pid

可以在ubuntu20.04上运行(py3版本)已调通 arduino里使用了双路pid,可以有效解决两个电机存在自身差异导致一个pid很难走直线的问题,并且可以通过串口绘图器,将两路编码器的值全部输出,直接观察曲线图,易于调试。这里的pid使用了Kp,Ki,Kd,Ko四个参数,前面三个参数就是正常的比例系数、积分系数、微分系数,而最后一个Ko是用于将PID三个参数作一个整体的放大或缩小,用于提高调整的精度。(不要随意修改编码器的AB相信号输出引脚以及编码器的计数方式,因为可能会影响到上位机的键盘控制节点出现问题,只能是一侧轮子转动,具体原因还有待研究,如果arduino无法驱动电机,很有可能是引脚接线问题,但不排除一些接触不良、板子本身有问题,有遇到过arduino nano的板子两个IO口是互通的奇葩问题) 关于上位机的部分,也修改为了双路pid,运行arduino.launch后,会在终端实时打印出当前编码器的计数值。

2023-09-15

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除