嵌入式知识学习

第一章绪论

1.ARM架构

本质是RISC(reduced instruction set computer),精简指令集。

2.ARM-Cortex系统处理器

a.Cortex系列分类

Cortex-A:应用处理器(Application Processor),应用与高性能,系统

Cortex-M:微控制处理器(Microcontroller),控制与低功耗,控制

Cortex-R:实时处理器(Real-time),高可靠实时,安全

b.演进脉络

ARM7->AMR9->ARM11->Cortex系列(A/R/M)

体系结构类型:冯诺依曼架构(ARM7)-> 哈佛架构(ARM9)

流水线深度:ARM7的3级流水线(取指->译码->执行) -> ARM9的5级流水线(取指->译码->执行->存储->回写)

第二章ARM Cortex-M4核体系结构

1.ARM体系结构

a.体系架构区别

冯诺依曼:指令和数据共用总线,同一内存

哈佛架构:指令和数据是分开的总线和存储,但是可以同时访问(Coretx-M采用的是哈佛架构)

2.工作原理

a.Cortex-M4启动

处理器启动时处于线程模式和Thumb状态(16位)

3.Cortex-M4寄存器组织

a.寄存器组

通用寄存器:R0-R12

堆栈指针寄存器:R13

连接寄存器:R14(存储子程序返回地址,异常/中断需手动保存,返回地址自动保存)

程序计数器:R15(存储下一条指令地址)(最低有效位LSB=1,标识处理器处于Thumb状态)

程序状态寄存器:xPSR

b.xPSR状态寄存器

APSR(应用程序PSR):管理标志位

IPSR(中断号PSR):存储中断/异常号

EPSR(执行PSR):存储Thumb/执行状态

c.MSR vs MRS

MSR:通用寄存器 -> 特殊寄存器(写操作)

MRS:特殊寄存器 -> 通用寄存器(读操作)

4.Cortex-M4存储器系统

a.数据传输方式

中断:允许CPU被外部事件打断,完成紧急任务后自动返回,极大提高了CPU效率和系统实时性

查询:CPU需不断轮询外设状态,效率低仅在简单或低功耗场景使用

DMA:不占用CPU,但需要专用硬件,适用于高速、大批量数据传输

b.地址映射区域

Cortex-M4采用统一的4GB的线性地址空间,最核心、最基础的两大区域是Code和SRAM

Code:用于存放程序代码,也可用于数据访问(查表)

SRAM:用于存放变量、堆栈等数据,访问速度较快

外设:设备寄存器

外部设备:扩展RAM、设备

c.存储器映射

核心思想:不同的物理器件(程序代码访问、数据访问、外设)被分配到固定的地址范围,CPU通过访问不同的地址来操作不同对象

d.中断系统

中断:来自外部硬件的中断请求,属于异步异常

异常:包括中断、系统调用、硬件错误等所有导致cpu切换流程的事件

5.Cortex-M4运行状态

a.线程状态:用于执行普通应用程序代码,复位后默认进入此状态

b.处理状态:执行异常或者中断的程序代码,发送异常自动切入,执行完返回线程状态。

6.Cortex-M4特权模式

a.特权模式:权力最大,可执行所有指令。处理状态强制为特权模式;复位后,线程状态也默认为特权模式

b.用户模式(非特权模式):权力受限,无法操作关键寄存器,通常用于不受信任的用户应用程序

7.Cortex-M4处理异常流程

a.现场保护:硬件自动压栈,发生异常时,硬件自动将寄存器压入当前堆栈。

b.查询向量表:根据异常号获取对应的异常服务程序入口地址。

c.更新状态:将 PC 更新为服务程序地址,LR 设置为 EXC_RETURN 标记,并切换至处理状态 Handler Mode(特权级)。

d.执行 ISR:跳转至服务程序执行用户代码。

e.异常返回:执行完ISR,硬件自动弹出栈中寄存器,恢复现场并返回原线程模式。

第三章 ARM处理器指令集

1.ARM指令集简介

基本格式:<操作码> {条件} {S}  <目的寄存器>, <操作数1>, <操作数2>

条件码后缀:

EQ (Z=1) 相等(Equal)NE (Z=0)不相等
MI (N=1) 负数(Minus)PL (N=0) 非负数(Plus)
CS/HS (C=1) 进位/无符号(Carry Set)CC/LO (C=0) 无进位/无符号 (Carry Clear)
VS (V=1) 溢出(Verflow Set)VC (V=0) 无溢出(Verflow Clear)
HI (C=1且Z=0) 无符号大于(Higher)

LS (C=0或Z=1) 无符号小于等于(Low or Same)

GE (N=V) 有符号>= (Greater or Equal)LT (N≠V) 有符号< Less Than
GT (Z=0且N=V) 有符号> Greater ThanLE (Z=1或N≠V) 有符号<= (Less or Equal)

传统ARM处理器支持32位ARM和16位Thumb指令集

Cortex-M3/M4只支持Thumb-2,不支持32位ARM指令集

Thumb:16位定长

Thumb:16位/32位混合,Cortex系列使用

后缀编码:

编码后缀状态
0000 ~ 1110EQ ~ AL✅ 可用(共15个)
1111(无)❌ 保留编码,无后缀,不可用

标志位只有4种:N、C、Z、V

 ARM指令集的特点

特点说明
RISC架构指令精简,大多数单周期执行
条件执行几乎所有指令均可条件执行(后缀判断标志位)
Load/Store架构只有LDR/STR指令访问内存,运算指令只操作寄存器
三地址格式操作码 目的寄存器, 源操作数1, 源操作数2
寻址方式灵活多种寻址方式,但数量少于CISC

基本格式

PUSH {寄存器列表}
STMDB SP!, {寄存器列表}

2.ARM寻址方式

数据处理指令的寻址方式:

立即数寻址 寄存器寻址 寄存器移位寻址 

批量Load/Store指令的寻址:低编号寄存器对应低地址内存单元、高编号寄存器对应高地址

堆栈操作寻址方式操作顺序:后进先出

分为一下4种:满堆栈(指针指向栈顶元素)、空堆栈(指针指向第一个可用元素)、递减栈(向内存地址减小的方向生长)、递增栈(向内存地址增加的方向生长)

3.Cortex数据访问指令

LDR=Load(内存指向寄存器)、STR=Store(寄存器指向内存)

B/H/SB/SH后缀:B=字节、H=半字、SB=有符号字节、SH=有符号半字、后缀S表示需要更新APSR中的标志

LDRB高位补0、LDRSB/LDRSH高位补符号位

预索引!在括号内、后索引!在括号外

LDM(Load Multiple)和STM(Store Multiple)指令用于一次加载/存储多个32位(4个字节)寄存器到连续的内存地址

ARM架构中,批量传输的最小单位就是一个寄存器 = 32位

MOV立即数不能超过255,除非是MOVW

LDR伪指令格式:LDR Rt, =数值或地址

LDR真实指令格式(从内存加载):LDR{条件}{类型} Rt, [Rn {, #偏移量}]

四大数据传送类型

类型说明指令示例
1. 寄存器 ↔ 存储器在寄存器和内存之间传送数据LDRSTRLDRBSTRBLDRHSTRH
2. 寄存器 ↔ 寄存器在寄存器之间传送数据MOVMVN
3. 寄存器 ↔ 特殊寄存器在通用寄存器和特殊寄存器之间传送数据MRSMSR
4. 立即数 → 寄存器将立即数加载到寄存器MOV R0, #0xFF
LDR R1, =0x12345678

4.Cortex数据处理指令

饱和运算指令:信号完全可以超过,饱和运算的作用正是把超过的部分钳位到边界值,减小失真影响。

Cortex-M4处理器的常用指令有:四则运算指令、逻辑运算指令、移位循环指令、数据转换指令和位带操作指令

三种隔离指令(是在执行后续操作之前完成)对比

指令范围等待内容典型用途
DMB仅存储器访问之前的内存访问完成共享内存、改变外设访问顺序
DSB所有指令(其他处理器操作)所有内存访问和指令完成配置修改、Cache操作
ISB流水线清空流水线,重新取指

配置生效、自修改代码

TBBvs TBH(8位是一个字节,16位是半字,32位是一个字)

指令表格元素大小跳转范围

格式

TBB8位(字节)较近(约 ±256 字节)TBB [PC, R0]
TBH16位(半字)较远(约 ±64KB)TBH [PC, R0, LSL #1]

第四章 汇编语言的程序结构

1.ARM汇编语言语句格式

{标号} {指令/伪指令} {操作数} {;注释}

操作符功能示例
$变量代换(宏参数替换)MACRO $Label, $Reg
%产生数字标号%F1
#立即数前缀MOV R0, #100
@注释(某些汇编器)ADD R0, R1 @ 注释

ARM汇编支持的常量类型(5个):数字常量如0x1234、逻辑常量如{TRUE}、字符串常量如HELLO、基址与偏移表达式、寄存器表达式

常见运算符分类

类别运算符说明
位逻辑运算符AND、OR、EOR、BIC按位与、按位或、按位异或、位清零
逻辑运算符(有L前缀)LAND、LOR、LNOT、LEQ 等返回 {TRUE}/{FALSE}
移位运算符ROL、ROR、LSL、LSR、ASR循环左移、循环右移、逻辑左移等

优先级规则总结

优先级运算符类型运算顺序示例
最高括号 ()先内后外(A+B)×C
次高单目运算符(只操作一个数)从右到左-NOT X
最低双目运算符(操作两个数)从左到右A+B-C

符号作用:

符号作用域内要唯一,大小写不同是两个名。
指令不区分大小写,符号一定要分清。

2.ARM定义类伪指令

常用数据定义伪指令对照表

伪指令全称分配单位示例
DCB(Byte)Define Constant Byte字节(8位)DCB 0xFF, "A"
DCW(Word)Define Constant Word (Halfword)半字(16位)DCW 0x1234
DCD(Doubleword)Define Constant Doubleword (Word)字(32位)DCD 0x12345678
DCQ(Quadword)Define Constant Quadword双字(64位)DCQ 0x123456789ABCDEF0
DCFD(Floating)Define Constant Floating Double双精度浮点DCFD 3.14159
DCFSDefine Constant Floating Single单精度浮点DCFS 1.23
SPACEReserve Space保留字节空间SPACE 10

伪指令(Pseudo-instruction/Directive)仅在汇编阶段起作用,用于指导汇编器如何生成机器码、分配内存、控制汇编过程等。汇编结束后,伪指令不会出现在最终的可执行文件中

AREA 属性速查表(AREA 伪指令用于定义一个代码段或数据段)

属性含义典型用途
CODE代码段存放指令
DATA数据段存放数据
READONLY只读代码段、常量数据
READWRITE可读可写变量数据
ALIGN=n对齐方式地址对齐

一个汇编语言程序至少包含一个段(通常是代码段)。当程序复杂时,可以拆分为多个代码段和数据段。

COMMON 属性定义的是一个通用段(只是占位/预留空间)

特点说明
不包含用户代码和数据只是占位/预留空间
多个同名 COMMON 段合并链接时合并为一个大段
用于未初始化数据类似 C 语言的 common 块

3.ARM汇编语言程序结构

可执行映像文件的组成

组成部分数量要求属性说明
代码段至少一个只读存放指令
已初始化数据段零个或多个可读写存放有初值的变量
未初始化数据段零个或多个可读写存放无初值的变量(如 ZI 段)

子程序特点

优点缺点
模块化设计运行速度降低
节省存储空间有调用开销
易于维护不能随意嵌套(需注意栈)

宏定义(MACRO)伪指令的组成

伪指令功能
MACRO宏定义开始
MEXIT退出宏(类似 return)
MEND宏定义结束

伪指令对照表

作用全局变量(GB)局部变量(LC)赋值
数字变量(A)GBLALCLASETA
逻辑变量(L)GBLLLCLLSETL
字符串变量(S)GBLSLCLSSETS

第五章嵌入式c语言编程

1.嵌入式c语言规则

C语言-函数、汇编-子程序

C语言中:

一个C语言=一个或多个函数

main()是必须的入口函数,程序总是从main开始执行,main可以放在文件的任何位置

每个函数完成一个特定功能

函数定义 vs 函数声明

函数定义(实现):可以在main()前、后或另一个文件。被调用的函数不一定在main()中定义,可以在其他任何位置定义

函数声明(不实现):告诉编译器函数存在,先声明后使用

C语言的三种基本结构

结构名称特点图示
顺序结构顺序执行从上到下,一句一句执行口→口→口
选择结构分支/判断根据条件选择执行哪条路◇ → 分支
循环结构重复执行反复执行某段代码↺ 循环

2.嵌入式C语言特点

常量和常数在嵌入式系统中存放在只读存储器中

存储器类型特性存储内容
Flash / ROM只读,断电不丢失常量、常数、程序代码
RAM可读写,断电丢失变量、栈、堆

存储器作用
Flash存储程序代码、常量、只读数据
ROM存储启动代码、固定常数(只读)
RAM存储变量、中间计算结果(可读写)

C函数可嵌套调用,可递归调用。
但不可嵌套定义,需函数全局来定义。

do-while 先做一次,条件非零继续跑,条件为零就结束。

寄存器作用

特点说明
速度快比 RAM 快很多
容量小一般只有几十个(如 R0-R12)
频繁使用算术运算、逻辑运算都通过寄存器
存放操作数ADD、SUB、MOV 等指令的操作数都在寄存器中

3.嵌入式C语言的用法

相同结构体类型变量

操作是否允许说明
赋值(=)✅ 可以stu2 = stu1; 逐成员复制
比较大小(>,<,>=,<=)❌ 不可以结构体不是基本类型
判断相等(==,!=)❌ 不可以需逐个成员比较
地址相同❌ 不一定两个不同变量地址不同
相加(+)❌ 不可以无意义

extern 关键字总结

概念含义可以出现次数
定义创建变量,分配内存一次
声明告诉编译器存在这个变量多次

结构体定义语法

struct 结构体标签 {
    成员1;
    成员2;
} 结构体变量名;

第六章STM32处理器的工作原理

1.STM32F4处理器启动过程

启动文件(是启动流程的代码实现,能够反映启动流程)

(Startup File是嵌入式系统中最先执行的代码,负责在main函数之前完成)完成的工作

【上电/复位】
     ↓
1. 初始化堆栈指针 SP     ← 设置栈顶地址,位函数调用做准备
     ↓
2. 初始化异常向量表       ← 设置中断入口地址,定义程序入口地址
     ↓
3. 调用复位处理程序       ← 复位中断服务,初始化代码
     ↓
4. 初始化全局变量         ← 清 .bss 段、复制 .data 段
     ↓
5. 调用 __main           ← C库初始化,启动文件调用main函数
     ↓
6. 进入 main() 函数       ← 用户程序开始

常见启动文件类型

处理器系列启动文件特点
STM32 F1startup_stm32f10x.s提供标准外设库
STM32 F4startup_stm32f40xx.s支持 FPU
STM32 H7startup_stm32h7xx.s复杂内存映射
ARM 通用startup.s简单轻量
RISC-Vstartup.S类似 ARM

2.STM32F4处理器时钟系统

STM32时钟使能控制

时钟类型使能控制方式
AHB总线时钟RCC_AHBENR 寄存器(可通过RCC寄存器控制使能)
APB1外设时钟RCC_APB1ENR 寄存器(每个外设有独立的时钟使能)
APB2外设时钟RCC_APB2ENR 寄存器
内核时钟通过系统时钟配置(可通过配置控制)
PTP时钟无独立使能(持续运行)

五个时钟源对比

时钟全称类型频率用途
HSIHigh Speed Internal(内部)内部 RC16MHz系统时钟、PLL 输入
HSEHigh Speed External(外部)外部晶振4-26MHz系统时钟、PLL 输入
LSILow Speed Internal内部 RC~32kHz独立看门狗、RTC
LSELow Speed External外部晶振32.768kHzRTC 时钟
PLLPhase Locked Loop锁相环(倍频器得到更高系统时钟)(内部)频率可配置,不固定(最高 168MHz+)

3.STM32F4处理器IO端口

GPIO模式总结

模式英文说明
输入GPIO_Mode_IN浮空/上拉/下拉输入
输出GPIO_Mode_OUT通用输出(推挽/开漏)
复用功能GPIO_Mode_AF外设控制引脚(如 USART、I2C)
模拟GPIO_Mode_ANADC/DAC 输入输出

GPIO特性总结

特性说明
输出模式推挽(高低电平都能驱动)或开漏(只能输出低电平),可选上拉/下拉
翻转速度最快 2 个时钟周期(50MHz 下可达 25MHz)
数据来源输出数据寄存器(ODR)或外设(复用功能)
控制寄存器模式寄存器(MODER)、输出类型(OTYPER)、速度(OSPEEDR)、上拉/下拉(PUPDR)

开漏管低不管高,上拉电阻把电平保。
线与谁低谁说了算,推挽互相对抗会烧掉。

GPIO寄存器总结

寄存器全称方向作用
IDRInput Data Register只读读取引脚输入值
ODROutput Data Register读/写控制引脚输出值
BSRRBit Set/Reset Register只写原子操作置1/清0
BRRBit Reset Register只写原子操作清0(部分系列)

4.STM32F4处理器中断控制

NVIC中断优先级配置的标准流程

系统启动时先设置中断分组、确定组号后决定抢占优先级和响应优先级的分配位数、调用NVIC函数设置分组、对每个中断调用NVIC初始化设置优先级

中断数量

  • STM32F40x / F41x:82 个可屏蔽中断

  • STM32F42x / F43x:92 个可屏蔽中断(外设更多)

NVIC寄存器写操作规则(写1有效,写0无效避免误改写)

操作写法效果
使能中断ISER = 1 << 3写1 → 使能 IRQ3
使能中断ISER = 0 << 3写0 → 无效果
清除中断ICER = 1 << 3写1 → 清除 IRQ3

优先级总位数

STM32使用4位优先级配置(不是8位全部使用)

项目结论
优先级寄存器硬件宽度8 位(每中断一个寄存器)
STM32 实际使用高 4 位(抢占位数+响应位数)
可配置的优先级级别数2⁴ = 共16 级
未使用的低 4 位写无效,读为 0

第七章STM32 处理器编程开发环境

1.STM32处理器编程环境

STM32F4标准库核心文件说明

文件作用
stm32f4xx.h核心头文件:包含所有外设寄存器的结构体定义、中断向量、系统时钟配置等。所有外设驱动都依赖它。
stm32f4xx_conf.h配置文件:用户可通过它选择启用哪些外设模块,或修改外设参数。
stm32f4xx_ppp.c/h具体外设驱动文件ppp 是占位符(通用外设占位符),实际如 stm32f4xx_gpio.cstm32f4xx_usart.c 等,提供该外设的 API 函数。
misc.c/h杂项文件:提供 NVIC 中断优先级配置等内核相关功能的函数。
stm32f4xx_rcc.c/h时钟驱动文件:配置系统时钟、使能外设时钟等。
system_stm32f4xx.c系统初始化文件:定义 SystemInit() 函数,负责配置系统时钟。

STM32F4固件库分层结构

┌─────────────────────────────────────┐
│      应用程序层(Application)中断服务程序函数等              │   ← 用户自己的代码(main.c 等)
├─────────────────────────────────────┤
│           API 层(中间件层、外设驱动库)                               │  ← 标准外设库函数        (GPIO_Init、  USART_SendData等)API:应用程序编程接口,封装好的函数
├─────────────────────────────────────┤
│         硬件层(Hardware)物理层属于硬件层                        │  ← 寄存器、芯片外设本身
└─────────────────────────────────────┘

Keil是德国的公司

第八章STM32F4处理器的基础应用设计

1.LED灯显示

多种显示效果的设计

流水灯:依次点亮单个LED;交替闪烁:两组LED轮流亮灭;从中间向两边:第4、5→3、6→2、7→1、8;跑马灯:多个连续LED整体移动;所有效果统一结构:状态表 + 刷新函数

点亮时间间隔如何实现

延时方式:软件空循环、SysTick定时器、通用定时器;间隔变化核心:用变量代替固定延时值;程序自变:每次循环延时变量递增或递减;按键控制:按键中断里修改延时变量值;呼吸灯:连续改变亮灭占空比(亮的时间占比)

理解系统引导程序的设计思路

引导程序就是启动文件、负责复位后到main函数之间的初始化工作、包括设置栈指针、初始化中断向量表、调用SystemInit配置时钟、最后跳转到main。

学习编程控制处理器IO口驱动LED灯的方法

本质就是配置GPIO位推挽输出模式(主动输出高电平或低电平),然后通过写ODR寄存器或调用库函数控制引脚高电平。要点是时钟使能、模式配置、速度配置、电平控制四个步骤。

2.四位数码管显示

理解四位数码管的显示原理

核心是段码(8位:a,b,c,d,e,f,g,dp)+位选(4位),靠位选分时点亮不同位实现多位显示

掌握四位数码管的硬件设计原理

四位数码管有两种类型,共阴极和共阳极,共阴极是段码为1亮,共阳极是段码为0亮。四个位选引脚分别控制每一位,段码引脚控制显示内容。

学习编程控制处理器IO口驱动数码管的方法

控制方法就是GPIO推挽输出,段码引脚输出段码值、位选引脚选通当前位,多位数码管必须采用动态扫描方式。静态显示是每个数码管独立占用一套段码线,不共享,每个数字持续点亮。动态显示是所有位共享段码线,靠快速轮流点亮实现多位数显示。

3.矩阵按键检测

理解独立按键和矩阵按键的检测原理

独立按键每个按键占用一个独立的IO口,检测时直接读取该IO电平即可判断是否按下。矩阵按键按行和列排列,通过行列扫描检测哪个按键被按下,用少量IO口就能检测大量按键。直接调用GPIO——ReadInputDataBit读取该引脚电平

理解所有16个按键的硬件接口图

每个按键位于某一行和某一列的交点,按下时该行和列导通。

学习编程控制处理器IO(输入输出接口)口按键检测的原理和方法

独立按键直接读取IO电平状态,矩阵按键采用行列扫描方法,逐行输出低电平并读取列线电平,哪一列读到低电平就表示该行该列的按键被按下

按键软件消抖实现

抖动:按键按下和释放瞬间,触点会弹跳,产生几毫秒的不稳定电平,称为抖动。

检测到按键按下时先记录状态,延时20ms后再次读取该IO电平,如果仍按下则确认有效,否则认为是抖动干扰

4.外部中断处理实验

掌握STM32F4的中断执行方法和中断处理机制

中断就是CPU正在执行主程序时,某个事件触发了中断请求,CPU暂停当前任务去执行中断服务程序,执行完再回来继续。中断处理过程包括中断请求、中断响应、保护现场、执行中断、恢复现场、返回主程序。

了解STM32F4的中断控制器的结构

STM32F4的中断叫NVIC(嵌套向量中断控制器),负责管理所有中断的使能、禁止、优先级设置。它支持中断嵌套,高优先级可以打断低优先级,抢占CPU。

学习以外部中断方式编程控制处理器实现独立按键的检测

按键检测不再用主循环轮询,而是将按键连接到外部中断引脚,按键按下时触发中断,在中断服务程序中执行按键功能。

5.通用定时器中断处理

理解STM32F4的定时处理机制

定时器就是芯片内部的硬件计数器,时钟源驱动计数器递增,达到设定值时产生更新事件或中断,完全由硬件完成,不占用CPU时间

定时中断方式

定时中断是在定时器溢出时触发中断,在中断服务程序中执行定时任务。与软件延时相比,定时中断不阻塞CPU,可以在等待的同时执行其他任务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值