1. 中断的概念
中断是单片机应对突发事件的一种机制。如下图所示,当遇到更高优先级的事件时,单片机会记录当前执行节点,转而处理突发事件,处理完毕后,再回到原程序节点继续执行。
1.1 举例说明必要性
假设有一个程序在不断地点亮、熄灭灯,如果采用顺序执行的方式,会导致很多数据被覆盖。此时可以采用中断的方式:当接收到数据时,根据接收数据寄存器的状态进行中断处理,从而防止数据丢失。核心目的就是避免延迟函数耽误数据读取。
2. 中断优先级的概念
2.1 概念
简单来说,事件本身也有优先级之分。通过配置中断优先级,可以确定事件执行的先后顺序。由于单片机是单核处理器,同一时刻只能处理一个事件,因此必须明确事件的先后顺序。
2.2 表示中断优先级
片上外设具备中断功能,NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)会对这些中断进行排序,随后单片机在中断向量表中查找对应的执行函数,并执行相应的中断处理。
NVIC 包含以下内容:
公用 4 位比特位,可以通过分组来分配抢占优先级与子优先级的数量。
2.3 抢占优先级与中断嵌套
当遇到更高的抢占优先级的时候,会发生中断嵌套。
抢占优先级定 “级别”,子优先级定 “同级别内的顺序”
| 维度 | 抢占优先级 | 子优先级 |
|---|---|---|
| 作用层级 | 跨优先级(上下级) | 同优先级内部(平级) |
| 决定什么 | 谁能打断谁 | 同级别里谁先执行 |
| 是否可抢占 | 是,高抢低 | 否,不改变抢占关系 |
2.4 子优先级与中断排队
当抢占优先级相同,会根据子优先级的先后来进行排序执行任务。
优先级相同时,遵循先来后到的准则。
3. 串口中断的实现
3.1 配置标志位中断
在串口的结构图中,含有如下的一个中断结构:
标志位经过逻辑或门,产生中断:
配置对应的标志位中断,让其可以产生中断。
3.2 配置NVIC
配置中断优先级分组- 配置抢占优先级与子优先级的位数
4. EXTI的工作原理
External Interrupt and Event Controller-外部中断和事件控制器
4.1 EXTI的简介
EXTI主要用来捕捉信号的上升沿与下降沿。
并产生对应的中断。
4.2 EXTI的应用
一般情况,使用连续两次的判断,当之前为高电平,连续两次读取电平状态,为低电平的时候,此时认为按键按下。
但是EXTI中断可以实现上升沿或者下降沿的中断判断:
4.3 EXTI线的概念
EXTI一共有16个外部中断
在一个时间, EXTI只能给不同的ABC组一个使用。
就是如果是EXTI0,那么此时只能有GPIOA0,GPIOB0等等中的一个接入使用。
EXTI一共具有20条线:
其中前16条是IO接口引入,
剩下4条分别是如下接口实现:
| 信号源 | 全称 | 作用 | 线路 |
|---|---|---|---|
| PVD | 可编程电压检测器(Power Voltage Detector) | 电源电压低于 / 高于设定阈值时触发,用于掉电预警 | Line16 |
| RTC | 实时时钟(Real-Time Clock) | 闹钟、唤醒定时器等时间事件 | Line17 |
| USB | 通用串行总线 | USB 从挂起 / 低功耗状态唤醒的事件 | Line18 |
| Ethernet | 以太网 | 网线接入 / 网络唤醒事件(ETH_WKUP) | Line19 |
4.4 EXTI边沿检测实现
接入GPIO口,然后经过边沿检测电路,分别可以得到上升沿,下降沿和双边延。也可以通过软件触发中断。
5. 时钟树
5.1 时钟和时钟树的概念
时钟: 单片机的心跳,控制代码运行的时序。
时钟树:基准时钟,经过分频得到不同外设系统的不同时钟频率。形似树的形状,所以就称为时钟树。
5.2 分频器锁相环和复用器
分频器: 对频率做除法
锁相环: 对频率做乘法
复用器: 对频率做选择-例如 HSE条路线 有三个选择 -一般就是梯形的东西
5.3 时钟树的树根
就是时钟的基准源:
HSI: 高速内部时钟- 这个时钟准确性比较低
HSE: 一般都使用高速外部时钟,准确性高
LSE:低速外部时钟,一般就是32.768Khz 作为实时时钟,这个值为2的次方
LSI:低速内部时钟,一般不使用, 准确性比较低
5.4 时钟树的树干
就是系统时钟:SYSCLK
系统时钟有三个来源:
- 直接从HSI得到- 内部时钟源精度低且固定
- 直接从HSE得到- 外部时钟源精度高且固定
- 经过锁相环倍频后- SYSCLK灵活可变, 但是需要注意推荐最高频率,超过可能会导致错误。
5.5 时钟树的树枝
就是经过各部分分配到外设上的时钟频率:
共有三条总线:
AHB:Advanced High-Speed Bus(先进高性能总线)
- 连接高速核心部件:CPU 内核、Flash、SRAM、DMA 控制器等;
APB1/2:Advanced Peripheral Bus(先进外设总线)
- 专门挂外设(USART、SPI、I2C、定时器、ADC、GPIO 等)。分两条是为了让不同速度需求的外设分开供电 / 分频;
I-Bus:Instruction Bus(指令总线)
- CPU 要执行的程序代码存在 Flash 里,所以 I-Bus 通过总线矩阵去Flash读取指令;
D-Bus: Data Bus(数据总线)
- 变量、数组、堆栈都存在SRAM(RAM)里,所以 D-Bus 通过总线矩阵访问 RAM;
6. 时钟树的编程
6.1 时钟树的初始状态
当没配置时钟树时,时钟树具有初始状态:
如下图的绿色粗线所示:
6.2 启动代码改变初始时钟
虽然说默认情况是上述情况所示,但是启动文件中,具有如下的代码:
也就是经过SystemInit处理后,会将单片机的频率设置为最高频率。
也就是变成这样了: