- 博客(69)
- 收藏
- 关注
原创 STM32单片机学习(15) —— PC串口通信实验
OLED屏幕(Organic Light-Emitting Diode,有机发光二极管)是一种基于有机材料的自发光显示技术。相比于传统的LCD(Liquid Crystal Display,液晶显示屏),OLED屏幕的每个像素都可以独立发光,因此不需要背光模块。自发光,显示效果好。响应速度快,适合动态显示。视角广,色彩鲜艳。轻薄柔性,设计灵活。低功耗:尤其是显示黑色或深色内容时,OLED屏幕的功耗比较低。成本较高。寿命相对较短。容易烧屏(长时间显示静态图像会导致像素老化)。
2026-05-17 12:54:29
390
原创 STM32单片机学习(14) —— STM32的串口外设
本文的末尾,我们还需要学习一下单片机USART外设的基本工作原理,再分析一下单片机引脚的使用及PC端接线。通过以上内容的学习,我们就可以在下次,实现单片机与 PC 端之间的双向串口通信。
2026-05-17 12:53:29
539
原创 STM32单片机学习(13) —— 串口通信协议
对于任何通信方式而言,通信协议的学习都是核心内容,没有之一。因为无论使用的是哪一种通信接口,本质上都是在按照既定的通信协议,对数据进行收发和解析。串口通信的通信协议相对比较简单,同时又几乎是最常用的通信方式,所以我们先来学习一下串口通信,作为通信学习的入门。串口通信的硬件接线方式。串口通信的数据帧格式。波特率问题。最后本章节的末尾,我们还需要学习一下单片机USART外设的基本工作原理,再分析一下单片机引脚的使用及PC端接线。通过以上内容的学习,我们就可以在下一章节中,实现。
2026-05-15 21:04:17
397
原创 STM32单片机学习(12)——串口通信相关概念
为了避免**“迷迷糊糊就把概念学完了,代码写完了,然后迷迷糊糊的就实现功能了”**这种情况的出现,我们还是要讲解一些基本的概念。表格第二列的引脚名,指的是单片机进行该通信时的需要使用的引脚名,具体的内容在讲解对应通信协议时再详谈。上一节我们提到,通常所说的“串口”,专指基于 UART 通信协议的串行通信接口,也就是UART接口。当然,不同的单片机能够支持的通信协议是不同的,我们使用的C8T6单片机支持哪些通信协议呢?当然,与单片机通信的另一个设备也是类似,只是作为单片机开发,我们通常不考虑它的实现。
2026-05-14 22:22:14
358
原创 STM32单片机学习(11)——GPIO输入实验
LM393电压比较器:LM393 是一种双路电压比较器,能够对两个输入电压(正极 + 和负极 -)进行比较,并且根据比较的结果使得DO口输出低电平或者进入高阻态状态。所以LM393的输出模式是开漏输出模式,可以输出低电平或高阻态两种状态。LM393比较器,和施密特触发器一样,同样是一种将模拟信号转换到数字信号的元器件。当正极(+)输入电压 大于 负极(-)输入电压时:相当于开漏输出模式,输出1,即DO 引脚进入高阻抗状态,电路在DO引脚处完全断开。
2026-05-14 22:18:34
518
原创 STM32单片机学习(10)——GPIO输入
通用推挽输出通用开漏输出复用推挽输出复用开漏输出这两个模式我们暂时还用不到,所以这里我们先跳过,后面用到的时候再讲解。上拉输入模式下拉输入模式浮空输入模式模拟输入模式其中模拟输入模式不常用且暂时也用不到,本章节就只讲最常用的三种输入模式,上拉、下拉以及浮空输入模式。有个小细节可以留意下:输入模式没有通用复用之分!当然一开始看到这些输入模式的名称,肯定是很懵逼的,但没有关系,下面我们慢慢学习。
2026-05-13 09:18:01
382
原创 STM32单片机学习(9)——简单的实验
STM32(9)——STM32(9)——创建文件任务需求代码编写开时钟初始化接口对引脚进行操作实现闪烁功能向工程中添加功能模块SPL标准库开发实际上是一种很简单的方式,夸张一点说,甚至可以不用敲一行代码,具体SPL开发我们会用实验一来演示如何利用SPL库来进行开发。
2026-05-13 09:08:32
189
原创 STM32单片机学习(8)——GPIO通用输出
GPIO是词组General Purpose Input Output的首字母缩写,直接翻译成中文就是通用输入输出端口,是MCU中最基础、且最常用的外设部分。注意:其中PD0和PD1引脚常用于配置启用外部晶振,通常都不能用于普通IO引脚,最小系统板上也没有将这两个引脚引出。STM32F103C8T6一共有48个引脚,而GPIO下的普通IO引脚就占据了37个,这充分说明了,GPIO的重要性以及基础性。四种输出模式,配置输出模式后,可以通过引脚输出高低电平。
2026-05-12 15:59:04
421
原创 STM32单片机学习(7)——最小系统板
本章节的标题是最小系统板什么是最小系统板。单片机本身只是一颗裸芯片。单片机的引脚需要连接外部电路才能使用,但裸芯片引脚非常细小,直接接线或焊接,显然不具备实操性。裸芯片本身不具备完善的供电电路,直接供电风险很大。单片机一旦运行死机卡死,需要进行复位,所以还需要提供明确可靠的复位方式,比如复位按钮。此外还需要考虑程序的下载、调试等问题。因此,裸芯片是无法直接使用的。以单片机芯片为核心,配合必要的外围电路,构建一套能够保证单片机正常供电、正常复位、能够下载调试程序并稳定运行程序的最小硬件系统。
2026-05-12 15:57:14
405
原创 STM32单片机学习(6)——系统结构与引脚定义
在前一章节中:我们解释了STM32相关的一些名词,知道了我们使用的MCU的基本信息,还了解了两个重要的手册文档。MCU的系统结构,了解一下MCU的外设及其功能。MCU的引脚定义,了解一下MCU实现功能的操作方式。比起单片机的系统结构,对程序员而言,引脚定义是更重要的知识点。首先,我们查阅《数据手册》来获取我们心态的引脚定义图,由于我们使用的是STM32F103C8T6微处理器,它的封装工艺是LQFP,具有48引脚。
2026-05-12 15:56:40
383
原创 STM32单片机学习(5) —— STM32的一些名词解释
ARM不直接从事芯片的生产和销售工作,而是专门从事**ARM架构、ARM处理器核心(CPU)**的研发设计工作,然后卖给下游合作伙伴厂商,由下游合作商设计生产出具体的产品进行售卖。ARM架构是一种使用**精简指令集(RISC)**的系统架构,其特点是通过减少指令集的数量,仅重复执行简单的指令,实现了更简单、更高效、功耗更低、体积更小的处理器设计。随后从2004年开始,ARM公司推出了Cortex-M系列处理器核心,正式放弃了数字命名的方式,而是提供了多个处理器核心系列,分别针对不同的市场需求和应用场景。
2026-05-09 10:53:23
447
原创 STM32单片机学习(4)——嵌入式概述
什么是嵌入式系统?嵌入式开发到底是做什么的?我们通过两个具体的案例来阐述嵌入式系统的概念和内涵。分析上述两个案例,它们都是嵌入式非常经典的应用场景,它们之间有什么共性?功能单一且简单,不像传统计算机系统拥有复杂的软硬件设施。功耗低。追求高实时性和高可靠性。应用于特定的场景,整个软硬件系统往往是更大系统的一部分。人机交互方式简单,往往只需要简单的按键或简易的交互系统,不需要键盘鼠标,往往也没有复杂的操作系统。
2026-05-09 10:52:52
464
原创 STM32单片机学习(3)——前置知识学习
作为嵌入式软件开发工程师,我们不需要掌握嵌入式相关的全部硬件知识,没有必要,也没有时间精力去全面掌握。但一些基本的电学知识(初中物理),数模电知识,电器元件等硬件知识还是有必要了解的。本文将大致给大家罗列讲解一下必要的硬件知识。**N型半导体主要载流子是自由电子,带有负电,电流的方向和载流子的运动方向是相反的。**但由于自身热运动等原因,N型半导体中也存在极少数的空穴。**P型半导体主要载流子是空穴,带有正电,电流的方向和载流子的运动方向是相同的。**同时P型半导体中也存在极少数的自由电子。
2026-05-09 10:52:19
374
原创 STM32单片机学习(2)——新建标准工程库工程
我们使用标准库的形式来进行STM32开发时,首先需要做的就是在Keil5软件中,新建一个标准库的工程。Keil5新建工程文件夹添加启动文件添加寄存器开发必要文件创建用户工作区域需要注意的是,推荐大家把第一次新建的标准库工程作为一个模板工程,后面直接复制这个模板工程使用,而无需再次新建工程。启动核心文件:请大家先在模板工程中创建两个文件夹,然后手动把这些文件复制过来。关于寄存器开发方式,我们暂时先不考虑使用这种方式,后续有机会我们再聊一聊这种开发方式。
2026-05-08 20:50:33
427
1
原创 STM32单片机学习(1)——keil5安装以及环境部署
本系列文章文章旨在记录从0开始学习嵌入式方面知识的过程,大致会分为3-4个板块,也希望能够帮助有想法入门的小白。文章涉及到的相关环境:嵌入式软件环境链接: https://pan.baidu.com/s/1mVThv6JQw1I8C54aNZdAUw?pwd=njc4 提取码: njc4–来自百度网盘超级会员v7的分享我选用的板子是stm32F103,以及使用ST-Link进行烧录,这些都可以在淘宝上买到。言归正传,这次主要记录keil5的安装。
2026-05-08 20:49:43
416
原创 C语言指针杂谈
C/C++语言与其他语言最大的区别,也就是指针了,这也是C语言本身的魅力所在,赋予了程序员更多的权限。所以这篇文章主要记录一些我近几日所学,主要针对指针,记录下我的理解。如有纰漏或错误,也欢迎大佬指正交流。void*指针类型,就是单纯的存储地址值,它不可以直接使用一般的指针类型,同时拥有两个信息:a. 地址值 b. 类型信息地址值决定了"指针则直指向的这块空间从哪里开始"类型信息决定了"这块内存空间有多大,如何使用,如何解释这块内存"
2026-04-01 15:52:37
403
原创 搭建内存池2.0
但是里边有些瑕疵,在后面我有尝试修改,但是realloc总是会报错,是因为指针处理的问题,指针混论然后还有野指针,后来反复问AI修改,改的不能运行了。但是这次为了彻底杜绝指针带来的问题,也没有选择留有将内存块摘出的操作,而是在块的结构体中加了一个use变量来确定这个块是不是空闲块,这样一来不管是否使用都在一个链表上。这样的好处是,做合并操作就没有复杂的指针了。而且吸取了上一次的教训,这一次的函数我写的功能更为单一和精简,在realloc功能中也得到了复用,下面就是我的实现和我的测试结果。
2026-03-30 16:12:58
335
原创 C语言进阶项目——搭建内存池
本文介绍了一个C语言内存池实现项目,主要模拟了malloc、free等内存管理函数的功能。项目采用链表结构管理内存,通过全局字符数组作为内存池。关键实现包括:1) 初始化内存池时扣除链表头空间;2) 使用首次适应算法分配内存块,支持块分裂;3) 实现内存回收时采用头插法维护空闲链表。项目还处理了异常情况,如非法内存申请等。通过地址类型转换和链表操作,实现了基本的内存管理功能,为深入理解内存机制提供了实践案例。
2026-03-28 12:02:51
384
1
原创 leetcode刷题(python)——(十)
所以我们在该区间内使用二分查找寻找最合适的结果,通过一个judge函数来判断,judge的实现使用遍历即可,当大于weight时天数+1,最后返回的天数与给定的days相等,则为最低载重。该题可以使用二分法和牛顿法,我在之前的文章中有提到过,详情可以参见该篇文章(C语言实现)https://blog.csdn.net/weixin_46640900/article/details/136544697?,货物必须按照给定的顺序装运。的两个数,并返回两个数在数组中下的标值。天内将所有包裹送达的船的最低运载量。
2024-04-27 00:48:42
887
原创 leetcode刷题(python)——(九)
使用二分查找,但是需要注意的是,二分查找有时会使我们陷入死循环,所以在查找时,需要在更新边界时+1或-1,这时当跳出循环时,left == rigt而mid可能不再是所求结果。:在数组中找到目标值,并返回下标。如果找不到,则返回目标值按顺序插入数组的位置。同样使用二分查找逼近目标位置,若目标值不存在则返回其下标。我们只能通过调用接口来判断自己猜测的数是否正确。在数组中的位置,如果找不到,则返回 -1。:要求返回题目选取的数字。:给定一个排好序的数组。:给定一个升序的数组。
2024-04-27 00:36:51
1296
原创 leetcode刷题(python)——(七)
使用双指针法来解题,把数组中的0和2放置到两侧,当两个指针相等时停止循环。:将数组进行排序,使得红色在前,白色在中间,蓝色在最后。同样只是简单的排序即可,这里使用堆排序简单演示一下。使用排序算法即可,这里使用快排。,分别代表红色、白色、蓝色。:给定一个未排序的整数数组。
2024-04-22 20:29:35
973
原创 leetcode刷题(python)——(六)
求解该题逆序列,我们可以先反转该序列,然后加入到新的数组我们每插入一个数时,插入前的数据,在原数组中比它小,并且在它后面可以和它构成逆序对的数字。在该题中首先合并两个数组,然后因为两个数组都是有序的,所以可以使用插入排序或者选择排序,将后面的数据插入到前面的有序序列。首先先做好排序,确认各个分数对应的名词,然后通过字典将分数与名词形成映射,随后对原表进行遍历,在字典中寻找结果。:找出他们的相对名次,并授予前三名对应的奖牌。名运动员在比赛中的成绩。:计算出数组中的逆序对的总数。
2024-04-21 22:35:03
890
原创 leetcode刷题(python)——(五)
在本题中,使用到了sort()函数,但是简单的排序并不能解决问题,我们需要考虑,如果是两位数的话,在个位的数字是不是小于列表剩余未排序的数字,在sort中提供了一个key的参数,可以帮助我们自己指定规则。该题只是单传的考察排序算法,可以使用sort(),但建议手撸一边加深印象,需要注意的是,该题不可以用O(n^2)的算法。本题可以使用选择排序解决,但是在这里我选择另外一种方式,首先记录所有零的索引,然后通过记录的索引逐个移动。:将数组中的数字拼接起来排成一个数,打印能拼接出的所有数字中的最小的一个。
2024-04-21 21:29:37
1336
原创 leetcode刷题(python)——(四)
我们可以发现轮转后的数组是把原来的四个数组按照下标重新组成了新的四个数组,按照下下标重新组成数组,我们不难想到zip()函数。而后我们发现15 13 2 5的顺序变成了倒序,我们可以选择在新数组中变成倒叙,或者在zip之前将四个数组重新排列。在该题中我们可以借鉴上一题的思路,因为我们要获得这些元素的顺序,可以不断的进行反转。:以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。在该题中我们可以先尝试举几个例子,发现一些规律。:按照顺时针旋转的顺序,返回矩阵中的所有元素。大小的二维矩阵(代表图像)
2024-04-18 22:47:58
1113
原创 leetcode刷题(python)——(三)
在python当中我们可以很好的利用列表的切片来完成,可以省去一个个移动的麻烦,但是需要注意的是,在k值可能是大于n,所以我们需要用k%n来定位。我的解决办法是,从后向前检验10的存在,有10则进1,然后要在下标为0的位置加一个特判。对于该题,也就是求两侧和的过程,用一个遍历即可,需要注意的是,要先把左值初始化为0。该问题中只需要在末尾加1即可,但是需要考虑的是进位。:找到「左侧元素和」与「右侧元素和相等」的位置,若找不到,则返回。:给定一个非负整数数组,数组每一位对应整数的一位数字。
2024-04-18 22:27:14
608
原创 leetcode刷题(python)——(二)
该题思路在上述解释中已经清晰的展示出,不需要过多赘述,因为使用python解题,应尽量使代码简洁。可以通过列表表达式来解题,因为数组中的第一个元素是不需要改变的,所以我们使用切片,直接选择后面的元素。该题可以很明显的看到是二维数组中求和最大的一维数组。但是python中提供了内置函数帮我们解决这一问题,个人认为在使用python的过程中,能更简洁的代码可以选择更简洁的做法,摒弃掉一些实现细节的考虑。:将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。:返回最富有客户所拥有的资产总量。
2024-04-16 20:04:57
880
原创 leetcode刷题(python)——(一)
选择使用python解题应当充分利用python的特性,列表支持加法和乘法的,所以在实现上要更简便。同样是一道很简单题,只需要遍历一次字符串stones即可。代表石头中宝石的类型,再给定一个字符串。中每个字符代表了一种你拥有的石头的类型。:计算出拥有的石头中有多少是宝石。一道很简单基础的题,直接返回即可。开始计数 ,对于所有。:返回这两个整数的和。
2024-04-16 19:10:47
1246
原创 C语言程序与设计——工程项目开发
我们可以发现在编译过程中,报出的警告是未声明函数,而不是未定义,当我们对对象文件进行编译的时候才会出现未定义的错误。也就是说在编译前,计算机检查的是语法和语义的错误,在编译后,报出未定义,也恰恰说明了,在链接过程中,程序开始进行组合。
2024-04-08 21:59:22
1904
原创 C语言程序与设计——指针地址与main函数
在C语言中,最重要的就是对于指针和地址的理解,因为C语言是更接近底层的编程语言,所以它可以允许开发者对内存操作,这也是区别于其它编程语言的一个重要特性。如何对内存进行操作呢。我们知道在编程过程中,在任何语言中,我们在定定义一个变量的过程中,实际上就是向操作系统申请了一块内存,但由于其它编程语言不支持我们对于内存进行操作,所以我们只知道申请了一块内存,但不知道该位置在哪。由于C语言支持我们对于内存的操作,所以我们可以通过在变量前加一个取地址符&,得到该内存的地址,数组的话无需加取地址符。
2024-04-04 14:09:10
1341
原创 C语言程序与设计——复杂结构
结构体在C语言中是一种重要的数据类型,或者说是一种用户自定义的相同或不同数据类型的集合。可以帮助我们封装一组相关数据,使其数据呈现更直观。例如我们想要统计一个学校学生的基本信息。可以将一个同学的信息按照如下存储。这样我们输入和查询数据的时候都可以更快的定位到每个学生的具体信息。在访问结构体内部数据时,根据访问形式的不同,分为直接引用和间接引用匿名结构体,在声明的时没有定义结构体名称,所以匿名结构体只有在声明的时候可以被访问。匿名结构体我们会在下文共用体中演示。
2024-03-31 13:16:21
1251
1
原创 C语言程序与设计——预处理命令
着一种形式比较简单只是单纯的替换,这里对该种情况不做过多介绍#define PIint r = 5;可以通过宏封装一个简易的表达式,但是为什么叫傻瓜表达式呢,正如之前所说,宏只是进行替换,而非进行计算,所以在没有考虑周全的情况下,很容易出错。下面我们以封装一个比较函数为例,返回大的值。分别用到下面五组示例int a = 7;3 : 4));int a = 7;3 : 4));int a = 7;3 : 4));int a = 7;3 : 4))
2024-03-25 23:01:24
1064
原创 C语言程序与设计——数组
数组就是相同类型数据的集合,且内存中数组是一片连续的储存单元,所以也是支持随机访问的。在C语言中分为静态数组和动态数组,我们常见的定义形式(如下)都是静态数组,下面这一行代码即实现了数组的定义与初始化。可以看到静态数组的大小是固定的,在声明的时候需要声明数组的长度。但是初始化是不必要的,但是建议做初始化操作。在数组声明的位置中决定了数组是存放在堆区还是栈区,函数内部声明则是在栈区,且系统栈的大小Windows系统为2MB, Linux系统为8MB。所以当数组过大时不建议在函数内部中定义。
2024-03-21 10:11:43
756
原创 C语言程序与设计——函数(三)可变参数
在我们使用c语言时写程序时,总会有一种情况就是函数传参的个数不确定,例如printf()函数,这时就需要用到可变参数,还是以printf()函数为例。可以看到传入参数中有两个部分,第一部分时格式控制字符串,另外一部分就是…,省略号就代表可变参数。在实际使用中我们可以感受到,当我们在打印的字符串中使用占位符时,后面会传入很多具体参数。在使用可变参数时需要注意,可变参数的声明应该放在最后。确定可变参数列表位置,是通过可变参数列表前一个参数来确定何处开始是可变参数。
2024-03-17 15:24:23
1164
原创 C语言程序与设计——函数(二)递归练习
可以看到与上一中情况不同的时tail的更新变成了mid - 1,head更新为mid。而且mid也变成了向上取整(若不使用向上取整,当head与tail相邻的时候需要会陷入死循环)
2024-03-10 21:12:23
1125
原创 C语言程序与设计——函数(一)
int x;i * i <= x;i++){if(!return 1;不建议使用这种方式,这是一种已经过时的函数定义风格,但是现在的编译器依然可以编译通过,但是只做了解,极其不建议使用。
2024-03-03 20:37:47
1304
原创 C语言程序设计——程序流程控制方法(二)
while语句分为do-while和while两种,区别在于循环之前是不是先执行一次循环的内容,可以类似于++i和i++的关系,本质上来讲是相同的。当表达式为真时,则会执行一次代码块,然后继续进行循环条件判断,重复此过程,一直到表达式为假,则跳出循环在循环读入的写法有频繁的使用while语句,也可以看出while语句的适用场景,就是适合没有确切循环次数的循环。
2024-01-14 18:35:47
1053
原创 C语言程序设计——程序流程控制方法(一)
在C99之后,C语言开始支持布尔类型,头文件是stdbool.h。在文中我所演示的所有代码均是C99版。在C语言上上述关系运算符中,如果上述关系成立,就为返回值为1,不成立九为,返回值为0。在写代码的时候需要着重注意一下等于的运算符是两个等号,一个等号叫做赋值,这个在编码时候注意。逻辑归一化!!(x)
2024-01-07 14:52:29
1172
原创 C语言程序设计——数学运算
在c语言的数学运算中,所涉及到的符号如图所示,在使用过程中应该了解的就是各个符号在同一条语句中的优先级,以及在现实中很少用到的取余运算符的作用。
2024-01-06 21:52:51
1493
原创 C语言程序设计——输入输出函数(二)
在文中简单介绍了输入输出函数printf和scanf,其中它还有一些家族函数,在这里再浅浅补充一下。如下代码框所示可以看到与我们常使用的函数中只是再前面加了f 或 s,我们在creference上查看也会发现他们的功能是相同的。s代表的是string,所以sprintf()和sscanf()这一组输入输出函数代表的是字符数组的输入输出f代表的是file,所以fprintf()和fscanf()这一组输入输出函数代表的是文件的输入输出。
2024-01-06 17:07:09
1034
原创 C语言程序设计——输入输出函数
工作之后,已经好久没有学习编程、码代码了,因为最开始是从python开始接触的编程,所以对于一些底层的逻辑了解不够清晰,所以打算从0开始学习一下C语言程序。
2024-01-01 21:34:17
1297
空空如也
CSDN的Markdown怎么更新了
2026-05-13
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅