开发板芯片: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时钟,注意:模式设置为输入

  1. GPIO_InitTypeDef GPIO_InitStructure;
  2.  
  3. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);   //使能GPIOA,GPIOE时钟
  4.  
  5. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  6. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //普通输入模式
  7. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
  8. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
  9. GPIO_Init(GPIOE, &GPIO_InitStructure);

1.2.使能SYSCFG时钟。

  1. RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); //使能SYSCFG时钟,必须的

1.3.设置GPIO和中断线的映射关系

  1. SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource3); //PF3,中断线映射,line3-Pin3

1.4.中断初始化,包括设置触发方式,指定中断线,使能中断,设置中断模式等

  1. EXTI_InitTypeDef EXTI_InitStructure; //中断方式初始化
  2.  
  3. EXTI_InitStructure.EXTI_Line = EXTI_Line3; //指定中断线3
  4. EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能中断线
  5. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
  6. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发方式,必须的,上升沿不灵敏
  7. EXTI_Init(&EXTI_InitStructure);

1.5.中断分组和优先级设置

  1. NVIC_InitTypeDef NVIC_InitStructure; //优先级初始化
  2.  
  3. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断分组为2:2,优先级范围0-3
  4. NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //指定中断线3
  5. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //通道使能
  6. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0,可以设置0-3
  7. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级0,可以设置0-3
  8. NVIC_Init(&NVIC_InitStructure);

2.中断服务函数

中断初始化完毕后,就可以编写相应的中断服务函数了,我们使用的是中断线3,所以对应的中断服务函数名称为void EXTI3_IRQHandler(void),注意在执行完后要将标志位清零,

  1. void EXTI3_IRQHandler(void) //中断线3服务函数,发生中断时,自动执行
  2. {
  3. delay_ms(10); //消抖,很有必要,增加识别的准确度
  4. if(KEY1 == 0) //用EXTI_GetITStatus(EXTI_Line3)!=RESET来判断不是很灵敏,快速按时不准确
  5. LED0 = !LED0;
  6. EXTI_ClearITPendingBit(EXTI_Line3); //清除LINE3上的中断标志位,以备下一次使用
  7. }

根据手册可以通过EXTI_GetITStatus(EXTI_Line3)来判断中断标志位的状态,实际运行时发现这种方式并不是很有效,可能是我的用法不对吧!

这个中断服务函数还是很简单的,就是按下按键时,将LED的状态反转

3.主函数

主函数的执行部分可以不写,这里写了 LED 的闪烁用来指示程序的运行

  1. int main(void)
  2. {
  3. delay_init(168);
  4. LED_Init();
  5. IT_Init(); //中断初始化
  6. LED0_OFF;
  7. LED1_OFF;
  8. while(1)
  9. {
  10. LED1_ON;
  11. delay_ms(500); //LED1闪烁提醒程序运行状态
  12. LED1_OFF;
  13. delay_ms(500);
  14. }
  15. }

总结:

从以上过程可以看出STM32F4的外部中断的配置和使用方法还是很简单清晰的。虽然比51要复杂一些,但是毕竟功能那么强大,复杂一些也是可以理解的。

参考资料:

STM32F4xx中文参考手册

STM32F4开发指南-库函数版本_V1.1

以上是我学习过程的一些个人理解,有不对或不准确的地方,欢迎各位大神指正。

2017年4月17日22:01:43

欢迎大家关注我的个人博客

微信扫码关注我的公众号

不定期更新个人学习笔记和技术总结,欢迎大家互相学习交流!

STM32学习笔记(三)——外部中断的使用的更多相关文章

  1. STM32学习笔记(九) 外部中断,待机模式和事件唤醒

    学会知识只需要不段的积累和提高,但是如何将知识系统的讲解出来就需要深入的认知和系统的了解.外部中断和事件学习难度并不高,不过涉及到STM32的电源控制部分,还是值得认真了解的,在本文中我将以实际代码为 ...

  2. stm32寄存器版学习笔记03 外部中断

    stm32的每个I/O口都可以作为中断输入,要把I/O口设置为外部中断输入,必须将I/O口设置为上拉/下拉输入 或 浮空输入(但浮空的时候外部一定要带上拉或下拉电阻,否则可能导致 中断不停的触发),干 ...

  3. STM32学习笔记(三) STM32的GPIO的深入学习

    STM32的开发学习主要涉及软硬件两个部分的实现,包含众多外设和总线的理解配置.STM32的整个学习曲线并不陡峭,但入门却相当困难,因此在学习之初,多动手实验和测试相当重要,GPIO作为整个STM32 ...

  4. stm32学习笔记——外部中断的使用

    stm32学习笔记——外部中断的使用 基本概念 stm32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组为一个单位的,同组间的外部中断同一时间只能使用一个.比如说,PA0,PB0 ...

  5. STM32学习笔记(四)——串口控制LED(中断方式)

    目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类 ...

  6. STM32学习笔记-NVIC中断知识点

    STM32学习笔记-NVIC中断知识点总结 中断优先级设置步骤 1. 系统运行后先设置中断优先级分组 函数:void NVIC_PriorityGroupConfig(uint32_tNVIC_Pri ...

  7. STM32学习笔记——OLED屏

    STM32学习笔记--OLED屏 OLED屏的特点: 1.  模块有单色和双色可选,单色为纯蓝色,双色为黄蓝双色(本人选用双色): 2.  显示尺寸为0.96寸 3.  分辨率为128*64 4.   ...

  8. stm32学习笔记----双串口同时打开时的printf()问题

    stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...

  9. angular学习笔记(三十一)-$location(2)

    之前已经介绍了$location服务的基本用法:angular学习笔记(三十一)-$location(1). 这篇是上一篇的进阶,介绍$location的配置,兼容各版本浏览器,等. *注意,这里介绍 ...

  10. iView学习笔记(三):表格搜索,过滤及隐藏列操作

    iView学习笔记(三):表格搜索,过滤及隐藏某列操作 1.后端准备工作 环境说明 python版本:3.6.6 Django版本:1.11.8 数据库:MariaDB 5.5.60 新建Django ...

随机推荐

  1. perl 之eval

    eval是个表达式,语句末尾有一个分号, 发现在它的监视范围内出现致命错误,会立即停止运行整个块,退出后继续运行其 余的代码   eval的返回值就是语句块最后一条表达式的执行结果   eval非正常 ...

  2. if(){}else 语句的正确写法以及它的嵌套使用

    if(一个返回bool值的条件表达式) { 程序块 } else{} 它的执行过程我们可以通过一个程序来了解 static void Main(string[] args) { ) // 条件1 { ...

  3. jquery 中时间的运用

    运用Moment插件比较方面,有兴趣可以仔细阅读 http://momentjs.cn/

  4. 3018: [Usaco2012 Nov]Distant Pastures

    3018: [Usaco2012 Nov]Distant Pastures Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 43  Solved: 20[ ...

  5. C++ 容器对象vector和list 的使用

    在<<c++ primer>>第四版Exercise Section 9.3.4 的Exercise 9.20 是这样的一道题目:编写程序判断一个vector<int&g ...

  6. Gridview AutoGenerateColumns属性

    第一篇随笔,以后会陆续的把刚开始工作时的知识点都记录下来,毕竟现在用WebForm的不多了~ AutoGenerateColumns MSDN 说明 : 获取或设置一个值,该值指示是否为数据源中的每个 ...

  7. 通过Servlet生成验证码图片

    原文出自:http://www.cnblogs.com/xdp-gacl/p/3798190.html 一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类, ...

  8. linux 私房菜 CH6 Linux 的档案权限与目录配置

    查看文件属性 ls -al 第一栏:类型与权限 d:目录: -:档案: l:链接档: b:可随机存取装置: c:一次性存取装置: 第二栏:有多少档名连结到此节点 第三栏:拥有者 第四栏:所属群组 第五 ...

  9. ORM映射设计思想

    using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; usin ...

  10. yii2邮件配置教程,报Expected response code 250 but got code "553"原因

    main.php(或main-local.php)中的邮件配置如下: 'mailer' => [ 'class' => 'yii\swiftmailer\Mailer', 'viewPat ...