STM32学习笔记(三)——外部中断的使用
开发板芯片:STM32F407ZGT6
硬件连接:PE3-KEY1
一、STM32F4的中断介绍
STM32F4的每个IO都可以作为外部中断输入,很强大的功能吧!以前学习的51只有两个外部中断。
STM32F4的中断控制器支持22个外部中断/事件请求:
EXTI线0~15:对应外部IO口的输入中断。即GPIOx.0—EXTI0,GPIOx.a—EXTIa如下图所示
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唤醒事件。
对于每个中断线0我们可以设置相应的触发方式(上升沿触发,下降沿触发,边沿触发)以及使能。
中断服务函数又是如何分配的呢?
其中中断线0-4有单独的中断向量,即单独的中断服务函数。
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
中断线5-9共用一个中断服务函数
EXTI9_5_IRQHandler
中断线10-15共同一个中断服务函数
EXTI15_10_IRQHandler
二、中断优先级的管理
嵌套向量中断控制器NVIC (Nested vectored interrupt controller)
中断优先级分组的是在SCB->AIRCR寄存器中设置的,具体设置情况如下:
选择不同的分组可以设置不同的优先级等级,例如选择分组2,分配结果为2位抢占,2位响应,既然是两位,所以优先级可以设置为0-3,要注意的是,设置好分组之后不要再改变分组,随意改变分组会导致中断管理混乱。
关于抢占优先级和响应优先级的说明
- 高优先级的抢占优先级可以打断正在进行的低抢占优先级中断的。
- 抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。
- 抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。
- 如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;
例如:
这里要注意的是,抢占优先级设置的越小,则优先级越高,0最高
则这三个优先级的顺序为:中断7>中断3>中断6。
三、程序设计
1.初始化PF3中断,即EXTI3中断的过程:
1.1.使能GPIO时钟,注意:模式设置为输入
GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); //使能GPIOA,GPIOE时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //普通输入模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉GPIO_Init(GPIOE, &GPIO_InitStructure);
1.2.使能SYSCFG时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); //使能SYSCFG时钟,必须的
1.3.设置GPIO和中断线的映射关系
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource3); //PF3,中断线映射,line3-Pin3
1.4.中断初始化,包括设置触发方式,指定中断线,使能中断,设置中断模式等
EXTI_InitTypeDef EXTI_InitStructure; //中断方式初始化EXTI_InitStructure.EXTI_Line = EXTI_Line3; //指定中断线3EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能中断线EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发方式,必须的,上升沿不灵敏EXTI_Init(&EXTI_InitStructure);
1.5.中断分组和优先级设置
NVIC_InitTypeDef NVIC_InitStructure; //优先级初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断分组为2:2,优先级范围0-3NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //指定中断线3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //通道使能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0,可以设置0-3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级0,可以设置0-3NVIC_Init(&NVIC_InitStructure);
2.中断服务函数
中断初始化完毕后,就可以编写相应的中断服务函数了,我们使用的是中断线3,所以对应的中断服务函数名称为void EXTI3_IRQHandler(void),注意在执行完后要将标志位清零,
void EXTI3_IRQHandler(void) //中断线3服务函数,发生中断时,自动执行
{delay_ms(10); //消抖,很有必要,增加识别的准确度if(KEY1 == 0) //用EXTI_GetITStatus(EXTI_Line3)!=RESET来判断不是很灵敏,快速按时不准确LED0 = !LED0;EXTI_ClearITPendingBit(EXTI_Line3); //清除LINE3上的中断标志位,以备下一次使用
}
根据手册可以通过EXTI_GetITStatus(EXTI_Line3)来判断中断标志位的状态,实际运行时发现这种方式并不是很有效,可能是我的用法不对吧!
这个中断服务函数还是很简单的,就是按下按键时,将LED的状态反转
3.主函数
主函数的执行部分可以不写,这里写了 LED 的闪烁用来指示程序的运行
int main(void)
{delay_init(168);LED_Init();IT_Init(); //中断初始化LED0_OFF;LED1_OFF;while(1){LED1_ON;delay_ms(500); //LED1闪烁提醒程序运行状态LED1_OFF;delay_ms(500);}
}
总结:
从以上过程可以看出STM32F4的外部中断的配置和使用方法还是很简单清晰的。虽然比51要复杂一些,但是毕竟功能那么强大,复杂一些也是可以理解的。
参考资料:
STM32F4xx中文参考手册
STM32F4开发指南-库函数版本_V1.1
以上是我学习过程的一些个人理解,有不对或不准确的地方,欢迎各位大神指正。
2017年4月17日22:01:43
欢迎大家关注我的个人博客
微信扫码关注我的公众号
不定期更新个人学习笔记和技术总结,欢迎大家互相学习交流!
STM32学习笔记(三)——外部中断的使用相关推荐
- STM32学习笔记——EXTI外部中断,光敏传感器控制LED灯
中断系统 中断:在主程序运行过程中,当出现了特定的中断触发条件,CPU就可以暂停当前正在运行的程序去处理中断程序,并把当前程序的地址压入堆栈,中断程序处理完成后把地址弹出堆栈,回到刚刚暂停的位置继续执 ...
- STM32入门笔记03_EXTI外部中断详解+案例:红外对射计数、旋转编码器计数
EXTI外部中断 中断的相关概念 中断源: 可以引起中断的事件称为中断源 中断: 在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成 ...
- hal库开启中断关中断_stm32的HAL库开发学习笔记之外部中断
外部中断 中断线----EXTI线0~15(对应外部IO口的输入中断) 每个IO口都可以作为外部中断输入 每个中短线可以独立的配置触发方式(上升沿,下降沿,双边沿),触发/屏蔽,专用状态位. GPIO ...
- S32K系列S32K144学习笔记——GPIO外部中断
一用S32K144苦似海,道友,能不用,千万不去用. 本例程基以下如图所示接口操作,MCU为S32K144,开发平台S32DSworkspace 功能描述:检测信号输入,如有低电平信号输入,则亮灯,无 ...
- STM32学习笔记(三) STM32的GPIO的深入学习
STM32的开发学习主要涉及软硬件两个部分的实现,包含众多外设和总线的理解配置.STM32的整个学习曲线并不陡峭,但入门却相当困难,因此在学习之初,多动手实验和测试相当重要,GPIO作为整个STM32 ...
- stm32学习笔记 TIM定时器中断1.定时器基本定时功能(含代码)
TIM定时器分四个部分 目录 一.定时器基本定时功能 二.定时器输出比较功能 三.定时器输入捕获功能 四.定时器编码接口 一.定时器基本定时功能 RCC时钟树 SystmInit函数 外部晶振出问题会 ...
- STM8L探索套件学习笔记-EXTI外部中断
http://blog.chinaunix.net/uid-23085164-id-3534045.html
- STM32学习笔记(三)丨中断系统丨EXTI外部中断(对射式红外传感器计次、旋转编码器计次)
本篇文章包含的内容 一.中断系统 1.1 中断的定义 1.2 中断优先级 1.3 中断的嵌套 1.4 STM32中的中断系统 1.4.1 STM32的中断资源 1.4.2 嵌套中断向量控制器 NVIC ...
- 【STM32学习笔记】(13)——外部中断详解
EXTI 简介 EXTI(External interrupt/event controller)-外部中断/事件控制器,管理了控制器的 20 个中断/事件线.每个输入线可以独立地配置 ...
- STM32学习笔记(四)丨TIM定时器及其应用(定时中断、内外时钟源选择)
本篇文章包含的内容 一.TIM 定时器 1.1 TIM 定时器简介 1.2 TIM 定时器类型及其工作原理简介 1.2.1 基本定时器工作原理及其结构 1.2.2 通用定时器工作原理及其结构 1.2. ...
最新文章
- 保留两位小数除法算式_北师大|五年级上册|第一周周测·小数除法(1)
- mac 搭建python+selenium+chromedriver环境
- Asp.net的Session和Cookie传值方式
- curl提示不支持https协议解决方法
- polkit 重新安装_CentOS Linux 7.4中polkit服务启动失败
- Solr vs ElasticSearch,搜索技术哪家强
- Redis学习手册(String数据类型)
- 多个服务器数据互通_5月23日部分服务器数据互通公告!
- php汉字组合算法,php数字转汉字的函数算法
- 【跳频通信】基于matlab跳频通信系统仿真【含Matlab源码 967期】
- C语言—贪吃蛇双人对战
- .Net平台下安装DotNetBar
- Instant及LocalDateTime等使用方法
- 标准化、归一化等的适用范围
- 一文讲清楚什么是类型化数组、ArrayBuffer、TypedArray、DataView等概念
- So easy 将程序部署到服务器
- 什么是视频比特率:完整指南
- 【AE2019】Adobe_After_Effects_2019软件下载及安装教程
- Chapter 6-Blurring Things Up之Using Alpha Channel
- 华为电脑可以升级鸿蒙系统吗,华为电脑现在是鸿蒙系统吗_华为p40升级鸿蒙系统...
热门文章
- HDU 1808 Halloween treats (鸽巢原理)(数学)
- CStdioFile 一些基本用法
- windows清理_Windows清理C盘的常用方法
- 全国计算机建模三等奖,青春榜样 | 吴昊 : 守得云开见月明
- 基于Aforge的物体运动识别-入门篇
- 字符串分割(split),将字符串按照指定字符进行分割。split(String regex)和split(String regex, int limit)
- 2019计算机电源海关征税,注意!2019海关严打:回国入境这些东西千万别带了!!...
- ConcurrentHashMap学习
- HackingLab的一套渗透测试题
- GeoHash 的编码方法