- 博客(38)
- 收藏
- 关注
原创 面经整理(1)
声明 (Declaration): 告诉编译器变量的名称和类型,不分配内存空间。可以使用extern关键字。定义 (Definition): 为变量分配实际的内存空间。一个变量只能被定义一次,但可以被声明多次。
2025-11-02 11:15:45
2473
原创 嵌入式基础-按键检测代码解读
特性说明消抖10ms 延时优先级支持连按mode=1时实现状态保持记住按键状态电平逻辑KEY0/KEY1 低有效,WK_UP 高有效这是一段经典、健壮、实用的按键扫描函数,广泛用于 STM32、51 单片机等裸机开发中。行为说明单击响应(mode=0)按下 → 返回一次值 →即使继续按着也不再返回→ 必须松开再按下才触发第二次连按响应(mode=1)按下 → 持续返回按键值(每调用一次就返回一次)→ 适合“长按加速”、“方向键连发”mode=1。
2025-10-30 11:00:50
1355
原创 嵌入式基础-中断的概念
中断的定义中断(Interrupt)是CPU对系统发生的某个事件做出的一种反应。当外部或内部事件发生时,CPU会暂停当前任务,跳转去处理这个事件,然后再回来继续。比喻:想象你正在刷手机(主程序),突然电话铃响(中断事件),你暂停刷手机,接电话(处理中断),挂断后继续刷(返回主程序)。为什么需要中断?嵌入式系统(如单片机)资源有限,如果用“轮询”(不断检查事件)方式,会浪费CPU时间(低效率)。中断让CPU“被动响应”,提高效率和实时性。
2025-10-30 08:36:28
1183
原创 嵌入式基础-MCU启动过程
类别任务关键代码硬件就绪时钟、看门狗、向量表、堆栈汇编内存映射RO/RW/ZI 正确分布链接脚本 + 复制代码C环境库初始化、FPU、C++构造一句口诀“电钟狗表栈,拷数清零库,主函数起飞!
2025-10-30 08:32:42
1363
原创 嵌入式基础-修改寄存器的位操作方法
/ 清零第 n 组(每组 k 位)&=1<<1<<n:组号(从 0 开始)k:每组位数(1<<k)-1:生成 k 个 1(如 k=2 → 3)操作代码模板说明清零连续 k 位(第 n 组)构造掩码后取反设置连续 k 位为 val需先清零取反第 pos 位异或翻转。
2025-10-28 15:41:08
1238
原创 嵌入式基础-寄存器2
物理硬件│├── 存储器映射 → 给整块内存分配地址 (0x4001 0C00 ~ 0x4001 0FFF)│└── 寄存器映射 → 给“有功能的内存单元”起别名│└── GPIOB->ODR (结构体方式)
2025-10-27 17:05:24
851
原创 嵌入式C语言-P28
代码打印结果:由于指针类型不匹配导致的未定义行为,结果不确定。修正变量名后,它可能会输出浮点数1.2的内存二进制位模式所对应的十六进制数(如3f99999a),但切勿依赖此结果。浮点数存储:遵循 IEEE 754标准,分为符号位、指数位(经过偏移)和尾数位(隐含前导1)三部分。// 使用memcpy安全地复制比特位return 0;int *p;问题答案int *p能存几个地址?只能存一个。怎么存的?
2025-10-25 17:12:33
1035
原创 嵌入式C语言-P27
我们来详细解释一下这段代码和它的运行结果。这段代码是一个简单的C语言程序,演示了指针的基本用法。原因分析:printf函数中的*p1获取的是指针p1指向的内容(即变量a的值0x12345678),而不是指针本身的地址。格式说明符%x会将这个值(0x12345678)以十六进制形式输出,所以你会看到12345678(前面的0x是C语言中表示十六进制的写法,printf的%x输出时会省略掉0x你提供的这段代码清晰地展示了:如何定义一个指针 (int *p1;如何让指针指向一个变量 (
2025-10-25 17:09:08
2268
原创 嵌入式C语言-P26
指针:就是内存地址本身,一个数值。指针变量:是一个专门用来存储内存地址的变量。int *p;p是一个变量,它存储的是一个int类型数据的地址。:获取变量的地址。:通过地址访问地址上的数据。理解指针,就像理解了如何通过门牌号找到房间里的住户并进行交流。这是C语言强大和灵活的关键所在。指针变量的大小:始终是4个字节,因为它们存储的是32位的内存地址。指针变量的类型 (int *char *等):决定了当对指针进行解引用操作(*p)时,应该读取多少个字节的数据;以及当进行指针算术运算(p+1。
2025-10-25 17:04:20
829
原创 嵌入式C语言-P21至25
我们可以把计算机里存储的每一个数据想象成一串由0和1组成的灯泡。比如数字5,在二进制里就是00000101(假设是8位)。位运算,就是直接对这些“灯泡”进行操作,比如打开某个灯泡(置1)、关闭某个灯泡(置0)、或者移动灯泡的位置等等。效率高:直接操作硬件,速度快。节省空间:可以在一个字节里存储8个开关状态,而不是用8个独立的变量。硬件控制:很多硬件寄存器就是通过设置特定的位来控制功能的。好,我们现在就来逐个击破这些符号!
2025-10-25 17:02:20
982
原创 嵌入式C语言-P19、20
将一个十进制数转换为其他进制(如二进制、八进制、十六进制),或者仅仅是获取十进制数的每一位。运算符非常有用,它可以确保索引始终保持在有效范围内,实现“循环”或“环绕”的效果。运算符的作用以及它在取范围内的数、获取M进制位数、循环数据结构下标等场景中的应用。运算符在编程中有着非常广泛的应用,尤其在需要周期性、循环性或位操作的场景中。,从而实现索引的“回卷”,就像一个圆环一样,走到终点又回到了起点。,你希望每次访问完最后一个元素后,下一个访问的又是第一个元素。:生成随机数,或者将一个计数器限制在某个范围内。
2025-10-25 16:58:57
670
原创 嵌入式C语言-P15、16
这是一个很好的问题!你提出了一个非常核心的疑问,也说明你对编程的思考很深入。我们来深入聊聊typedef的作用,以及为什么它不仅仅是“给变量起个好名字”那么简单。所以,typedef并不是简单地给变量起个容易理解的名字。它是在类型层面上进行操作,给数据类型本身起别名。简洁性:减少冗余代码。可读性:让代码更接近自然语言,更易于理解。可移植性:方便在不同平台间迁移。可维护性:集中修改类型定义,减少错误。抽象性:用更具业务含义的名称来表示数据类型。switch()编译器通常通过跳转表来实现。
2025-10-24 09:23:00
796
原创 嵌入式C语言-复习(数据类型、宏定义、typedef、结构体、枚举)
1. 宏定义(#define)宏定义是C语言中一种预处理指令,它允许你用一个标识符(宏名)来代表一个字符串。在程序编译之前,预处理器会将所有出现的宏名替换为对应的字符串。关键字#define用途用字符串代替数字,增强代码可读性:例如,用HIGH代表高电平1,用LOW代表低电平0。提取程序中经常出现的参数,便于快速修改:例如,用GPIO_PORT代表GPIOP0,方便后续修改端口号。定义宏# define 宏名 字符串12345这表示用ABC字符串代替12345这个参数。引用宏。
2025-10-23 09:34:48
986
原创 嵌入式基础-GPIO 的八种工作模式
GPIO 的八种工作模式就像八种不同的工具,每种工具都有其特定的用途。通过合理配置 GPIO 的工作模式,我们可以实现各种各样的功能,让微控制器能够与外部世界进行灵活的交互。在 STM32 中,GPIO 可以配置成八种不同的模式,每种模式都有其特定的电路连接和功能。这些模式决定了 GPIO 引脚如何与外部电路交互,以及如何被微控制器控制。
2025-10-23 09:20:02
533
原创 嵌入式基础-GPIO介绍
让我们一起深入了解 STM32 中 GPIO(通用输入/输出)的基本结构。现在,让我们用一个简单的例子来说明如何使用 GPIO 控制 LED。
2025-10-23 09:19:33
993
原创 嵌入式基础-按键和传感器的硬件电路连接和工作原理
GPIO (PA0) 必须配置为。GPIO (PA0) 可以配置为。GPIO (PA0) 必须配置为。GPIO (PA0) 可以配置为。
2025-10-22 09:39:36
1277
原创 嵌入式基础-GPIO位结构
通过对 STM32 GPIO 位结构的深入分析,我们可以看到,GPIO 并不是一个简单的“开关”,而是一个功能强大的接口,可以灵活地配置为不同的工作模式,以满足各种应用需求。以上电路图非常清晰地展示了 STM32 GPIO 位结构的内部细节。
2025-10-22 07:59:24
812
原创 嵌入式基础-寄存器介绍
寄存器是 GPIO 的核心组成部分,它存储了 GPIO 引脚的配置信息和状态信息。CPU 通过读写寄存器来控制 GPIO 引脚的工作模式和电平,从而实现与外部设备的交互。让我们揭开寄存器的神秘面纱,我们可以把它想象成一个电子积木,虽然看起来简单,但却蕴含着强大的功能。现在,让我们把寄存器和 GPIO 结合起来,看看它们是如何一起工作的。在 GPIO 中,寄存器用于存储和控制 GPIO 引脚的状态。要理解为什么寄存器可以做到这些,我们需要了解一些底层的硬件知识。
2025-10-22 07:57:35
680
原创 嵌入式基础-GPIO寄存器
我们来一起把 STM32 GPIO 的寄存器拆解成一个个小模块,就像组装一个遥控汽车一样,了解每个部件的作用,就能轻松掌握 GPIO 的控制方法。通过了解这些寄存器的作用,我们就可以像控制遥控汽车一样,灵活地控制 STM32 的 GPIO 引脚,实现各种各样的功能。
2025-10-22 07:56:52
844
原创 嵌入式基础-使用库函数点灯
这段代码是使用STM32F10x系列单片机,通过配置GPIO(通用输入输出端口)来点亮LED灯的程序。这段代码就像一个指令流程,告诉单片机如何配置GPIO,然后控制GPIO输出高电平,点亮LED灯。我们来解读一下这段使用库函数点亮LED的代码,尽量用通俗易懂的方式讲解。
2025-10-21 12:39:29
436
原创 嵌入式基础-详解配置GPIO模式
继续上篇文章 配置寄存器实现点灯原理 的想象一下,GPIOC是一个大房间,里面有16个“”,分别叫PC0PC1PC15。你现在是装修师傅,你的任务是把PC13这个插座,改造成一个。
2025-10-21 12:38:32
765
原创 嵌入式基础-配置寄存器实现点灯原理
一个非常经典、非常底层的STM32入门实践:直接操作寄存器来点亮一个LED灯。这种方式能让你最直观地理解单片机的工作原理,明白我们写的代码是如何具体控制到硬件的每一个细节的。我们可以把这个过程想象成**“给一个房间(PC13)装一盏灯并控制它的开关”**。操作:为什么需要这一步?寄存器是如何操作的?寄存器:你可以把它想象成一个有32个开关的配电箱,每个开关(或者叫“位”,bit)控制一个外设的电源。我们查阅《STM32参考手册》,找到寄存器的位定义图:从图上可以看到,第4位(bit 4,从右往左,从0开始数
2025-10-21 12:38:05
1107
原创 嵌入式基础-STM32系统结构
这张图是STM32的“城市规划图”,它展示了芯片内部各个功能模块是如何连接和协同工作的。初看会觉得很复杂,全是方框和箭头,但别怕,我们把它想象成一个城市的交通系统,就很容易理解了。通过这张图,我们可以清晰地看到STM32是一个高度集成和协同工作的系统。Cortex-M3这个“大脑”非常聪明,它有多条不同的“公路”连接到城市的各个地方,可以同时、高效地处理不同的事情。这是这张图最核心、最复杂的部分。来使能各个外设的时钟——因为不给“公共服务设施”供电(提供时钟),它们是无法工作的。
2025-10-21 12:34:46
1236
原创 嵌入式基础-STM32外设介绍
学习STM32,其实就是学习如何配置和使用这些功能各异的“部门”(外设),让它们协同工作,最终实现你想要的功能。
2025-10-21 12:33:25
1415
原创 嵌入式C语言-P13
你可以把它想象成一个“自定义的包裹”或“超级变量”。普通变量:只能存储一个单一类型的数据,比如一个int变量存整数,一个char变量存字符。结构体变量:可以将多个不同类型的数据打包在一起,形成一个逻辑上的整体。这个“包裹”里的每一个数据称为结构的成员。作用:创建一种新的数据类型,而不是创建一个变量。详解struct是C语言的关键字,告诉编译器“我要开始定义一个结构体了”。myabc是这个新类型的名字,它被称为“结构标签”。它和。
2025-10-20 09:53:14
1168
原创 嵌入式C语言-P14
枚举是一种用户自定义的数据类型,用于定义一组命名的整数常量。它的主要目的是提高代码的可读性和可维护性,用有意义的符号名称代替“魔法数字”。定义枚举的基本语法:enum 枚举标签 {枚举常量1 [= 初始值1],枚举常量2 [= 初始值2],...枚举常量N [= 初始值N]enum: 关键字,表示开始定义一个枚举类型。枚举标签: 你为这个新枚举类型起的名字(例如abcWeekdayColor它和struct标签类似,用于后续声明该类型的变量。{ }:。
2025-10-20 09:53:01
858
原创 嵌入式C语言-P12
原码: 直观(符号位+绝对值),但有 ±0 问题,运算不便。反码: 原码取反(符号位不变),仍有 ±0 问题,运算进位处理稍麻烦。补码: 反码加 1(符号位不变),现代计算机标准。解决了 ±0 问题,统一了加减法运算,硬件实现高效。理解补码的关键在于理解“模”的概念(2^n记住:在计算机中存储和运算整数(特别是进行加减法)时,使用的是补码表示。现在我们想在8位系统里表示负数。我们的目标是:让减法运算可以用加法器来实现。即A - BA + (-B)。
2025-10-20 09:52:45
786
原创 嵌入式C语言-P11
特性C语言Java语言设计哲学贴近硬件,高性能,灵活适应平台无关,一次编译到处运行,行为一致性int大小平台相关,由编译器和CPU架构决定(通常16/32/64位)永远32位char大小至少8位,通常8位(1字节)永远16位(2字节),用于Unicode字符实现方式直接编译成机器码,与硬件紧密相关运行在JVM上,JVM屏蔽了底层硬件差异所以,int和char在C语言和Java中表现不一致的原因,根本上是两种语言在设计目标和实现方式上的差异。C语言为了最大化性能和对硬件的控制,选择了灵活性;
2025-10-20 09:44:39
824
原创 嵌入式基础-串口引脚定义、配置
STM32芯片通常提供多个串口(如USART1、USART2、USART3、UART4、UART5等),每个串口至少包含两个关键引脚:TX(发送引脚):用于数据输出,需连接至外部设备的RX引脚。RX(接收引脚):用于数据输入,需连接至外部设备的TX引脚。以STM32F103系列(大容量型号)为例,其串口引脚分配如下:注意:部分引脚支持重映射功能(如USART1的TX可重映射至PB6,RX至PB7),需参考芯片数据手册配置。
2025-10-20 09:06:30
1408
原创 嵌入式基础-串口相关概念
串口是一种采用串行通信方式的物理接口。它的核心思想是“一个一个来”。并行 vs 串行:并行:好比一条8车道的公路,8辆车(8个比特的数据)可以同时通过。速度快,但需要很多线(数据线多),成本高,抗干扰差,适合短距离。串行:好比一条单车道,8辆车必须排成一队,一辆接一辆地通过。速度相对慢,但只需要很少的线(通常2-3根),成本低,抗干扰好,适合长距离通信。
2025-10-19 19:32:11
1295
原创 嵌入式基础-电源电路
在绘制电路板(PCB)时,这些区别会直接体现在布局和布线中:分区隔离:会将模拟部分(连接到VDDA/VSSA的元件)和数字部分在物理上分开布局。单点接地VSS(数字地)和VSSA(模拟地)通常会在某一点(如电源入口处)连接在一起,而不是随意混杂,以防止数字噪声污染模拟地。独立布线VDDA和VDD的电源线会分开走线,最后再连接到电源芯片。简单来说,理解这些电源引脚的区别,是进行稳定、高性能嵌入式系统硬件设计的基础。
2025-10-19 19:26:54
576
原创 嵌入式基础-执行过去和执行出去的区别
特性执行过去 (Step Over)执行出去 (Step Out)操作位置在函数调用语句上 (如在某个函数内部 (如停在里)主要作用跳过被调用的函数,将其视为一个整体步骤跳出当前正在执行的函数,回到调用它的地方关注点不关心被调用函数内部细节,只想继续主流程不想再一步步执行当前函数的剩余部分,想快速返回执行范围执行调用语句本身(即执行整个被调用函数)执行当前函数内剩余的所有代码暂停位置。
2025-10-19 17:07:27
914
C语言-力扣题目解析-基础.pdf
2025-10-22
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅