当前位置:网站首页>【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
}
}
边栏推荐
- Pro * C Jin Cang database migration guide (4) KingbaseES Pro * C migration guide)
- 浅谈用KUSTO查询语言(KQL)在Azure Synapse Analytics(Azure SQL DW)审计某DB账号的操作记录
- nVisual信息基础设施可视化管理
- voliate关键字
- 【基础数学--埃氏筛】204. 计数质数
- 金仓数据库 Pro*C 迁移指南( 5. 程序开发示例)
- 云原生(三十一) | Kubernetes篇之平台基本预装资源
- Have bosses know date field flinksql is synchronized to the use of the null on how to deal with
- 【leetcode热题Hot100】——任务调度器
- ESP8266-Arduino编程实例-MAX6675冷端补偿K热电偶数字转换器驱动
猜你喜欢
软件测试个人求职简历该怎么写,模板在这里
AF-DNAT
Best Practices for Migration from Jincang Database from MySQL to KingbaseES (3. MySQL Database Migration Practice)
智能健身动作识别:PP-TinyPose打造AI虚拟健身教练!
ClickHouse—入门
Kotlin multiplication, how do I multiply smaller and smaller?
基于 Cyclone IV 在 Quartus 中配置 IP 核中的 PLL、RAM 与 FIFO 的详细步骤及仿真验证
PyTorch installation - error when building a virtual environment in conda before installing PyTorch
Base64编码原理
金仓数据库 Pro*C 迁移指南( 4. KingbaseES 的 Pro*C 迁移指南)
随机推荐
Chinese valentine's day??To the liver is the way!!!!!Auto. Js special position control method
IDEA如何创建父子工程
谷粒商城一些疑问总结
【TA-霜狼_may-《百人计划》】美术2.5 模型常见问题及规范
基于flowable的upp(统一流程平台)运行性能优化(3)
leetcode:152. 乘积最大子数组
log4j设置日志的时区
sql问题,如何能做到先声明表的名称,例如product202201,表示2022年一月份的货物表,再在声明过的表中查找,下面的代码运行时有错误显示找不到表table_name,请问改如何进行修改
一文了解SAP IBP是什么?
Auto.js Pro 编写第一个脚本hello world
数字3d虚拟交互展厅顺应时代发展需求和趋势
怎么用redis限制同一ip重复刷浏览量
Jincang Database Pro*C Migration Guide ( 5. Program Development Example)
els 消除行
nVisual信息基础设施可视化管理
ClickHouse数据类型
JWT入门学习
(一)Nacos注册中心集群环境搭建
重定向printf到USB CDC、串口2
用 SQL 做数据分析的十大常用功能,附面试原题解答!!