第一章绪论
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 Than | LE (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 ~ 1110 | EQ ~ 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. 寄存器 ↔ 存储器 | 在寄存器和内存之间传送数据 | LDR, STR, LDRB, STRB, LDRH, STRH |
| 2. 寄存器 ↔ 寄存器 | 在寄存器之间传送数据 | MOV, MVN |
| 3. 寄存器 ↔ 特殊寄存器 | 在通用寄存器和特殊寄存器之间传送数据 | MRS, MSR |
| 4. 立即数 → 寄存器 | 将立即数加载到寄存器 | MOV R0, #0xFFLDR R1, =0x12345678 |
4.Cortex数据处理指令
饱和运算指令:信号完全可以超过,饱和运算的作用正是把超过的部分钳位到边界值,减小失真影响。
Cortex-M4处理器的常用指令有:四则运算指令、逻辑运算指令、移位循环指令、数据转换指令和位带操作指令
三种隔离指令(是在执行后续操作之前完成)对比
| 指令 | 范围 | 等待内容 | 典型用途 |
|---|---|---|---|
| DMB | 仅存储器访问 | 之前的内存访问完成 | 共享内存、改变外设访问顺序 |
| DSB | 所有指令(其他处理器操作) | 所有内存访问和指令完成 | 配置修改、Cache操作 |
| ISB | 流水线 | 清空流水线,重新取指 |
配置生效、自修改代码 |
TBBvs TBH(8位是一个字节,16位是半字,32位是一个字)
| 指令 | 表格元素大小 | 跳转范围 |
格式 |
|---|---|---|---|
| TBB | 8位(字节) | 较近(约 ±256 字节) | TBB [PC, R0] |
| TBH | 16位(半字) | 较远(约 ±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 |
| DCFS | Define Constant Floating Single | 单精度浮点 | DCFS 1.23 |
| SPACE | Reserve 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) | GBLA | LCLA | SETA |
| 逻辑变量(L) | GBLL | LCLL | SETL |
| 字符串变量(S) | GBLS | LCLS | SETS |
第五章嵌入式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 F1 | startup_stm32f10x.s | 提供标准外设库 |
| STM32 F4 | startup_stm32f40xx.s | 支持 FPU |
| STM32 H7 | startup_stm32h7xx.s | 复杂内存映射 |
| ARM 通用 | startup.s | 简单轻量 |
| RISC-V | startup.S | 类似 ARM |
2.STM32F4处理器时钟系统
STM32时钟使能控制
| 时钟类型 | 使能控制方式 |
|---|---|
| AHB总线时钟 | RCC_AHBENR 寄存器(可通过RCC寄存器控制使能) |
| APB1外设时钟 | RCC_APB1ENR 寄存器(每个外设有独立的时钟使能) |
| APB2外设时钟 | RCC_APB2ENR 寄存器 |
| 内核时钟 | 通过系统时钟配置(可通过配置控制) |
| PTP时钟 | 无独立使能(持续运行) |
五个时钟源对比
| 时钟 | 全称 | 类型 | 频率 | 用途 |
|---|---|---|---|---|
| HSI | High Speed Internal(内部) | 内部 RC | 16MHz | 系统时钟、PLL 输入 |
| HSE | High Speed External(外部) | 外部晶振 | 4-26MHz | 系统时钟、PLL 输入 |
| LSI | Low Speed Internal | 内部 RC | ~32kHz | 独立看门狗、RTC |
| LSE | Low Speed External | 外部晶振 | 32.768kHz | RTC 时钟 |
| PLL | Phase Locked Loop | 锁相环(倍频器得到更高系统时钟)(内部) | 频率可配置,不固定(最高 168MHz+) |
3.STM32F4处理器IO端口
GPIO模式总结
| 模式 | 英文 | 说明 |
|---|---|---|
| 输入 | GPIO_Mode_IN | 浮空/上拉/下拉输入 |
| 输出 | GPIO_Mode_OUT | 通用输出(推挽/开漏) |
| 复用功能 | GPIO_Mode_AF | 外设控制引脚(如 USART、I2C) |
| 模拟 | GPIO_Mode_AN | ADC/DAC 输入输出 |
GPIO特性总结
| 特性 | 说明 |
|---|---|
| 输出模式 | 推挽(高低电平都能驱动)或开漏(只能输出低电平),可选上拉/下拉 |
| 翻转速度 | 最快 2 个时钟周期(50MHz 下可达 25MHz) |
| 数据来源 | 输出数据寄存器(ODR)或外设(复用功能) |
| 控制寄存器 | 模式寄存器(MODER)、输出类型(OTYPER)、速度(OSPEEDR)、上拉/下拉(PUPDR) |
开漏管低不管高,上拉电阻把电平保。
线与谁低谁说了算,推挽互相对抗会烧掉。
GPIO寄存器总结
| 寄存器 | 全称 | 方向 | 作用 |
|---|---|---|---|
| IDR | Input Data Register | 只读 | 读取引脚输入值 |
| ODR | Output Data Register | 读/写 | 控制引脚输出值 |
| BSRR | Bit Set/Reset Register | 只写 | 原子操作置1/清0 |
| BRR | Bit 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.c、stm32f4xx_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,可以在等待的同时执行其他任务

113

被折叠的 条评论
为什么被折叠?



