- 博客(88)
- 收藏
- 关注
原创 WDG看门狗---独立看门狗和窗口看门狗
STM具有两个内置看门狗,分别是独立看门狗(IWDG)和窗口看门狗(WWDG)。其中,独立看门狗独立工作,对时间精度要求较低。窗口看门狗则要求看门狗在精确计时窗口起作用。
2024-10-28 23:35:35
970
原创 SPI通信(W25Q64)
SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线。它拥有四根通信线,分别如下所示:1)SCK(Serial Clock)串行时钟线。它还拥有一些别名,可以叫做SCLK,CLK,CK.2)MOSI(Master Output Slave Input) 主机输出从机输入。也可能会叫做DO(Data Output).3)MISO(Master Input Slave Output) 主机输入从机输出。也可能叫做DI(Data Input).
2024-10-25 22:37:48
1674
原创 IIC通信(软件读取MPU6050)
MPU6050是一个6轴姿态传感器,可以测量芯片自身X,Y,Z轴的加速度,角速度参数,通过数据融合,可进一步得到姿态角,常应用于平衡车,飞行器等需要检测自身姿态的场景。为什么是6轴传感器?因为它包括3轴加速度计和3轴陀螺仪传感器。加起来就是6轴。同理,如果我们再添加上一个3轴的磁场传感器,就可以变为9轴姿态传感器。其中,3轴加速度计主要是用来测量XYZ轴的加速度。在这里,可能有小伙伴对XYZ轴的概念不太了解,这里我们可以通过查找MPU6050附带的PS产品说明书和寄存器描述。
2024-10-21 17:51:16
931
原创 USART串口(发送和接收)
单片机的串口可以使单片机与单片机,单片机与电脑,单片机与各种各样的模块互相通信,极大地扩展了单片机的应用范围,增强了单片机系统的硬件实力。其中,单片机和电脑通信,是串口的一大优势,可以接电脑屏幕,非常适合调试程序,打印信息。串口的硬件电路,需要其中一个设备的发送端TX连接另外一个设备的接收端RX,接收端RX连接另一个设备的发送端TX。当只需单向的数据传输时,可以只接一根通信线。TX和RX都是单端信号,它们的高低电平都是相对于GND的。所以串口通信的TX,RX,GND都是必须要连接的。
2024-10-19 22:11:35
1836
原创 ADC模数转换器/AD单(多)通道
ADC(Analog-Digital Converter) 模拟-数字转换器,简称模数转换器或者AD转换器。ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。既然有ADC,那么聪明的你,肯定也想到了DAC,那就是数模转换器。作用跟ADC相反。我们之前就有学过有关DAC的操作,比如利用WPM来控制LED的亮度(呼吸灯),电机的速度等等。这些都是DAC的功能。
2024-10-15 19:16:52
2263
原创 TIM输出比较
输出比较可以通过比较CNT和CCR寄存器值得关系,来对输出电平进行置1,置0或翻转的操作,用于输出一定频率和占空比的PWM波形。PWM(Pulse Width Modulation)为脉冲宽度调制。在具有惯性的系统中,可以通过一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速等领域。
2024-10-13 23:25:27
781
原创 TIM定时器(标准库)
什么是定时器?定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断。TIM定时器不仅具备基本的定时中断功能,而且还包含内外时钟源选择,输入捕获,输出比较,编码器接口,主从触发模式等多种功能。根据复杂度和应用场景分为了高级定时器,通用定时器,基本定时器。它们包含的编号以及分布总线和功能如下所示:其中,我们可以看到高级定时器是连接在APB2总线上的,所以前面介绍的APB2性能更高是没有问题的。值得注意的是:不是所有的单片机芯片都拥有所有的定时器。
2024-10-13 10:34:58
1309
原创 EXTI外部中断
什么是中断?中断就是在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。为什么能够在原来位置继续运行的原因就在于我们的单片机具有还原现场的能力。值得注意的是:最好不要在主程序和中断程序里,进行可能产生冲突的硬件配置。例如主程序中正在使用OLED,突然收到中断,从而转到中断函数中,而这个时候中断函数再进行OLED相关的操作,那么在执行完中断程序后,继续执行主程序就会出错。
2024-10-10 09:52:40
1003
原创 GPIO端口的使用
基于库函数的开发方式就是使用ST官方提供的封装好的函数。而如果没有添加库函数,那就是基于寄存器的开发方式,这种方式一般不是很推荐。因为由于ST对寄存器封装的比较好,所以使用库函数的方法,既能满足对寄存器的配置,对开发人员也比较友好,有利于提高开发效率。并且提一下,我们所讲的都是以STM32F10单片机系列作为案例来讲的。今天我们所讲的GPIO都是APB2的外设,所谓APB2也就是桥接1。
2024-09-28 12:21:41
1535
原创 带你重新深入了解STM32单片机
本篇文章主要讲述对STM32单片机的介绍,包括片上资源和外设,STM32产品系列,内存存储器容量以及STM32的系统结构,引脚定义,启动配置等等。这个可以根据它的产品手册来查询获取。相关的资料我都会放在我主页资源当中,如果有需要的小伙伴可以取走。这里对它的引脚定义中可能遇到的问题进行一下讲解。其中主功能就是上电之后默认的功能,一般和引脚名称相同;如果不同的话,引脚的实际功能就是主功能而不是引脚名称的功能。默认服用功能是IO口上同时连接的外设功能引脚。
2024-09-27 21:20:25
1081
原创 第十四届蓝桥杯嵌入式国赛
本次国赛题目主要设计到使用LCD显示4个界面,包括 实时数据界面,报警参数界面,报警统计界面以及最后的回放设置界面(这应该对于大多数人来说是最难的,包括我自己,当时在做的时候没有理解它所说的是什么含义,好在后面还是开窍了)。主要设计到PWM波的输出和PWM的输入捕获,ADC数模转换数据的采集,以及通过配置相关的LED和LCD来展示一些效果和结果,DS18B20来获取环境温度数据等等。关于LCD相关代码,我们可以直接使用官方提供的资料代码,这在比赛中都是会给出的,所以这里我也不再展示有关LCD的相关代码了。
2024-09-23 14:02:28
2993
2
原创 蓝桥杯嵌入式的学习总结
因为在我们的产品手册中说明了频率为80MHz,也就是80000000,我们用这个数除以分频系数,再除以重装载值就是我们最后的定时器间隔时间。并且内部上下拉全部断开。4. GPIO端口总共有八种模式,输入模式有四种:上拉输入模式,下拉输入模式,浮空输入,模拟输入。关于IIC通信的相关代码,我们也可以直接使用官方所给的资料当中的代码,我们只需要在此基础上再添加两个代码即可,也就是IIC通信的读取和写入。这里包含了按键的点击,长按的判断,并且使用到了定时器作为中断,用来间隔很短的时间来查询按键是否被按下。
2024-09-22 22:25:18
2897
原创 C++运算符重载
C++运算符的重载总共可以分为六种,分别为加号运算符重载,左移运算符重载,递增运算符重载,赋值运算符重载,关系运算符重载,函数调用运算符重载。下面我来分别介绍这六种运算符重载的方法和实现。所谓运算符重载,也就是堆已有的运算符重新进行定义,赋予另一种功能,以适应不同的数据类型。
2024-09-08 22:28:06
846
原创 C程序设计(潭浩强教授版)精选程序题
解题思路:牛顿迭代法又称牛顿切线法,它采用以下的方法求根:先任意设定一个与真实的根接近的值x0,作为第1次近似根,由x0求出f(x0),过(x0,f(x0))点做f(x)的切线,交x轴于x1,把x1作为第2次近似根,再由x1求出f(x1),过(x1,f(x1))做f(x)的切线,交x轴于x2,再求出f(x2),再做切线。他采取的方法是,在一张纸上写上1~1000的全部整数,然后逐个判断它们是否素数,找出一个非素数,就把它挖掉,最后剩下的就都是素数。从第三行开始,中间的数都是上一行同列和前一列的两个数之和。
2024-08-29 15:53:12
930
原创 对象的初始化和清理(构造和析构)
任何事物都需要有一个初始化的过程,例如手机,我们在买来使用的时候手机其实就已经被初始化了,如设置的语言为中文等等。同样,在使用后,我们为了自身数据的安全性,就会考虑清楚数据。我们的对象同样如此,也需要一系列的初始化和清理操作。为了解决上面这两个问题,我们C++中就可以使用构造函数和析构函数来解决。如果我们 不提供构造函数和析构函数,那么编译器就会自动提供,只是都是空实现,也就是空的代码。
2024-08-16 15:30:02
1075
原创 C++函数的高级用法
这两个函数名称都为func,但作用却大不相同,第一个func只有一个参数,执行的就是返回这个参数的值的功能,而第二个func有两个参数,就可以实现返回这两个数之和的功能。这就是函数重载的作用。就是因为我们给形参a设置了默认值之后,而没有给它之后的形参设置默认值,所以主函数中调用这个函数的时候,实参2的值编译器不知道是要传给a还是b跟c。这段代码就表示该位置占了一个整型的数据类型,在调用这个函数的时候,就必须传入一个与该数据类型相同类型的数值。函数重载的作用就在于函数名可以相同,提高了复用性。
2024-08-15 15:31:13
511
原创 C++引用操作
在学习C++引用操作之前,我们了解一下相关概念。C++可以是一种面向对象编程,它的内存分区中主要分为4个区域,分别是其中代码区主要存放函数体的二进制代码,由操作系统进行管理。全局区主要用来存放全局变量和静态变量以及常量。堆区主要用来存放函数的参数值,局部变量等,由编译器自动分配释放,也就是说是不能一直存在的。栈区则由程序员分配和释放,如果程序员不释放,程序结束时由操作系统自行释放。之所以分为不同的区域,就是为了让不同区域存放不同的数据,赋予不同的生命周期,给我们更大的灵活编程。
2024-08-14 10:23:13
696
原创 通讯录管理系统
本次实验通过设计并实现一个通讯录管理系统,加深了对C++语言结构体、数组、指针、函数、控制结构等概念的深入理解。通过实际操作,掌握了如何将这些知识点应用到实际编程中,提高了编程实践能力和问题解决能力。未来将继续努力,提高自己的编程水平和能力。
2024-08-12 14:52:11
843
原创 药店的销售管理系统
本实验通过编程实现了一个完整的药店销售统计系统,涵盖了药品信息管理、销售记录管理、库存警告和用户交互等多个方面。通过此系统,药店可以方便地管理药品库存和销售情况,提高管理效率。在实验过程中,我深入理解了结构体、数组、函数、循环和条件判断等编程概念,并掌握了许多程序调试技巧。此外,本次实验还锻炼了我的逻辑思维能力和问题解决能力,为我后续的学习和工作打下了坚实的基础。
2024-08-10 13:50:04
1956
1
原创 基于Dijkstra的校园导游系统
当用户已经明确了自己想要前往的景点,就可以输入用户当前所在位置以及想要前往的景点,系统就会给出到达目标景点的最短路径,切实帮助用户快速到达目的地。首先用户会看到这样的一个交互界面,这是文本形式的交互界面,所以这个可以作为我们这个系统的改进,未来可以考虑增加图形用户界面(GUI),提高用户体验。系统就会给出最短路径长度,以及最短路径,也就是从学校北门先经过篮球场,最后到达图书馆,就是最短的路径。在查看了整个校园大致分布图后,如果用户不知道该前往何处,就可以查看推荐景点,前往合适自己前往的景点。
2024-08-08 13:51:00
1177
原创 基于各种排序方法的综合比较
按平均的时间性能来分,时间复杂度为n*log阶的有快速排序,堆排序和并归排序其中以快速方法最好。时间复杂度为n*n阶的有直接插入排序,冒泡排序和简单选择排序,直接以直接插入排序最优。特别是对那些关键字近似有序的记录序列。时间复杂度为n的排序方法只有基数排序。当排序记录序列按关键字顺序有序的时候,直接插入排序和冒泡排序能达到n阶的时间复杂度。而对于快速排序,这是最不好的情况,会退化到n*n阶的时间复杂度。简单选择排序,堆排序和归并排序的时间性能并不随记录序列中的分布而改变。
2024-08-07 09:07:04
254
原创 希尔排序(插入排序)
插入排序找到插入位置一共有三种方法,分别是直接插入排序,二分插入排序以及希尔排序。希尔排序的基本思想:先将整个待排记录分割成若干个子序列,分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。它一种通过缩小增量,多遍插入排序来达到目的的算法。
2024-08-07 08:46:39
310
原创 构造散列表以及处理冲突问题
而二次探测法则每次往后移动1的平方,-1的平方等等的二次序列。所以我们要想使用散列表就得解决好两个问题,一个就是构造一个好的散列函数,所选函数尽可能简单,以便提高转换速度。2)根据选择的冲突处理方法,计算关键字key的下一个存储地址,若该地址对应的链表不为空,则利用链表的前插法或后插法将该元素插入此链表中。1)取数据元素的关键字key,计算其散列函数值(地址)。开放定址法的基本思想就是有冲突时就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将数据存入。4)关键字的分布情况。
2024-08-06 21:46:19
737
原创 数据结构--平衡二叉树
平衡二叉树又称AVL树(Adelson-Velskii and Landis)。1)左子树与右子树的高度之差的绝对值小于等于1;2)左子树和右子树也是平衡二叉排序树。这里为了方便起见,给这个结点左子树和右子树的高度差起一个名字,叫结点的平衡因子(BF)。
2024-08-06 20:57:17
423
1
原创 动态查找表--二叉排序树
二叉排序树又称为二叉搜索树,二叉查找树。二叉排序树可以是一个空树,也可以是一个满足下面性质的二叉树:1)若其左子树非空,则左子树上所有结点的值都小于根结点的值。2)若其右子树非空,则右子树上所有结点的值均大于等于根结点的值。3)其左右子树本身又是一棵二叉排序树。同时,我们若使用中序遍历的方法来遍历一个非空的二叉排序树,那么得到的数据元素序列就是一个按关键字排列的递增有序序列。下面我们来看下二叉排序树的//定义关键字//其它数据域}ElemType;//数据域//左右孩子指针。
2024-08-06 16:35:54
515
原创 查找--顺序查找
由同一类型的数据元素(或记录)构成的集合。根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或记录。用来标识一个数据元素或记录的某个数据项的值。其中可唯一地标识一个记录的关键字是主关键字,反之,用以识别若干记录的关键字是次关键字。查找表可分为两类:静态查找表和动态查找表。其中,静态查找表为仅做“查询”操作的查找表,动态查找表能够做插入和删除操作的查找表。现在我们要讲的顺序查找就是一种静态查找表,另外静态查找表还有折半查找和分块查找。
2024-08-06 16:00:38
544
原创 图的应用---关键路径
关键路径就是在一个AOE网中路径长度最长的路径,它是影响整个工程的关键。用一个有向图表示一个工程的各子工程及其相互制约的关系,以弧表示活动,以顶点表示活动的开始或结束事件,称这种有向图为边表示活动的网,简称为AOE网(Activity On Edge)。
2024-08-05 15:58:08
419
原创 图的应用---最短路径
所谓最短路径:就是在有向网当中,A点(源点)到达B点(终点)的多条路径中,寻找一条各边权值之和最小的路径,即最短路径。如果是求解一个顶点到其他所有顶点的最短路径,就可以使用Dijkstra(迪杰斯特拉)算法。如果是求解所有顶点间的最短路径就可以使用Floyd(弗洛伊德)算法。
2024-08-04 22:51:41
493
原创 图的应用--最小生成树
生成树是图的极小连通子图,也就是去掉一条边就非连通的图,并且这个图的所有顶点都由边连接在一起,但不存在回路。一个图可以有很多个不同的生成树。生成树的顶点个数和图的顶点个数相同。一个有n个顶点的连通图的生成树有n-1条边。在生成树中再加一条边必然形成回路。生成树中任意两个点之间的路径唯一。如果是深度优先遍历形成的生成树就叫作,广度优先遍历形成的生成树就叫做。最小生成树具有非常广泛的用途,例如求线路的最少费用。
2024-08-04 22:17:04
424
原创 广度优先遍历图--BFS
上面这段代码利用了一个队列作为容器,首先队列中存放一个起始顶点,接着将队头元素出队,这里也就是我们的起始顶点,出队后,将这个出队元素所有未被访问过的邻接点入队。然后重复上面这个过程,只是每次出队的队头元素换了,后面入队和出队的顶点自然也就不一样了。首先从图的某一个顶点出发,依次访问该结点的所有邻接点,再按这些邻接点被访问的先后顺序访问与这些邻接点相邻接并且没有被访问过的顶点。广度优先遍历有点类似于之前我们学习过的树的层次遍历,就是要从图的一个顶点出发,依次访问每一层上面的顶点。
2024-08-04 16:56:02
256
原创 深度优先遍历图--DFS
从已经给出的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算。
2024-08-04 16:29:39
589
原创 邻接表(链式存储)实现图的存储
其中类如v1的结点为头结点,头结点后面的结点为边结点,表示与头结点中顶点相连的边的信息。1)首先输入总的顶点数和总边数2)接着建立顶点表:依次输入顶点的信息存入到顶点表当中,并使每个表头结点的指针域初始化为NULL。3)创建邻接表:依次输入每条边两边的顶点,然后确定两个顶点的序号n和m,建立边结点,将这个边结点分别插入到V(n)和V(m)对应的两个边链表的头部。
2024-08-03 15:30:26
522
原创 邻接矩阵实现图的存储
1. 图的定义所谓图就是包含顶点和边的集合,是一种多对多的关系。用符号表示为:G=(V,E)。其中,V代表顶点(数据元素)的有穷非空集合,E代表边的有穷集合。也就是说一个图可以没有边,但顶点不能没有。2. 有向图和无向图顶点之间靠一个带有方向的弧连接的图就叫有向图,无向图则相反,边并没有方向。3. 完全图任意两个点都有一条边相连的图。4.稀疏图和稠密图稀疏图就是有很少边或弧的图。而稠密图则是有较多边和弧的图。5. 权和网图中边或弧所具有的相关数称为权。表明从一个顶点到另外一个顶点的距离或耗费。
2024-08-03 15:02:16
997
原创 哈夫曼树及哈夫曼编码
在学习哈夫曼树之前,我们先了解几个基本概念。1.路径:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径。2.结点的路径长度:两结点间路径上的分支数。3.树的路径长度:从树根到每一个结点的路径长度之和。记作:TL。4.通过分析可以知道,结点数相同的二叉树中,完全二叉树是路径长度最短的二叉树。但路径长度最短的二叉树不一定是完全二叉树。5.权:将树中结点赋给一个有着某种含义的数值,这个数值称为该结点的权。6.结点的带权路径长度:从根结点到该结点之间的路径长度与该结点的权的乘积。7.
2024-08-01 22:06:10
994
原创 树和二叉树的了解掌握
目录一. 树和二叉树的定义二. 树的基本术语三. 二叉树的性质四. 二叉树的存储结构五. 二叉树的遍历六. 二叉树遍历算法的应用七. 线索二叉树 树就是具有n个结点的有限集合。有且只有一个根节点,其余结点又可以组合成一棵新的树,所以树的定义也是一个递归的定义。当它不包括结点的时候,也就是n等于0的时候,就为空树。 二叉树也是具有n个结点的有限集合。与树最大的区别就在于,不管二叉树中的某个结点有没有子树,它都包括左子树和右子树。也就是说当一个结点没有分支的时候,它也相当于拥有两个为
2024-08-01 11:43:59
1282
原创 串--KMP算法
KMP算法是BF算法优化之后的模式匹配算法,其中的i值不再需要回溯,只需要保持原值就可以,而另外改变j的值,以达到算法效率的大大提高。
2024-07-29 16:28:07
365
原创 串--BF算法
BF全称为Brute-Force,是一种简单匹配算法,采用穷举法的思路。即从主串S的每一字符开始依次与子串T的字符进行匹配。其中的子串T称为模式串,如果主串中包含一个连续子串字符序列与模式串相等,则返回这个子串第一个字符在主串中的序号,否则匹配失败,就返回0。
2024-07-29 16:00:40
662
原创 循环队列和链队列的操作实现
队列是仅在表尾进行插入操作,在表头进行删除操作的特殊线性表。它是一种先进先出的线性表。队列的存储结构有两种,分别为链队和顺序队(一般是循环顺序队,也叫循环队)。
2024-07-28 21:54:38
472
原创 双向链表和双向循环链表
所谓双向链表就是在单链表的每一个结点里增加一个指向其直接前驱的指针域prior,这样链表中就形成了有两个方向不同的链,故称为双向链表。其中,prior和next分别表示该双向链表中的前驱指针和后继指针。
2024-07-27 13:20:05
498
第十四届蓝桥杯嵌入式国赛的相关硬件配置
2024-09-23
第十四届蓝桥杯嵌入式国赛真题完整源代码
2024-09-23
CT117E-M4产品手册(1).pdf
2024-09-22
蓝桥杯嵌入式基本外设的相关完整源代码配置
2024-09-22
蓝桥杯嵌入式基本外设使用的CubeMX配置
2024-09-22
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人