自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 DMA直接存储器存储

这段代码的问题很典型:CPU 全程阻塞。转换期间 CPU 除了等什么都干不了,主循环被拖死。切换通道有代价。刚切完通道就读,容易读到上一个通道的残影。实时性差。如果此时来了一个中断或要处理通信,只能排队。DMA 的本质:在总线矩阵上挂一个独立的硬件搬运引擎,它和 CPU 平级,都能访问总线和存储器。配置好源地址、目的地址、搬运数量后,它自动一趟一趟地搬,搬完举手(置标志位或发中断)通知 CPU。

2026-09-26 10:48:36 355

原创 ADC模数转换器

ADC(Analog-to-Digital Converter,模数转换器)的工作可以拆成三步:连续变化的电压 ──► 采样(Snapshot)──► 量化(打格子)──► 编码(输出数字)采样:在某个瞬间"拍一张照片",把电压值固定住。量化:把 0~Vref 的电压范围切成 2ⁿ 个格子(n 为分辨率)。STM32 主流是 12 位,即切成 4096 格。编码:告诉 CPU 这个电压落在第几个格子里。

2026-09-26 10:33:43 181

原创 STM32定时器(TIM)全解:定时中断 / 输出比较 / 输入捕获 / 编码器接口

总结一句话:定时器的本质就是一个"可编程的计数器"。定时中断用它来计时,输出比较用它来产生波形,输入捕获用它来测量波形,编码器接口用它来追踪旋转。四种模式只是同一个硬件的不同"玩法",掌握了 CNT、PSC、ARR、CCR 这四个寄存器的关系,就掌握了整个定时器。

2026-09-17 10:46:18 297

原创 EXTI外部中断

1. 开启GPIO时钟,配置引脚为输入模式2. 开启AFIO时钟(复用功能时钟,EXTI需要用到)3. 将GPIO引脚连接到EXTI中断线4. 配置EXTI触发方式(上升沿/下降沿/双边沿)5. 配置NVIC优先级,使能中断通道6. 编写中断服务函数,清除中断标志位。

2026-09-16 15:13:05 164

原创 GPIO的输入与输出

你可以把GPIO理解成单片机的“手指”:想控制外面的设备(比如点亮LED、让蜂鸣器响)就通过它输出信号,想知道外面的状态(比如有没有按按键、传感器有没有触发)就通过它读取信号,是嵌入式开发最基础也最常用的功能。我们使用的STM32F103C8T6芯片共有4组16个GPIO引脚(PA0~PA15、PB0~PB15等),每个引脚的电平只有两种状态:高电平(1):3.3V低电平(0):0V。

2026-09-16 14:59:16 172

原创 Framebuffer应用编程

在Linux世界里,一切皆文件。如果你想在Linux系统(尤其是嵌入式设备)上直接控制LCD屏幕,画个线条、显示个图片,该怎么做?答案就是——。简单来说,Framebuffer就是内核在内存中划出的一块“画板”。你不需要去管底层复杂的硬件时序,只需要往这块内存里写颜色数据,LCD控制器就会自动把数据搬到屏幕上显示出来。

2026-07-30 22:49:12 187

原创 Linux串口应用编程——GPS

想象一下,你的电脑要通过一根线和一个陌生的硬件(GPS模块)对话,它们必须先约定好“暗号”,比如说话的语速(波特率)、数据的格式等等。我们今天实现读取 GPS 模块的数据。我将其分成了四个部分来讲解,组合起来就是整个程序。

2026-07-28 23:49:46 277

原创 文件IO的介绍

和。两者的区别和使用场景各有不同,我们分别来看。

2026-07-26 23:39:10 214

原创 Makefile

使用keil, mdk,avr等工具开发程序时点击鼠标就可以编译了,它的内部机制是什么?它怎么组织管理程 序?怎么决定编译哪一个文件?答:实际上windows工具管理程序的内部机制,也是Makefile,我们在linux下来开发裸板程序的时候, 使用Makefile组织管理这些程序,本节我们来讲解Makefile最基本的规则。Makefile要做什么事情呢?组织管理程序,组织管理文件.makefie最基本的语法是规则,规则:当“依赖”比“目标”新,执行它们下面的命令。

2026-07-14 08:00:00 181

原创 Linux目录,文件夹及文件相关命令

1.命令(command):表⽰要执⾏的具体命令或程序。命令可以是系统⾃带的内置命令,也可以是可执⾏ 程序或脚本⽂件。2.选项(options):表⽰对命令的配置或修改。选项通常以短格式(单个字⺟前缀,如 (完整的单词前缀,如 -a )或⻓格式--all )提供。选项可以⽤来控制命令的⾏为、修改默认设置或提供额外的功 能。3.参数(arguments):⽤于命令的输⼊或操作对象。参数是命令的操作数,可以是⽂件、⽬录、⽂本、数 字等。命令的参数通常紧跟在选项之后。

2026-07-13 09:43:37 236

原创 自定义类型:结构体

结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。结构体就像我们定义一个变量使用int,char,一样的作用。

2026-01-14 20:01:21 79

原创 数据在内存中的存储

其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分 为⼤端字节序存储和⼩端字节序存储,下⾯是具体的概念:⼤端(存储)模式: 是 指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存在内存的低地址处。⼩端(存储)模式: 是 指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存在内存的⾼地址处。上述概念需要记住,⽅便分辨⼤⼩端。

2026-01-13 18:03:55 585

原创 C语言内存函数

• 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。• 如果source和destination有任何的重叠,复制的结果都是未定义的。• 这个函数在遇到 '\0' 的时候并不会停下来。

2025-12-24 23:06:20 119

原创 字符函数和字符串函数

C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h这些函数的使⽤⽅法⾮常类似,我们就讲解⼀个函数的事情,其他的⾮常类似:islower 是能够判断参数部分的 c 是否是⼩写字⺟的。通过返回值来说明是否是⼩写字⺟,如果是⼩写字⺟就返回⾮0的整数,如果不是⼩写字⺟,则返回 0。据此我们做个练习。

2025-12-23 23:26:59 199

原创 深入理解指针2

之前我们学习了指针数组,指针数组是⼀种数组,数组中存放的是地址(指针)。数组指针变量是指针变量?还是数组?答案是:指针变量。我们已经熟悉:• 整形指针变量: int * pint;存放的是整形变量的地址,能够指向整形数据的指针。• 浮点型指针变量: float * pf;存放浮点型变量的地址,能够指向浮点型数据的指针。那数组指针变量应该是:存放的应该是数组的地址,能够指向数组的指针变量。

2025-12-12 23:14:21 416 1

原创 深入理解指针1

如果你想要去一个学校找你的朋友,他会告诉你他在哪个宿舍,告诉你宿舍的门牌号,这样,你就可以快速找到你的朋友。计算机中同样如此,一个内存单元就是一字节,一字节有8个比特位,就像是一个宿舍里住八个人。那这个宿舍的门牌号,我们就叫做,也称为。

2025-11-22 22:00:37 439

原创 操作符详解

2. 算术右移:左边⽤原该值的符号位填充,右边丢弃。二:其余由于我在写代码的时候都加上了注释就不多做文字解释了,看图。右移:1. 逻辑右移:左边⽤0填充,右边丢弃。一:左移操作符与右移操作符。左移:左边抛弃、右边补0。

2025-11-16 20:46:36 459

原创 函数的递归

接下来的内容文字描述太过繁琐,我主要通过图片向大家展示,大家只需要慢慢来理解,一条一条捋顺,也可以大事化小这个思想,主要记住一个思想----代入下一个值后再拆分。通过上述两个例子,我们不难发现递归的好处,但是要记住,递归是非常占内存的,大量的数据处理会导致栈溢出,比如第一个代码就不建议使用递归,接下来我们用一个例子来展示。函数的递归,其实是一种思想,简单说就是函数调用自己,递就是递推,归就是回归,而递归,就是把一个大的问题细化为多个小问题,即大事化小。• 每次递归调⽤之后越来越接近这个限制条件。

2025-11-13 11:30:54 451

原创 static 和extern的意义与使用

其实 static 修饰函数和 static 修饰全局变量是⼀模⼀样的,⼀个函数在整个⼯程都可以使⽤, 被static修饰后,只能在本⽂件内部使⽤,其他⽂件⽆法正常的链接使⽤了。但是全局变量被 static 修饰之后,外部链接属性就变成了内部链接属性,只能在⾃⼰所在的源 ⽂件内部使⽤了,其他源⽂件,即使声明了,也是⽆法正常使⽤的。如下图,图一中每次i进入test函数,都会重新创建变量i=0,然后i++打印出来,i的生命周期就在test函数中,所以每次打印都为1.对于全局变量来说:它的生命周期就是整个程序。

2025-11-13 10:59:08 608

原创 函数与数组结合--扫雷游戏

由于9*9的二维数组设计会导致边界难以正确算出检测点附近雷的数量,故用11*11帮助,相较于9*9多余部分不计。test.c----游戏的测试。game.c函数的实现。saolei.h声明。

2025-11-06 23:36:09 486

原创 自定义函数的创建与使用

在使用函数解决问题的时候,难免会使用到数组作为参数传递给函数,在函数内部对数组进行操作,我们来做一个练习:写⼀个函数将⼀个整型数组的内容,全部置为-1,再写⼀个函数打印数组的内容。如图,我们创建了函数“set_arr”,运用for循环在函数中把数组arr的元素全部便为-1,值得注意的是,实参我们要使用的是arr,形参我们要使用的是arr[10],打印同理,不过在使用set_arr之前和之后,我们分别使用了两次函数printf_arr,所以第一次打印的是一到十,第二次打印是-1.二:自定义函数的语法形式。

2025-11-03 23:37:23 450

原创 一维数组与二维数组

那么不是每个数组都很好数,我们如何快速知道数组中元素的个数呢,其实就是简单的除法运算,我们知道一个数组是由多个元素组成,每个元素由我们定义的类型而占该类型的内存大小,所有元素内存之和就是数组的内存,我们用总内存除以单个元素的所占的内存便可以计算出元素个数,如图,int类型的大小是4,所以arr数组有10个int类型元素,它的内存大小是40,我们再随便除以一个元素,40/4,计算出个数为10,单位是字节。记住这个概念结合代码辅助理解。#####数组的类型,数组的类型很好记,去掉数组名就是数组的类型,如图。

2025-10-27 23:31:27 545 1

原创 猜数字小游戏

接下来我们就要写游戏内容了,首先我们要创造1-100的数字,使用int r = rand() % 100 + 1;,因为模100是0到99,所以+1之后就是1-100,接下来就是很简单的循环,直接上代码。首先我们要制作游戏菜单,很容易,打印就行,再用scanf函数让玩家选择,明显do whle循环更适合。写这个游戏之前,我们需要先知道需要什么。1:需要能自动生成1-100的随机数。2:玩家猜对了游戏结束。

2025-10-20 21:16:47 356

原创 分支于循环2

这个比较好理解就不多解释,但如果我们想要实现输入1234打印出4321,输入7865打印出5687该如何做呢,我们知道,如果一个数对10取余,其得到的一定是个位所在的数,那么我们便可以由此得到第一位数,又因为在C语言中使用除法可以取整,那么我们就可以再得到去了“余数”后的数,代码实现如图。在C语言中break是用于终止循环的,使用其可以跳出循环,执行循环以外的语句,而continue是跳出其在循环中后面的代码,进行下次一次循环,如果我们想要打印“1234 678910”便可以使用continue。

2025-10-20 20:59:36 461

原创 分支和循环1

当使用&&时,因为需要满足两个条件,所以如果左边为0,则不计算右边的,整个式子为0,当使用||,因为只用满足其中一个条件,如果所以两个不成立才为0,一个不成立仍返回1,大家实践几个就熟悉了。当然,如果只有if我们可能感觉会缺点什么,于是我们加上else,if如果不满足,将会执行else后的语句,值得注意的是,if和else后我们只能跟一条语句,如果想使用多条,我们可以加上{}嵌套,如图。还有一个小点,我们使用这些运算符的时候写出一些式子,如果式子成立,打印出来的整型就是1,不成立就是0。

2025-10-12 00:05:33 354

原创 数据类型和变量2

一:1.我们来介绍一下最基本的printf函数和占位符的应用,在C语言中如果我们在"%d"的d前面加上数字那么就会“打印出多少位”,但值得注意的是,打印的是最小宽度,意思就是我们打印四位数,他会打印五位,其中一位是空格,我们打印六位,他就会照常打印六位,如图。3.我们知道,如果想要保留几位小数,我们只需要在“%.xf”中把x换成需要保留的几位小数的数字即可,但是假如我们想要实现既保留小数由限制宽度,依然很简单,我们写成"%y.xf",其中y是宽度,x是保留位数。如图并且提供一个进阶。

2025-09-27 23:04:28 384

原创 数据类型和变量1

一:c语言中short为短整型,int为整型,long为长整型,long long为更长的整型,依次递增,它们能包含的整型大小更大。二:布尔类型,c语言中0为假,非0为真,我们也可用_Bool来表示,其既可以表示为真也可以表示为假,由我们自己来定义。三:如果我们想要计算一个数据类型的长度,可以用到sizeof操作符,其操作数可以是类型也可以是表达式和变量,下面我们来计算一些,注意使用"%zd"其计算的单位为字节,换算如图注意,C预言标准规定sizeof(long)>=sizeof(int)。接下来我们看一个

2025-09-24 21:40:25 553

原创 字符串与多个字符长度的差异

但arr2由多个单字符组成,如果不人为加上\0,求其长度时编译器会一直向后检索直到检索出\0才停止,故其长度是不可定的,可能出现33或者其他长度,但只要人为加上\0,其长度就为6。C语言中,如图arr1为字符串,末尾自有\0,求长度即求\0之前字符的长度,故arr1的长度为6。

2025-09-22 18:10:52 424

空空如也

空空如也

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

TA关注的人

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