自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 面经整理(2)

static。

2025-11-07 11:13:11 754

原创 面经整理(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

原创 proteus仿真STM32过程

使用 Proteus 和 CubeMX 仿真 STM32 单片机(LED 闪烁)**

2025-10-27 15:02:43 2956

原创 嵌入式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语言-P17、18

register。

2025-10-24 09:50:12 736

原创 嵌入式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

原创 嵌入式基础-使用库函数点灯2

下面主要讲解如何使用STM32的GPIO库函数来点亮LED,并实现LED闪烁和流水灯效果。

2025-10-22 07:58:42 869

原创 嵌入式基础-寄存器介绍

寄存器是 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

原创 嵌入式基础-最小系统引脚含义

如何理解常见引脚含义?

2025-10-19 19:21:51 1122

原创 嵌入式基础-最小系统概述

​核心概念:最小系统​。

2025-10-19 19:12:56 940

原创 嵌入式基础-执行过去和执行出去的区别

特性执行过去 (Step Over)执行出去 (Step Out)​​操作位置​​​​在函数调用语句上​​ (如​​在某个函数内部​​ (如停在里)​​主要作用​​​​跳过​​被调用的函数,将其视为一个整体步骤​​跳出​​当前正在执行的函数,回到调用它的地方​​关注点​​不关心被调用函数内部细节,只想继续主流程不想再一步步执行当前函数的剩余部分,想快速返回​​执行范围​​执行调用语句本身(即执行整个被调用函数)执行当前函数内​​剩余的所有代码​​​​暂停位置​​。

2025-10-19 17:07:27 914

C语言-力扣题目解析-基础.pdf

内容概要:本文档围绕C语言在力扣平台上的基础题目展开,涵盖字符串操作、数组处理、数学逻辑、模拟算法等多个方面。通过对一系列经典题目的详细解析,文章系统地介绍了问题分析、解题思路、代码实现及错误纠正的全过程。核心内容包括字符串合并、查找、判断异位词、罗马数字转换、数组元素移动、单调性判断、机器人路径模拟、矩阵操作等,强调了C语言中字符串处理、循环控制、条件判断、内存管理(malloc/free)、指针操作和算法优化(如避免整数溢出、使用双指针)等关键技术要点。 适合人群:具备C语言基础语法知识,熟悉字符串、数组、指针和函数等基本概念的学习者,特别是刚接触算法题目的初级开发者或在校学生。 使用场景及目标:① 学习如何将实际问题(如合并字符串、判断字母异位词)转化为C语言代码;② 掌握解决力扣平台上基础算法题的通用思路,如暴力匹配、计数法、双指针、模拟法等;③ 理解并实践C语言特有的内存管理和指针操作,避免常见错误(如内存泄漏、数组越界)。 阅读建议:建议读者跟随文档的讲解,亲手编写并调试每一个示例代码。在理解官方解法后,尝试独立完成题目,并对比自己的解法与文档中的解法,分析差异。特别要注意文档中反复强调的‘错误纠正’部分,通过分析错误来深化对C语言特性和算法逻辑的理解。

2025-10-22

空空如也

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

TA关注的人

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