=============================
2022-8-22
=============================
一.温故知新
驱动LED灯、蜂鸣器、功能按键、系统定时器
直接操作外设寄存器、官方LIB库、官方HAL库
是由ARM核心支持的位带的操作
系统定时器(system timer | systick)
是由ARM核心提供的定时器资源
决定定时长短是由时钟频率和计数值
时钟频率是通过时钟树的分析得出的SYSCLK / 8 或者 SYSCLK
计数值是通过ARM的手册分析得出
控制及状态寄存器 一共有32bit
第0位 开启定时器的
第1位 是否触发外部请求
第2位 时钟源的选择
第3-15位 保留
第16位 判断计数是否计到0
第17-31位 保留
重装载值寄存器 一共有32bit
第0-23位 存储重装载值[0 - 16M-1]
第24-31位 保留
当前值寄存器
第0-23位 当前计数值[0 - 16M-1]
第24-31位 保留
二.中断
之前写了LED灯的流水灯程序->延时使用的是粗略延时(空循环)
使用精确的延时->使用了系统定时器
之前写了功能按键的程序->轮询的方法检测按键是否被按下
while(1)
{
button_status(0);
}
由于轮询的方法浪费资源,可以替换成中断的方法
目的 : 把轮询检测按键的程序,修改成中断的方式处理功能按键
1.了解轮询和中断的关系
轮询 : CPU被绑定到检测的函数上,一直不断的调用
是非常消耗CPU资源
中断 : 在中断到来之前CPU可以处理任何事情,当中断到来之后
会打断CPU,CPU调用中断处理函数
2.介绍中断控制器
VIC : 向量中断控制器
NVIC : 可嵌套的向量中断控制器
GIC : 通用的中断控制器
一般来说VIC和NVIC是在单片机中使用的中断控制器
一般来说GIC是在高端芯片中使用的中断控制器
VIC和NVIC 相对于 GIC来说,在硬件上支持中断向量
NVIC 相对于 VIC来说,在硬件上支持中断嵌套
3.我们芯片上的中断控制器
在STM32F103RBT6芯片中使用的是NVIC
前提 :
有些手册会把NVIC画到ARM核心的内部
有些手册会把NVIC画到ARM核心的外部
有些手册会把NVIC画到紧贴着ARM核心
想要表达的含义就是NVIC和ARM核心是紧密相联的关系
NVIC和ARM-CORTEX-M3之间是紧密相联的关系
NVIC中断控制器会做两个操作
1)会为每一个连接到NVIC上的中断源分配一个中断号
2)处理优先级的问题
组优先级(抢占优先级)
子优先级(占先式优先级)
nvic
4.GPIO触发中断的方法
GPIO想要触发中断需要借助EXTI外设
EXTI叫做外部中断
EXTI仅仅是NVIC上的一个中断源而已
打开<STM32RBT6\DataSheet\STM32>目录下<STM32F10x中文参考手册.pdf>
P89 NVIC以及异常向量表
P91 EXTI的描述
每组GPIO的0号管脚可以触发EXTI0
每组GPIO的1号管脚可以触发EXTI1
...
每组GPIO的15号管脚可以触发EXTI15
----------------------------------------------------
已知KEY0按键使用的是PC9管脚,
将来GPIOC9管脚想要触发中断需要使用EXTI9
----------------------------------------------------
EXTI9只能由PC9触发吗?
也可以是PA9 PB9 PC9触发,需要通过 AFIO外设 进行选择
----------------------------------------------------
NVIC : 可嵌套的向量中断控制器
EXTI : 外部中断
EXTI仅仅是NVIC上的一个中断源而已
----------------------------------------------------
中断号是中断号,外部中断号是外部中断号,是不一样的
中断号 : 和异常向量表中异常处理函数的顺序有关
外部中断号 : 和GPIO的管脚编号有关
----------------------------------------------------
有些外部中断会自己享用一个中断号,有些外部中断会共用一个中断号
三.驱动外部中断
把轮询检测按键的程序修改成中断的方式
KEY0 PC9 EXTI9 上拉输入 下降沿触发
KEY1 PC8 EXTI8 上拉输入 下降沿触发
KEY2 PA0 EXTI0 下拉输入 上升沿触发
需要通过AFIO外设为外部中断选择触发的管脚
1.初始化eint
1)通过APB2总线使能GPIOC组和GPIOA组以及AFIO的时钟
(因为需要通过AFIO为外部中断选择触发的管脚)
2)初始化功能按键使用的GPIO管脚
1>把PC9 PC8管脚配置为上拉输入模式
2>把PA0管脚配置为下拉输入模式
3)为外部中断选择触发的管脚
1>为EXTI9选择由PC9触发
2>为EXTI8选择由PC8触发
3>为EXTI0选择由PA0触发
4)初始化NVIC
1>配置组优先级和子优先级的所占比例
2>选择中断号
3>使能该中断
4>配置组优先级的级别
5>配置子优先级的级别
优先级所占比例
5)初始化EXTI
1>选择外部中断号
2>使能该外部中断
3>选择中断的模式
4>选择触发的方式
============================
作业
1.把今天讲过的内容完完整整的复习一遍
2.把外部中断的项目工程重新搭建一遍
3.使用中断 + 消抖的方法实现按键开关的项目工程
============================