当前位置:网站首页>【STM32】入门(四):外部中断-按键通过中断动作
【STM32】入门(四):外部中断-按键通过中断动作
2022-08-03 03:28:00 【郭老二】
1、简述
中断,也叫异常。
1.1 系统异常
在源码文件stm32f4xx.h中有定义,F4系列(Cortex-M4)中有8个系统异常
NonMaskableInt_IRQn = -14, /* 不可屏蔽中断,RCC时钟安全系统连接到NMI向量 */
MemoryManagement_IRQn = -12, /* Cortex-M4内存管理中断 */
BusFault_IRQn = -11, /* Cortex-M4总线故障中断,预取指令失败,存储器访问失败 */
UsageFault_IRQn = -10, /* Cortex-M4使用故障中断,未定义的指令或非法状态 */
SVCall_IRQn = -5, /* 通过SWI指令调用的系统服务 */
DebugMonitor_IRQn = -4, /* Cortex-M4调试监视器中断 */
PendSV_IRQn = -2, /* Cortex-M4可挂起的系统服务 */
SysTick_IRQn = -1, /* Cortex-M4系统滴答定时器 */
1.2 外部中断
本人使用F407,外部中断共有81个,如下,在stm32f4xx.h中有定义:
WWDG_IRQn = 0, /* 窗口看门狗中断 */
PVD_IRQn = 1, /* PVD通过EXTI线路检测中断 */
...
DMA1_Stream6_IRQn = 17, /*!< DMA1 Stream 6 global Interrupt */
ADC_IRQn = 18, /*!< ADC1, ADC2 and ADC3 global Interrupts */
#if defined (STM32F40_41xxx)
CAN1_TX_IRQn = 19, /*!< CAN1 TX Interrupt */
...
FPU_IRQn = 81 /*!< FPU global interrupt */
#endif /* STM32F40_41xxx */
包括:看门狗、RTC、CAN读写、GPIO、I2C、串口、SPI、DMA、ETH等相关中断
1.3 NVIC嵌套向量中断控制器
NVIC嵌套向量中断控制器,就是集中控制各个中断。使用中断时,先在NVIC中配置,再在各个具体项中配置,等于打开两个阀门。它有16 个可编程优先级
1.4 外部中断/ 事件控制器 (EXTI)
EXTI 控制器的主要特性如下:
● 每个中断/事件线上都具有独立的触发和屏蔽
● 每个中断线都具有专用的状态位
● 支持多达 23 个软件事件/中断请求
EXTI 线0~EXTI 线 15连接在140 个 GPIO上,另外七根 EXTI 线连接方式如下:
● EXTI 线 16 连接到 PVD 输出
● EXTI 线 17 连接到 RTC 闹钟事件
● EXTI 线 18 连接到 USB OTG FS 唤醒事件
● EXTI 线 19 连接到以太网唤醒事件
● EXTI 线 20 连接到 USB OTG HS(在 FS 中配置)唤醒事件
● EXTI 线 21 连接到 RTC 入侵和时间戳事件
● EXTI 线 22 连接到 RTC 唤醒事件
2、外部中断EXTI
步骤
- 设置优先级分组
- 查询外部中断线
- 根据中断线查询向量表中中断处理函数名
- 设置EXTI外部中断:中断线、触发模式、中断/事件选择、使能中断线
- 设置NVIC嵌套向量中断控制器:中断通道、抢占优先级、子优先级、使能外部中断通道
2.1 主函数
int main(void)
{
u8 t=0;
#a)设置系统中断优先级分组为2,固件库函数,不再进一步分析
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init(); //延时函数初始化
LED_Init(); //LED初始化
#b)初始化外部中断输入
EXTIX_Init();
#c)主任务:LED2 1秒闪烁一次提示系统正在运行
while(1) {
if(t==200) {
LED2=!LED2;
t=0;
}
t++;
delay_ms(5);
}
}
2.2 EXTIX_Init外部中断初始化
外部中断初始化:需要配置NVIC嵌套向量中断控制器 和 EXTI外部中断,等于要打开两个“阀门”
void EXTIX_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
KEY_Init(); //按键对应的IO口初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource6);//PF6 连接到中断线6
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource7);//PF7 连接到中断线7
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource8);//PF8 连接到中断线8
// 配置外部中断线 EXTI_Line6,7,8,9
EXTI_InitStructure.EXTI_Line = EXTI_Line6 | EXTI_Line7 | EXTI_Line8;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断事件
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //中断线使能
EXTI_Init(&EXTI_InitStructure);//配置
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //外部中断5-9 刚好 PF6-8 在 EXTI9_5_IRQn 里面
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
NVIC_Init(&NVIC_InitStructure);//配置
}
2.3 外部中断/ 事件线
如下图所示,EXTI_Line0连接着PA0~PI0、EXTI_Line1连接着PA1-PI1…
所以PF6、PF7、PF8分别在外部中断/ 事件线EXTI_Line6、EXTI_Line7、EXTI_Line8上
2.4 查询中断向量表
在startup_stm32f40_41xxx.s中
__Vectors DCD __initial_sp ; Top of Stack
...
DCD EXTI9_5_IRQHandler ; External Line[9:5]s
Default_Handler PROC
...
EXPORT EXTI9_5_IRQHandler [WEAK]
这三个中断线EXTI_Line6、EXTI_Line7、EXTI_Line8,刚好在 EXTI9_5_IRQn 里面
2.5 重写中断函数
void EXTI9_5_IRQHandler(void)
{
delay_ms(10); //消抖
if(KEY0==0) //当按键按下后就是IO从高电平变为低电平触发外部中断
{
EXTI_ClearITPendingBit(EXTI_Line6); //清除LINE6上的中断标志位 KEY0 对应IO口PF6
}
if(KEY1==0) //当按键按下后就是IO从高电平变为低电平触发外部中断
{
LED0=0; //LED0亮
EXTI_ClearITPendingBit(EXTI_Line7); //清除LINE7上的中断标志位 KEY1 对应IO口PF7
}
if(KEY2==0) //当按键按下后就是IO从高电平变为低电平触发外部中断
{
LED1=0; //LED1亮
EXTI_ClearITPendingBit(EXTI_Line8); //清除LINE8上的中断标志位 KEY2 对应IO口PF8
}
}
边栏推荐
猜你喜欢
如何画一张架构图(内含知识图谱)
高等代数_证明_不同特征值的特征向量线性无关
05-分布式计算框架
JWT入门学习
HI3521D 烧录128M nand flash文件系统过程-一定要注意flash的容量
浅谈用KUSTO查询语言(KQL)在Azure Synapse Analytics(Azure SQL DW)审计某DB账号的操作记录
JS高级 之 Proxy-Reflect 使用详解
Auto.js Pro 编写第一个脚本hello world
PyTorch installation - error when building a virtual environment in conda before installing PyTorch
【基础数学--埃氏筛】204. 计数质数
随机推荐
Ask next useful SQL server flink - SQL - connector - essentially a CDC - 2
银微转债,洁特转债上市价格预测
【obs】启动推流失败 : Output.StartStreamFailed 调用流程
Sentinel vs Hystrix 限流对比,到底怎么选?
【每日一题】622. 设计循环队列
C语言——-动态内存开辟与管理(malloc,free,calloc,realloc)+柔性数组
voliate关键字
C语言实验十三 指针(三)
TRACE32——使用读写断点
高等代数_证明_矩阵乘以自身的转置的特征值不小于0
List<Object>转List<User>:
【 original 】 Auto. Js the get and post case
【leetcode热题Hot100】——任务调度器
Summary of some questions about the grain mall
synchronized原理
Pro * C Jin Cang database migration guide (4) KingbaseES Pro * C migration guide)
机器学习【KNN案例、API、总结】
Jincang Database OCCI Migration Guide (5. Program Development Example)
【数据分析】基于MATLAB实现SVDD决策边界可视化
如何画一张架构图(内含知识图谱)