自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 问答 (1)
  • 收藏
  • 关注

原创 递归算法解析

在这里,基本情况是 n 等于 0 或 1 时直接返回相应的斐波那契数,而递归规则是将问题拆解为两个子问题:计算 n-1 和 n-2 处的斐波那契数,然后相加。基本情况是当 n 等于 0 时返回 1,递归规则则是利用阶乘的定义进行递归计算。2. **递归规则:** 描述如何将原始问题分解为更小的、类似的子问题,并通过递归调用解决它们。1. **基本情况(Base Case):** 定义问题的最小规模,直接求解而不再进行递归。// 举例:计算 5 的阶乘。// 基本情况:阶乘的定义是 0 的阶乘为 1。

2023-12-29 09:06:50 335 1

原创 I2C 总线

主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件。在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件,然后主机接收从器件发送的数据,最后由主机终止接收过程。I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线,只需要两根线即可在连接于总线上的器件之间传送信息,分别是SCL,SDA。

2023-12-06 18:24:56 314 1

原创 线性表之单链表,栈的原理

链式存储结构的基本单位是节点,每个节点包含两部分:数据域和指针域。数据域用于存储元素的值,指针域用于存储下一个节点的地址。线性表的链式存储结构是一种非连续的存储方式,它通过在每个元素中存储下一个元素的地址来建立节点之间的联系。链式存储结构的主要特点是无需连续的内存空间,因此可以更加灵活地分配内存。栈(Stack)是一种后入先出(LIFO, Last In First Out)的数据结构,也就是说,最后一个被添加到栈中的元素将是第一个被删除的元素。链表的结构是动态形成的,及算法运行前,链表的结构是不确定的。

2023-11-16 18:31:42 42 1

原创 线性表之数据表

线性表是若干数据元素的一个线性序列,记为:L=(a0,....,ai-1,ai,ai+1,....an-1)顺序存储结构适用于需要频繁查找、删除、添加的场景,但插入和删除操作可能会引起大量结点的移动,导致效率较低。顺序存储结构的表示:将线性表各元素一次存储于计算机中的一片连续的储存空间中。L为表名,n为表长。线性表可用二元组形式描述:L=(D,R)在C语言中,可借助一维数组来描述线性表的顺序存储结构。类似1、2、3、4、5、6。

2023-11-11 20:34:32 36 1

原创 malloc函数

是一种指针类型,表示指向整数(int)的指针。在C或C++编程语言中,指针是一个变量,它存储了另一个变量的内存地址。通过使用指针,我们可以间接地访问和操作该变量的值。类型的变量时,你可以将一个整数变量的地址赋值给这个指针。然后,你可以通过这个指针来访问和修改该整数变量的值。操作可以一位数组进行操作,假如申请的空间是二维数组,那就可以按照二维数组进行操作。上述空间没有名字,所以需要定义一个指针去指向首地址,所以就变为。free函数,进行空间的释放,对mallo申请的空间进行释放。后续就可以对该空间进行操作。

2023-11-10 11:08:21 49 1

原创 什么是数据结构(三个事儿)

根据数据的特殊字段(称为关键字KEY),计算数据元素的额存放地址,然后数据元素按地址存放。研究数据的前驱和后继,两个数据之间有“线性结构”和“非线性结构”两大类;集合(前后无关系)、线性结构(前一后一)、树形结构、图形结构、建立一个附加的索引表,即索引存储结构=数据文件+索引表。数据的运算:检索,排序,插入,删除,修改。数据结构,研究数字之间的关系;(放到一片连续的存储空间当中)(放到存储器不同地方),用。链式存储(数据结构重点)方式,建立他们之间的关系。

2023-11-08 19:26:57 25 1

原创 嵌入式C语言常见面试题目

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。②懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。

2023-11-07 18:59:19 129

原创 C语言函数

需要注意的是,字符空间和非字符空间并不是互斥的。例如,一个字符串(char数组)既可以被视为包含多个字符空间的变量,也可以被视为一个非字符空间的变量,因为它也可以用于存储数字或其他非字符数据。非字符空间:非字符空间指的是不用于存储字符的数据类型或变量。例如,int、float、double等类型就是非字符空间的数据类型。字符空间:在C语言中,字符空间通常指的是能够存储单个字符的变量或数据类型。在C语言中,字符空间和非字符空间是两个不同的概念。在这个例子中,num、f和d都是非字符空间的变量。

2023-11-03 16:58:31 23

原创 C语言内存空间的使用

需要注意的是,在使用多级指针时需要注意内存分配和释放,避免出现内存泄漏或野指针等问题。这可以确保每次访问该变量时都会重新从内存中读取它的值,而不是使用保存在寄存器中的备份。它通过将数据对齐到特定的内存地址,使得访问这些数据时可以利用CPU的缓存,从而减少内存访问的延迟。字符拷贝函数的原则:内存空间和内存空间的逐一赋值的功能的一个封装题;一般是硬件资源的定义。需要注意的是,目标字符串必须有足够的空间来容纳源字符串,否则可能会导致缓冲区溢出的问题。const 内存属性:1、内存操作的大小,2、内存的读写性。

2023-10-31 11:02:55 30 1

原创 C语言运算符

- * / %是求余运算符,也叫模除运算符,用于求余数。在算术运算中,% 符号通常用于计算两个数相除后的余数。真与假的选择,返回结果不是1就是0 int a 0;if(a) a为假。C语言中有三种逻辑运算符:逻辑与(&&),逻辑或(||),和逻辑非(!C语言中的位运算符用于操作二进制位。这些位运算符的优先级比加减乘除等运算符低。

2023-10-23 13:27:06 17

原创 c语言关键字

命名后,新的类型名称就相当于原类型的一个别名,可以在程序中使用。也就是说,一旦用户在程序中定义了自己的数据类型名称,就可以在该程序中用自己的数据类型名称来定义变量的类型、数组的类型、指针变量的类型与函数的类型等。联合体通常用于在同一块内存空间中存储多个数据类型,例如一个char类型和一个int类型,虽然它们都是不同的数据类型,但是在同一块内存空间中存储并没有问题。结构体中的每个成员变量都占用独立的内存空间,而联合体中的所有成员变量共享同一块内存空间。联合体的工作方式与结构体类似,但它们的内存使用方式不同。

2023-10-19 10:47:53 32

原创 C语言预处理的使用

需要注意的是,宏定义只是简单的文本替换,因此替换值中的所有字符都会被直接插入到代码中。此外,宏定义中的宏名称和替换值之间没有空格分隔,这是C语言中宏定义的一个常见写法。因此,使用宏定义时需要特别小心,确保替换值的正确性和合法性。当它前面的参数是一个带有宏的表达式,而它后面的参数也是一个带有宏的表达式时,它将这两个表达式连接起来。当它前面的参数是一个宏或者一个带有宏的表达式时,它可以将这个宏或者表达式转换为一个字符串常量。宏定义是C语言中的一种预处理指令,它用于在编译时将某个标识符或表达式替换成指定的值。

2023-10-19 08:38:04 23

原创 C语言常见错误

原材料不够undefind reference to 'fun',寻找标签是否实现了,链接时是否加入一起链接;多了multiple definition of 'fun' 多次实现了标签,只保留一个标签的实现。预处理错误:#include "name"gcc -I跟查找头文件的目录来解决。常见错误 not find。

2023-10-18 16:19:58 24

原创 写库函数的思路

先定义好外设寄存器结构体,再实现完外设存储器映射后,再把该指针声明成外设名,

2023-10-18 12:51:39 23

原创 STM32程序启动流程

初始化:程序从地址0x0000 0000开始运行,这是由Cortex M3架构决定的。复位:当复位引脚上的电平保持低电平一段时间后,MCU将复位。复位操作将使程序从地址0x0000 0000开始执行(对于大多数STM32设备)。异常处理:在主循环中,可能会遇到一些异常情况,例如参数不合理、传感器故障等。此时,程序将跳转到异常处理程序进行处理,然后返回主循环。睡眠或等待:在主循环中,如果有不需要一直运行的任务,可以将这些任务挂起,让程序进入低功耗状态。主循环:在硬件初始化完成后,程序将进入主循环。

2023-10-15 08:54:03 324 1

原创 软件开发步骤

这种输出方式的一个显著特点是在需要输出高电平时,需要外部接上拉电阻。开漏输出一般用于电平不匹配的场合,比如需要输出5V,就需要在外部接一个上拉电阻,电源为5V。推挽输出的特点是既可以输出高电平,也可以输出低电平。通过总线的形式,可以很好的将各种外设分离开,可以独立的控制外设的使能与否,控制外设使能与否就是控制这个外设的时钟。绿灯 PB0 ,查找GPIOB的外设时钟,查得走的是APB2,所以查找APB2外设时钟使能寄存器的地址。继续查看GPIOB参考手册,应该配置成输出模式,输出有开漏输出和推挽式输出。

2023-10-11 11:11:15 22

原创 STM32第一个外设,第一个GPIO,什么是GPIO

GPIO的接脚可以由用户通过程控自由使用,根据现实考量和具体应用,可以被设定为通用输入(GPI)、通用输出(GPO)或通用输入与输出(GPIO)等不同模式。在输入模式下,GPIO可以接收来自外部设备(如传感器、开关等)的信号,并可以通过读取某个寄存器来确定引脚电位的高低;在输出模式下,GPIO可以通过写入某个寄存器来让引脚输出高电位或者低电位;同时,对于一些特定功能,还有另外的寄存器来控制它们。图中肖特基触发器的功能是让连续信号变为离散信号,让电平由正弦波变为矩形波。

2023-10-10 13:33:10 75 1

原创 什么是寄存器

寄存器是内存阶层中的最顶端,也是系统获得操作资料的最快速途径。寄存器通常都是以他们可以保存的位元数量来估量,例如一个“8位元寄存器”或“32位元寄存器”。另外,按照功能的不同,可将寄存器分为基本寄存器和移位寄存器两大类。移位寄存器中的数据可以在移位脉冲作用下依次逐位右移或左移,数据既可以并行输入、并行输出,也可以串行输入、串行输出,还可以并行输入、串行输出,或串行输入、并行输出,十分灵活,用途也很广。寄存器编程我目前理解类似于汇编,直接对寄存器地址进行操作,需要先定义指针,然后对指针进行操作。

2023-10-10 10:10:54 118 1

原创 STM32单片机

微处理器(MCU),常叫单片机是一种集成电路芯片,采用超大规模集成电路技术将具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能,可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路,集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域得到广泛应用。STM32是一款由意法半导体公司开发的32位(32位总线宽度)微控制器(MCU),它的CPU是采用的ARM公司的Cortex-M系列的内核设计。

2023-10-10 09:24:17 90

空空如也

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

TA关注的人

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