嵌入式系统原理
第一章 导论
嵌入式系统是一切非PC和大型计算机系统。
第二章 Cortex-M3 微处理器
1. 内核结构
- 核心架构:Cortex-M3 是基于 ARMv7-M 架构的 32 位处理器内核,采用高性能的哈佛结构,寻址能力为4GB。

- 设计模式:ARM 公司设计内核,芯片制造商(如 ATMEL、NXP、TI)在此基础上添加不同的外设、存储器和 I/O,形成各类微控制器 (MCU)。
2. 流水线技术
- 定义:将指令分解为多步并重叠执行,以实现并行处理。

- 流水线技术三大指标:吞吐率、加速比、效率
(1)吞吐率
- 单位时间内完成的指令条数

- $流水时间 = 三个阶段总时间 + (指令条数 -1)\times 时间最长的阶段$
例题:
(2)加速比
- 不使用流水线时间和使用流水线时间之比
若流水线各段时间均为 $\Delta t$,流水线级数 $m$,指令数为 $n$:
分子:$nm\Delta t$
分母:$m\Delta t + (n-1)\Delta t$ (流水线计算公式)
则加速比为:
注意:平衡的流水线效率更优
3. 系统总线
- 总线:计算机中,各个部件之间传送信息的公共通路
- 分类:数据总线、地址总线、控制总线
AMBA
- AMBA 是一种高级微控制器总线架构
主要包含以下两种不同的标准:
- AHB(Advanced High-performance Bus):高级高性能总线
- 多个主机和多个从机的连接

- AHB-lite:单个主机和多个从机
- 多个主机和多个从机的连接
- APB(Advanced Peripheral Bus):高级外设总线
- 低成本、低功耗、结构简单

- 低成本、低功耗、结构简单
Cortex-M3 总线结构

4. 寄存器与储存结构

- 堆栈:先进后出,由一块连续内存、一个栈顶指针组成
- 储存结构:Crtex-M3与外设统一编址,这种方式称为储存器地址映射
5. 工作模态
(1)两种模式与特权等级

(2)三种模态

6. 中断与异常
(1)中断悬起
- 如果中断发生时,正在处理更高优先级异常/中断被屏蔽,此时中断被悬起

(2)中断活跃

(3)中断请求信号保持

7. 调试与跟踪
- 基于CoreSight架构实现以下两种模式

- 调试访问端口:DAP
- 调试接口:DP(一端连接 DAP,一端连接到调试器)
- 跟踪接口:CoreSight 架构还可以用于数据跟踪
8. Cortex-M3 实用功能
(1)SysTick 定时器
SysTick 是集成在内核中的 24 位系统节拍定时器,对实时操作系统(RTOS)至关重要
- 基本机制:它是一个 24 位的倒计数定时器,当计数减到 0 时,会自动从 RELOAD 寄存器中重装定时初值
- 运行状态:只要不清除 SysTick 控制及状态寄存器中的使能位,定时器就会持续运行
- 核心寄存器:
- CTRL (0xE000E010):控制和状态寄存器,用于设置时钟源、使能中断及查询计数标志
- RELOAD (0xE000E014):重装载值寄存器,存储定时器溢出后自动加载的初值
- CURRENT (0xE000E018):当前值寄存器,反映当前的计数值
- CALIB (0xE000E01C):校准值寄存器,提供硬件参考时钟信息
- 主要用途:常用于产生操作系统所需的“滴答”中断,或作为基本的定时/计数工具
(2)电源管理
Cortex-M3 在内核级别提供了功耗优化方案,支持两种主要的睡眠模式
- 睡眠模式 (Sleep):由内核的
SLEEPING信号指示 - 深度睡眠模式 (Deep Sleep):由内核的
SLEEPDEEP信号指示,用于更大幅度降低功耗 - 唤醒机制:在睡眠状态下,系统时钟可以停止,但通常保持 FCLK 运行,以确保处理器能被 SysTick 异常或外部中断唤醒
- 状态判定:开发者可以通过读取 NVIC(嵌套向量中断控制器)的相关系统控制寄存器来判定当前的睡眠模式及上下文
(3)复位序列
复位是处理器通电或重启后的起始动作,Cortex-M3 有一套固定的操作流程来定栈和定位代码入口
- 读取 MSP:处理器首先从地址
0x00000000处读取 32 位整数,作为 主堆栈指针 (MSP) 的初始值,从而完成“定栈” - 读取 PC:随后从地址
0x00000004处读取 32 位整数,作为 程序计数器 (PC) 的初始值,即复位向量,决定代码执行的入口地址 - 堆栈模型:在 Cortex-M3 中,堆栈是向下生长的(即从高地址向低地址方向压栈)
- 内存布局示例:例如复位向量指向地址
0x00000101,则处理器将从该处的启动引导代码开始运行
第三章 STM32 最小系统及开发环境
1. 系统组成
(2)电源电路

- 常用 AMS1117 稳压芯片将 5V 电压降至 3.3V 供 VDD 使用。
- STM32 内部的电压调节器将外部 3.3V 的电压转化为 1.8V 提供给 Cortex-M3、内存以及外设使用。
- C1、C2 是输入电容,防止断电后电压倒置。
- C3、C4 是输出滤波电容,抑制自激振章 & 稳定输出电压。
(3)时钟电路
- 时钟频率越高,单片机运行速度越快,功耗越大。

- 高速外部时钟 (HSE):通常外接 8MHz 晶振,通过 PLL 倍频最高可达 72MHz 作为系统主时钟。
- 低速外部时钟 (LSE):外接 32.768kHz 晶振,主要用于 RTC模块(实时时钟) 精准计时。
(4)复位电路
- 低电平复位
- 引脚:
NRST - 依靠 RC 电路产生的 ~1ms 延迟。
- 上电瞬间电容两端电压不能突变,Reset 出现短暂低电平。之后芯片复位,进入充电时间:
$t=1.1R\times C$(电阻、电容)
- 引脚:
- 手动按键复位
- 按键按下时,Reset 短暂接地,产生低电平
(5)调试和下载电路
调试接口:JTAG(5引脚)、SWD(2引脚,更常用)
Cortex-M3 的三种启动方式,主要依靠不同电平组合:
| BOOT0 | BOOT1 | 启动模式 | 说明 |
|---|---|---|---|
| 0 | 任意 | 用户闪存 (Flash) | 最常用的正常运行模式,又叫只读储存器(从 0x08000000 启动) |
| 1 | 0 | 系统存储器 | 用于串口下载程序(ISP) |
| 1 | 1 | 内置 SRAM | 用于在内存中调试代码 |
2. 开发环境 & 基础配置
HAL库开发: STM32CubeMX+Keil 5

- 下载工具:
J-Link:通用型,支持多种内核及 IDE 。
ST-Link:ST 公司专用于 STM8/STM32,支持全速运行和单步调试 。
第四章 嵌入式C语言
C语言的优势:汇编语言操作底层、功能性强
外设功能模块化设计:包含一个源文件(.c文件)和一个头文件(.h文件)

1. 数据类型 & 运算符
(1)数据类型
- STM32 是32位处理器,与一般64位电脑不同。

| 数据类型 | 字节数 |
|---|---|
| char | 1 |
| short | 2 |
| int/long/float/指针 | 4 |
| double | 8 |
- 1字节 = 8 bit

(2)运算符

- 三大战术 (背下来):
- 置1 (Set):用 |。 例如 Reg |= (1 << 3); (第3位置1)
- 清0 (Clear):用 & ~。 例如 Reg &= ~(1 << 3); (第3位清0)
- 翻转 (Toggle):用 ^。 例如 Reg ^= (1 << 3); (第3位翻转)
注意:“异或”是不同取1,相同取0。

2. 四大核心修饰符
(1)const(只读)
- 作用:定义只读变量,保证其值在编译时不能改变。
- 目的:防止变量的值被误改。
- 要求:const关键词修饰的变量在声明时必须初始化。
- 属性:变量是全局定义的,
储存在Flash(只读储存器)。 - 格式:` const uint32_t(此处为初始化) a = 0xffff1111;
(2)static(静态)
修饰局部变量:修饰后的变量称为静态变量,存储在静态区,函数结束后不销毁,下次调用保留上次的值。
修饰全局变量/函数:限制作用域,只在当前.c文件中可见(私有化),其它源文件不能引用,避免了相同变量名而引发的错误。
(3)volatile(易变)
- 作用:每次读取或者修改变量值的时候,必须从内存中重新读取,而不是使用保存在寄存器里的备份。


三个应用场景要背下来:
- 多任务共享的变量
- 硬件寄存器映射地址
- 中断程序修改的主程序变量
(4)extern(外部)
注意:extern是一个重新声明,而不是定义。
- 含义:声明变量/函数是在别的文件定义的。例如:main.c要调用led.c里的变量,必须在main.c里用extern声明。
3. struct结构体

第五章 GPIO
- GPIO :General-Purpose Input/Output,即通用输入/输出模块。
- 实现与外部设备的数字信号交互,可以通过软件配置输入/输出模式。
1. GPIO 内部结构
2. 四种输入模式
(1)上拉输入(Pull-up)
- 内部接一个上拉电阻到VDD。外部悬空(I/O引脚无信号)时,默认输入高电平。
(2)下拉输入(Pull-down)
- 接一个下拉电阻。外部悬空时,默认输入低电平。
- 应用:接按键(按键另一端接地)
(3)浮空输入(Floating)
- 浮空输入模式下引脚内部既不接上拉电阻也不连接下拉电阻(但是不关闭施密特触发器),直接经施密特触发器输入I/O引脚的信号。
- 即:电平完全由外部电路决定,如果外部悬空,读到电平会乱跳。
- 应用:通信协议的接收端(如UART_RX),或者按键检测(外部有电阻时)
(4)模拟输入(Analog)
- 模拟输入模式下,施密特触发器关闭,既不接上拉电阻也不连接下拉电阻,引脚信号连接到芯片内部的片上外设,其典型应用是A/D模拟输入,对外部信号进行采集。
- 应用:ADC采集电压(生物传感器那道大题就用这个!)
3. 四种输出模式
(1)推挽输出(PP)
- 两个MOS管按互补对称的方式连接。
- 目的:增大输出电流,输出能力强;提高电路负载能力和开关速度
- 高电平3.3V,低电平0V。
- 应用:点亮LED,驱动蜂鸣器
(2)开漏输出(OD)
- 只有下拉MOS管,没有上拉MOS管。
- 不与电源连接,处于悬空状态,只能输出低电平。
- 目的:减少芯片内部驱动。
- 特点:想输出高电平,只能外接上拉电阻。
- 重点:方便实现“逻辑与”功能。
I2C总线(必考关联点) - 应用:I2C总线 (必考关联点)
(3)复用推挽输出(AF_PP)
- GPIO引脚除了作为通用IO引脚外,还可作为片上外设的I/O引脚,即一个引脚可以作为多个外设引脚使用,称为复用I/O端口 AFIO。
- 一个引脚某一时刻只能使用复用功能中的一个。
(4)复用开漏输出(AF_OD)
同上。
第六章 中断和异常
本质:改变处理器执行指令的顺序。
- 区别:
- 中断:响应外部事件
- 异常:内部程序错误
目的:
- 提高cpu效率
- 实时处理
- 异常处理
- 数据传输
- 不占用cpu资源
1. 中断处理流程


Cortex-M3 内嵌中断控制器——NVIC

(1)中断优先级

- 抢占优先级 > 响应优先级
- 数值越小,优先级别越高
- Reset,NMI(不可屏蔽中断 ) , Hard Fault 的优先级为负,且不可修改,高于普通的中断优先级
中断优先级判断:
- 先判断抢占优先级的大小
- 如果抢占优先级相同,则比较响应优先级的大小
- 若抢占优先级和响应优先级均相同,则根据中断向量表中的顺序来决定

(2)外部中断EXTI


- 映射关系:STM32的引脚很多,但中断线只有 16+N 条。
规则:所有 Pin x (序号相同)共用一条中断线 EXTI x- PA0, PB0, PC0 … -> EXTI0
- PA5, PB5, PC5 … -> EXTI5
考点:不能同时开启 PA0 和 PB0 的中断!因为它们都要抢 EXTI0 这条线(同时只能选一个引脚)。
- 触发方式
- 上升沿触发:电平 0 -> 1 瞬间触发(如按键松开)。
- 下降沿触发:电平 1 -> 0 瞬间触发(如按键按下)。
- 双边沿触发:变高变低都触发。
第七章 定时器
| 定时器主要功能 |
|---|
| 定时:时钟脉冲计数 |
| 计数:固定周期的脉冲信号 |
| 输入捕获:对脉冲信号宽度测量 |
| 输出比较:控制输出波形 |
第一部分:STM32定时器模块

注意分辨不同定时器的功能、引脚
基本定时器 (TIM6, TIM7)
- 能力:只能用来定时(数数),没有 GPIO 引脚,不能 产生 PWM。
- 就像个纯粹的闹钟。
通用定时器 (TIM2 ~ TIM5)
- 能力:定时 + 输入捕获 (测脉宽) + 输出比较 (PWM)。
- 这是最常用的主力。
高级定时器 (TIM1, TIM8)
- 能力:通用功能 + 死区控制 (Dead-time) + 互补输出。
- 这是给电机控制专用的。
1. 定时时间计算
核心公式:
- 注意:PSC 和 ARR 的输入范围为(1,65536),因为最高16位。
例题:
2. PWM 相关分析题




- 只要 CNT>CCR ,就输出高电平。
- ARR 是阈值,达到后重新计数。
- ARR 决定PWM的周期,CCR 决定占空比。
第二部分:SysTick定时器
1. 基础属性 (填空/判断题核心)
- 归属:属于 Cortex-M3 内核 (Core),不属于 片上外设 (Peripheral)。
- 位数:24位 (注意:通用定时器通常是 16 位)。
- 计数方式:向下计数 (Down-counter),从设定值 (LOAD) 减到 0。
2. 核心用途 (考干什么)
- 操作系统心跳:为 RTOS (如 FreeRTOS, uCOS) 提供任务调度的基准时钟。
- 精准延时:HAL_Delay() 函数就是基于 SysTick 实现的。
- 注:如果不开启 SysTick 中断,HAL_Delay 函数将无法工作。
3. 关键寄存器 (眼熟即可)
- CTRL (Control):控制寄存器,用于使能定时器、开启中断。
- LOAD (Reload):重装载数值寄存器,决定了定时器的溢出周期。
- VAL (Value):当前数值寄存器,实时显示当前的计数值。
4. 考点辨析:SysTick vs 通用定时器
- 位置区别:SysTick 在内核;通用定时器在芯片外设区。
- 位数区别:SysTick 是 24 位;通用定时器通常是 16 位。
- 方向区别:SysTick 只能向下计数;通用定时器可以向上/向下/中心对齐。
- 功能区别:SysTick 专注延时/心跳;通用定时器专注 PWM、输入捕获、脉冲计数。
看门狗:确保系统可靠稳定运行,可使得应用程序脱离正常执行流程时复位。
第八章 USART通信协议技术
第一部分 基础概念
按传输格式划分:
- 并行:多条独立数据线同时传输。
- 串行:单条/两条数据线逐位传输。(最为流行,eg.U盘、USB接口设备、
USART)
按同步方式划分:
- 异步:发送方&接收方 无统一时钟线。
- 同步:发送方&接收方 统一时钟线。
按传输方式划分:
- 单工通信:数据传输时单向的。(广播、电视、打印机、BB机)
- 半双工通信:可以双向,但不能同时。(对讲机)
- 全双工通信:可以同时双向传输。(电话、以太网、
USART)
第二部分:波特率
波特率:每秒传输的二进制位数(bit/s),衡量传输速度快慢。
- 其中 $f_{PCLK}$为外设时钟频率。
例题:
常用波特率:
- 9600
- 115200(调试用、速度快)
注意:异步通信双方波特率要一致
第三部分:异步串行通信协议(波形分析)

注意:数据位要从右向左读

UART:全双工、异步、串行。
第四部分:USART内部结构
- 波特率发生器:提供同步时钟信号。
$波特率时钟频率 =波特率\times 采样倍数$ - 发送器:将并行数据转化为串行数据,并按照(起始位、数据位、校验位、停止位)发送到TX引脚。
- 接收器:从RX引脚接收串行数据,转化为并行数据。

- USART1~3:全支持
- USART4~5:除去同步模式、硬件流控制、智能卡

第九章 DMA控制器
第一部分:基础概念
DMA(Direct Memory Access):直接内存访问。
- 作用:允许外设设备直接与储存器进行数据交换,无需cpu介入。
- 优势:解放cpu、提高传输效率、降低功耗。


| DMA适用场景 |
|---|
| 储存设备I/O:硬盘与内存间的大量数据交换 |
| 高速通信通道:网络接口、光纤通信 |
| 数据采集系统 |
| 图像处理 |
| 多处理机系统 |
第二部分:STM32的DMA架构


| 关键配置参数 | |
|---|---|
| 传输方向 | 外设/内存之间相互传输(4种情况的排列组合) |
数据宽度 |
8/16/32 (如果源和目标位数不匹配,DMA会自动帮你补位) |
| 地址递增 | |
| 传输模式 | 单次模式、循环模式 |
| 中断请求 | 传输完成、半传输、传输错误 |
传输模式:
- 单次模式:DMA传输结束后不再产生新的DMA操作。
- 循环模式:每轮传输结束时,要传输的数据数量将自动用设置的初始值进行加载,并继续响应DMA请求。(ADC扫描模式)
第三部分:通道映射
DMA优先级

DMA请求通道


DMA中断请求

第十章 同步串行通信协议
第一部分:SPI通信协议
1. 基础概念
- SPI(Serial Peripheral interface):串行外围设备接口。
特点:
高速、全双工、同步- 在芯片管脚上只占用四根线
- 主要应用:EEPROM、FLASH、实时时钟、AD转换器、数字信号处理器
主从模式:
- SPI通讯系统包含一个(只能一个)主设备、多个或一个从设备。
- 主设备提供时钟,从设备接收时钟。
- 多个从设备通过各自片选信号管理。
- 读写操作都是由主设备发起。
- 通信速度一般能达到10Mbps。
2. 四根信号线
| 引脚名称 | 作用 |
|---|---|
| MOSI(master output slave input) | 主设备输出/从设备输入。即:在主模式下发送数据,从模式下接收数据 |
| MISO(master input slave output) | 主设备输入/从设备输出。即:在主模式下接收数据,从模式下发送数据 |
| SCLK | 主设备产生的串行时钟信号。 |
| CS/SS | 从设备的片选信号,低电平有效。让主设备可以单独与指定从设备通讯$\rightarrow$避免冲突。 |


3. 四种配置模式
- 通信双方必须在同一模式下才可以通信。
- 通过
CPOL(时钟极性)和CPHA(时钟相位)来配置主设备的通信模式。
| SPI模式 | CPOL | CPHA | 空闲时SCK时钟 | 采样时刻 |
|---|---|---|---|---|
| 0(最常用) | 0 | 0 | 低电平 | 奇数边沿 |
| 1 | 0 | 1 | 低电平 | 偶数边沿 |
| 2 | 1 | 0 | 高电平 | 奇数边沿 |
| 3 | 1 | 1 | 高电平 | 偶数边沿 |
- CPOL(clock polarity):=0:SLK低电平/=1:SLK高电平
- CPHA(clock phase):=0:奇数沿采样/=1:偶数沿采样

- SCK刚开始是低电平$\rightarrow$CPOL=0
- 偶数沿采样(注意不要看图片里的数标)$\rightarrow$CPAL=1
- 得到$\longrightarrow$模式=1

第二部分:I2C通信协议
1. 基础概念
特点:
低速、近距离、半双工、同步。- 结构简单、降低系统成本、提高了可靠性。
- 总线具有极低的电流消耗,抗噪声能力强。
主从模式:
多主机总线:每个器件都可以作为主机/从机,但同一时刻只能有一个主机。- 所有设备都接在一根总线上,所以只要有一个拉低,总线就是低电平。
- 开漏输出:必须外接上拉电阻。
- 每个连接到I2C总线的器件都有唯一地址(7bit)。
- 总线上增加和删除器件不影响其它器件工作。
- 从机只能被动呼叫。
- 传输速率:100Kbps、400Kbps、3.4Mbps。

2. 两根信号线
- SDA(serial data):收发数据。
- SCL(serial clock):时钟信号同步。
3. 通信过程

先明确以下几点:
- 主机发送起始信号后必须先发送一个字节的数据(高7位为从机地址,最后一位表示传输方向)。
- 0 :主机$\rightarrow$从机
- 1 :从机$\rightarrow$主机
- 从机先比较地址是不是跟自己相同,若相同,再判断自己是发送器/接收器。
- 发送完一个字节数据后,接收器会发送1bit的数据来应答发送器。
- 所以I2C每次发送的数据必然是8bit。
- 空闲时,SCL和SDA都是高电平。
| 起始信号 | SCL=1时,SDA由高变低 |
| 停止信号 | SCL=1时,SDA由低变高 |
| 应答信号 | 接收器在第9位拉低SDA,表示收到(若SDA没被拉低则表示没收到) |
第十一章 数模转换
第一部分:基础概念
- ADC:数模转换器。
- 作用:将模拟信号转化为数字信号。
主要过程:
采样、保持、量化、编码- 采样:连续的模拟信号$\rightarrow$离散数据点(切片作用)。
- 保持:将采样值保持在一个稳定状态。
- 量化:连续的电压值映射到有限的数字。
- 编码:转化为二进制。
Nyquist采样定理:采样频率 > $2\times$最高频率主要参数:
- 参考电压:影响转换精度、对量化的映射也有影响。
- 分辨率:对输入模拟量微小变化的分辨能力,级数用2的次方(STM32是$2^{12}$
- 量化误差:分辨率不够精细就会引起量化误差。

- 转换时间 =采样保持时间+量化编码时间
第二部分:STM32的ADC架构
- 常用4种ADC:

- 逐位比较:内部 DAC 生成参考电压,与输入信号比较,确定每一位二进制值(从最高位到最低位)
- $\Delta-\Sigma$:过采样、噪声整形
- 流水线:多级量化,每级完成低精度量化
- FLASH:基于比较器和多个参考电压模拟信号转换

1. STM32的ADC



重点:规则组 & 注入组

2. ADC转换时间



