2025年度总结:充实的一年
回到实验室,只有一个学长在,其他人都去跨年了。打开电脑才想起来,是时候该为过去的一年写下些什么了。如果让我为过去的一年想一个词来形容,那应该就是充实。这一年里有哭有笑、有离别也有相识,想写的东西的确是很多。
今年发生了什么?
高考!
思绪回到25年上半年,那时候还是一名冲刺高考的高三学生,现在回想起来那时的我还真是挺厉害的,要是把现在的我扔到高中去指定过不下去,哈哈。总而言之,结果是还不错的,虽然最终的发挥不及一模,但是还是取得了相对满意的成绩,来到了一个我比较满意的大学。
进入实验室!
当毕业典礼结束,我也正式地告别了高中的生活,来到了青岛,一座很美丽的城市。记得是报道当天,看见电赛实验室居然直接在现场纳新,就直接进了纳新群,后续也是比较顺利地加入了实验室飞行器组。从初中了解了电赛开始,我就一直很向往这四天三夜的比拼,最后还是期待能在明年的省赛和国赛取得好的成绩!
搭建博客!
不得不承认,我是一个喜欢折腾的人。很久之前就有搭建博客的想法,但是鉴于财力不足以及鲜有时间去维护博客,一直没能搭起来。高考之后总算是有了机会,把博客搭建起来了,一开始是使用WordPress...
嵌入式开发必备:深入理解USART通信协议
在嵌入式系统开发中,通信是至关重要的一部分。在电赛中,我们往往会用到STM32开发板、CanMV开发板、树莓派等板载计算机,他们之间要进行数据的交换就必须进行通信。而USART(通用同步
/
异步收发传输器)作为一种常见的串行通信接口,广泛应用于各种设备之间的数据传输。本文将详细介绍USART的工作原理、特点,并给出基于STM32单片机的代码实现示例。
简单介绍一下USART:
USART:Universal
Synchronous Asynchronous
Receiver
Transmitter,即通用同步异步收发器。其核心功能是实现串行通信,它支持同步通信(需要时钟信号同步)和异步通信(无需时钟信号,依赖波特率同步)。
与UART的区别:
UART:Universal
Asynchronous Receiver
Transmitter,即通用异步收发器,仅支持异步通信。
USART 比 UART 多一个 同步时钟输出功能(对应引脚
CLK),可在通信中提供时钟信号。实际应用中,由于串口通信极少使用同步模式,USART与UART在异步模式下可视为等价...
Huffman算法求最优二元树
什么是 Huffman树?
哈夫曼树(Huffman
Tree),又叫“最优二元树”,它的核心思想非常简单,可以用一句话概括:“大权值靠近根,小权值远离根”。这样做也是为了让总的“代价”最小。
做这类题,甚至不需要死记硬背复杂的代码逻辑,只要掌握“排、取、加、放”这四个字的口诀即可。
下面我通过一个具体的例子一步步做。
一、 核心步骤
排:把所有还没有处理的数字(权值)从小到大排列。
取:取出最小的两个数字。
加:把这两个数字相加,得到一个新的数字(父节点)。
放:把这个新的数字放回刚才的队伍里,并把之前那两个取出来的数字删掉。
循环:重复上面的步骤,直到队伍里只剩下一个数字(这个数字就是树的根)。
二、 手把手演示
题目:有一组权值 W = {2, 3, 6, 8, 9},请构建哈夫曼树,并计算带权路径长度
(WPL)。
第一轮:
排:目前池子里是 {2, 3, 6, 8, 9} (已经有序)。
取:最小的俩是 2 和
3。
加:2 + 3 = 5。
放:把 5 放回去。此时池子变成了
{5, 6, 8, 9}(注意:2和3已...
Kruskal算法和Prim算法求最短路径
Kruskal算法:
在离散数学中,Kruskal
算法是一种用于求解带权无向连通图的最小生成树(MST)的经典算法。
它的核心思想非常直观:贪心策略。也就是说,我们总是试图从图中挑选出当前权重最小的那条边,只要这条边不与已经挑选出的边形成回路(环),就把它加入到生成树中。
下面,我将通过一个示例直接演示Kruskal算法的操作方法。
1.算法核心步骤
在开始实例之前,先记住 Kruskal 算法的三个核心步骤:
排序:将图中所有的边按照权重从小到大进行排序。
选边:从权重最小的边开始考察。
判环:
如果这条边连接的两个顶点目前不在同一个连通分量里(即加入这条边不会形成回路),就选中这条边,加入生成树。
如果这条边加入后会形成回路,就丢弃这条边。
结束:重复步骤 2 和 3,直到选够了n − 1条边(n是顶点数),或所有边都考察完了
2.实例设定
假设我们有一个带权无向图,包含 5 个顶点:A,B,C,D,E。
(A,B) : 权重 4
(A,C) : 权重 1
(A,D) : 权重 3
(B,C) : 权重 2
(B...
Dijkstra算法求最短路径
1.什么是 Dijkstra
算法(标号法)?
Dijkstra
算法用于在一个带权有向图(通常权值非负)中,从指定的起点出发,求出该起点到图中所有其他顶点的最短路径。
“标号法”这个名字来源于它的操作方式:算法过程中,每个顶点都会被赋予一个标号。
2.实例设定
T 标号(Temporary
Label,临时标号):表示从起点到该点的暂时的最短路径长度估计值。随着算法进行,T
标号会不断变小(被修正)。
P 标号(Permanent
Label,永久标号):表示从起点到该点的真正的最短路径长度已经找到了,不再改变。一旦一个顶点获得
P 标号,它就相当于被“确定”了。
假设我们有如下所示的带权有向图,设起点为V1,我们需要求V1到其他所有点的最短路径:
(注意:如果两点之间没有直接连线,可以理解为权重无穷大 ∞)
图的边及权重(邻接关系):
V1 → V2
(权重1)
V1 → V3
(权重4)
V2 → V3
(权重2)
V2 → V4
(权重5)
V2 → V5
(权重10)
V3 → V4
(权重1)
V4...
Warshall算法求传递闭包矩阵
1.什么是传递闭包?
在深入了解Warshall算法之前,我们先要明白目标是什么。
传递闭包:对于一个有向图 G,它的传递闭包是另一个图
G,G 和 G 拥有相同的顶点。如果在原图 G 中,从顶点 i 到顶点 j
存在一条路径(路径长度可以大于1),那么在 G* 中就存在一条从 i 直接指向 j
的边。
简单来说,传递闭包就是回答这样一个问题:“从任意一个点出发,我能到达哪些其他的点?”
如果能到达,就连一条直接的边。
举个例子: 如果 A → B,且 B → C,那么在传递闭包中,除了原有的 A→B 和
B→C,我们还会新增一条 A→C 的边。
Warshall算法就是用来高效计算这个传递闭包的利器。
2.Warshall算法的核心思想
Warshall算法的精髓在于“逐步引入中间点”。
想象一下,我们想知道从城市 i 能否到城市
j。一开始,我们只看有没有直达的航班。后来,我们允许在城市1中转,看看会不会增加新的可达路线。接着,我们再允许在城市2中转,看看会不会又增加新的路线……直到我们把所有城市都当作过中转站考虑了一遍,最终得到的就是完整...
我的STM32开发方案:CubeMX+VSCode+Keil5
写在前面:
在学习和使用STM32系列芯片开发板时,一般会使用CubeMX配置工程+keil5开发的模式。但是我并不喜欢keil5的界面和配色方案(不好调),代码补全也很难用。而隔壁的VS
Code的编程界面、语法高亮以及AI插件非常好用,我就在思考如何将我代码编写的工作从keil5转移到VS
Code中。
一开始,我采用的是很多人会选择的VS
Code+STM32CubeIDE for Visual Studio
Code插件的方案,但这种方案配置起来相当麻烦,从MDK-ARM转移到CMAKE也很容易出现一些问题,那么为了解决这些问题,我决定采用keil5和VS
Code联合开发的方式,使用Keil5进行工程文件的配置和Debug;使用Keil
Assistant插件,在VS Code中载入keil5的工程,进行程序的编写。
本文并非是在VS Code上面搭建STM32项目的详细教程,只是一种简单的在VS
Code上面编辑下载Keil5工程的经验贴,只会介绍如何在现有的Keil5开发环境与VS
Code进行对接,不会介绍如何下载安装和配置Keil5、Cub...
离散数学及其应用-个人笔记
本笔记根据屈婉玲教授编写的《离散数学及其应用整理》
持续更新中
第一章:命题逻辑的基本概念
1.1 命题与连结词
命题的相关定义:
命题: 能判断其真值的陈述句
真值: 真、假(0,1)
真命题: 真值为真的命题
假命题: 真值为假的命题
简单命题(原子命题):
不能被分解为更简单的命题的命题
复合命题: 由原子命题通过连结词组合成的命题
关于命题的判断:
判断是否为陈述句
判断它是否有唯一真值
关于连结词:
否定连结词(非)
合取连结词(交)
析取连结词(并)
蕴含连结词(非p并q)
等价连结词(相等)
注意:连结词运算顺序
(),┐,∧,∨,→
1.2 命题公式及其赋值
命题公式相关定义:
命题常项(命题常元):
真值确定,不可改变的命题
命题变项(命题变元): 真值可以变化的命题
合式公式(命题公式):
将命题变项用连结词和圆括号按一定逻辑关系连接起来的符号串
子公式: 合式公式中也为合式公式的一部分
重言式(永真式):
在所有赋值下取值均为真的命题公式
矛盾式(永假式):
在所...
STM32:初识GPIO
从今天开始,我将开始更新有关于STM32的相关内容。如有不足请在评论区联系我,感谢大家的指正。
ps.此笔记使用STM32F407VET6开发板
什么是GPIO?
GPIO,即General Porpose Intput
Output。是通用输入输出端口的简称。可以通过软件控制其输出和输入。stm32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通信,控制以及数据采集的功能。GPIO是STM32最基本的外设之一。
GPIO的工作模式
高电平与低电平:
在进行GPIO的功能讲解之前,我们需要先了解高/低电平这一概念:
在单片机中,高低电平是用来表示数字信号的两个不同状态。通常情况下,高电平对应于逻辑“1”,而低电平对应于逻辑“0”。具体的电压值取决于单片机的电源电压和它的电气标准。例如,在TTL(晶体管-晶体管逻辑)电平系统中,一般认为高电平是在2.4V以上(最高可达5V),而低电平是在0.4V以下。
GPIO的输入功能:
GPIO的输入功能分为上拉输入、下拉输入、浮空输入以及模拟输入四种,下面将会一一说明。
上拉输入:
IO内部闭合上拉电阻的开关,此...
C++学习第十弹:字符串
字符串是C++中重要的一部分,它是数据交互的桥梁、算法逻辑的载体,更是现代编程中无处不在的灵魂。本篇就来介绍一下C++中的字符串。
C++提供了以下两种类型的字符串表示形式: - - C 风格字符串 - C++ 引入的
string 类类型
C++ 引入的 string
类类型是以C风格字符串为基础的,因此先来介绍一下它。
C风格字符串:
C 风格的字符串起源于 C 语言,并在 C++
中继续得到支持。字符串实际上是使用 null 字符 \0 终止的一维字符数组。因此,一个以
null 结尾的字符串,包含了组成字符串的字符。
下面的声明和初始化创建了一个 RUNOOB 字符串。由于在数组的末尾存储了空字符,所以字符数组的大小比单词 RUNOOB 的字符数多一个。
1char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};
请注意,在使用这种方法初...
