第一章 导论

嵌入式系统是一切非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 是一种高级微控制器总线架构
    主要包含以下两种不同的标准:
  1. AHB(Advanced High-performance Bus):高级高性能总线
    • 多个主机和多个从机的连接
    • AHB-lite:单个主机和多个从机
  2. 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. 系统组成

  • 最小系统:用最少的元件组成微控制器可以工作的系统。

    (1)微控制器

  • 核心芯片工作电压通常为 2.0V~3.6V

(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. 置1 (Set):用 |。 例如 Reg |= (1 << 3); (第3位置1)
    2. 清0 (Clear):用 & ~。 例如 Reg &= ~(1 << 3); (第3位清0)
    3. 翻转 (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)

同上。

第六章 中断和异常

本质:改变处理器执行指令的顺序。

  • 区别:
    • 中断:响应外部事件
    • 异常:内部程序错误

目的

  1. 提高cpu效率
  2. 实时处理
  3. 异常处理
  4. 数据传输
  5. 不占用cpu资源

1. 中断处理流程


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

(1)中断优先级

  • 抢占优先级 > 响应优先级
  • 数值越小,优先级别越高
  • Reset,NMI(不可屏蔽中断 ) , Hard Fault 的优先级为负,且不可修改,高于普通的中断优先级

中断优先级判断

  1. 先判断抢占优先级的大小
  2. 如果抢占优先级相同,则比较响应优先级的大小
  3. 若抢占优先级和响应优先级均相同,则根据中断向量表中的顺序来决定

(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内部结构

  1. 波特率发生器:提供同步时钟信号。
    $波特率时钟频率 =波特率\times 采样倍数$
  2. 发送器:将并行数据转化为串行数据,并按照(起始位、数据位、校验位、停止位)发送到TX引脚
  3. 接收器:从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. 通信过程

先明确以下几点:

  1. 主机发送起始信号后必须先发送一个字节的数据(高7位为从机地址,最后一位表示传输方向)。
    • 0 :主机$\rightarrow$从机
    • 1 :从机$\rightarrow$主机
  2. 从机先比较地址是不是跟自己相同,若相同,再判断自己是发送器/接收器。
  3. 发送完一个字节数据后,接收器会发送1bit的数据来应答发送器。
  4. 所以I2C每次发送的数据必然是8bit
  5. 空闲时,SCL和SDA都是高电平
起始信号 SCL=1时,SDA由高变低
停止信号 SCL=1时,SDA由低变高
应答信号 接收器在第9位拉低SDA,表示收到(若SDA没被拉低则表示没收到)

第十一章 数模转换

第一部分:基础概念

  • ADC:数模转换器。
  • 作用:将模拟信号转化为数字信号
  • 主要过程采样、保持、量化、编码

    1. 采样:连续的模拟信号$\rightarrow$离散数据点(切片作用)。
    2. 保持:将采样值保持在一个稳定状态。
    3. 量化:连续的电压值映射到有限的数字。
    4. 编码:转化为二进制。
  • Nyquist采样定理:采样频率 > $2\times$最高频率

  • 主要参数

    1. 参考电压:影响转换精度、对量化的映射也有影响。
    2. 分辨率:对输入模拟量微小变化的分辨能力,级数用2的次方(STM32是$2^{12}$
    3. 量化误差:分辨率不够精细就会引起量化误差。
    4. 转换时间 =采样保持时间+量化编码时间

第二部分:STM32的ADC架构

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

1. STM32的ADC



重点:规则组 & 注入组

2. ADC转换时间