断断续续学习STM32一学期了,时间过的好快,现在对STM32F103系列单片机的中断嵌套及外部中断做一个总结,全当学习笔记。废话不多说,ARM公司的Cortex-m3 内核,支持256个中断,其中包含16个内核中断和240个外部中断,并且具有256级的可编程中断设置。在ST公司的STM32单片机中最多有84个中断,包括16个内核中断(这16个内部中断是任何半导体商也改不了的),和68个可屏蔽中断,具有16级可编程的中断优先级。但是在STM32F103系列中只有60个可屏蔽中断,(107系列有68个)。

针对这60个可屏蔽中断,重点掌握它的一个中断优先级寄存器组IPR,全称Interrupt Priority Registers。这个寄存器组包含15个32位的寄存器,一个可屏蔽中断占用8bit,那么一个寄存器可以控制4个可屏蔽中断,一共15*4=60。然而在这占用的8bit中又只使用了高4bit,这高4bit的分配才是STM32F103系列单片机中断嵌套的设置所在。STM32F103系列的中断嵌套分为5个组,分别是0、1、2、3、4  这5个组,下面是5个组与中断嵌套的对应关系。

分配结果
0
0位抢占优先级,4位响应优先级
1
1位抢占优先级,3位响应优先级
2
2位抢占优先级,2位响应优先级
3
3位抢占优先级,1位响应优先级
4
4位抢占优先级,0位响应优先级

对于抢占优先级和响应优先级,只需记住两点,第一、抢占任何优先级比都比所有响应优先级优先级高。只有抢占优先级更高的具有中断嵌套功能。(即打断其他正在执行的中断)。第二、数字越小优先级越高 ,抢占优先级和响应优先级都一样时,首先响应中断通道对应中断向量地址低的那个中断。

下面对0组和1组的情况做一个分析。
0组对应是0位抢占优先级,4位响应优先级,那么无抢占优先级,响应优先级可设置为0到15级(2的4次方种)中的任意一种。
1组对应是1位抢占优先级,3位响应优先级,那么抢占优先级只可设置为0级或者1级中的任意一种(2的1次方种),响应优先级可设置为0到7级(2的3次方种)中的任意一种。
上电复位时,中断配置为4组,并且60个外部中断都是抢占优先级为0级,无响应优先级。

总结一下:

  1. 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。
  2. 抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。
  3. 抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。
  4. 如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行。

所以可以看出判断两个中断的优先级时先看抢占优先级的高低,如果相同再看响应优先级的高低。如果全都相同最后看中断通道向量地址。
一般来说在使用过程中,一个系统使用一个组别就完全可以满足需要。所以在使用一个组别后一般不要在系统中再改动组别,骨灰级玩家可以去试试(小心芯片烧了)。

外部中断:
STM32F103的外部中断EXTI支持19个外部中断/事件请求。每个中断/事件都有独立的触发和屏蔽设置。
0到15线:对应外部I/O口输入中断
线16:接到PVD输出
线17:接到RCT闹钟事件
线18:接到USB唤醒事件
线16到线18我自己都没用过,主要对线0到15的I/O输入中断做一个总结,有个注意的地方是这0到15线的外部中断,其中0到4线,这5个外部中断都有自己单独的中断响应函数。5到9线公用一个中断服务函数,10到15线公用一个中断服务函数。
外部中断配置寄存器组EXTICR包含4个32位的寄存器,分别是EXTICR0、EXTICR1、EXTICR2、EXTICR3、但每一个寄存器只用了低16位,每4位控制一个I/O口,一个寄存器控制4个I/O口,EXTICR寄存器组控制16个I/O口,刚好一个GPIO的I/O口数。下面以 EXTICR0为例,用一个表格表示:

I/O口3
I/O口2
I/O口1
I/O口0
0000    GPIOA
0000    GPIOA
0000    GPIOA
0000    GPIOA
0001    GPIOB
0001    GPIOB
0001    GPIOB
0001    GPIOB
0010    GPIOC
0010    GPIOC
0010    GPIOC
0010    GPIOC
0011    GPIOD
0011    GPIOD
0011    GPIOD
0011    GPIOD
0100    GPIOE
0100    GPIOE
0100    GPIOE
0100    GPIOE
0101    GPIOF
0101    GPIOF
0101    GPIOF
0101    GPIOF
0110    GPIOG
0110    GPIOG
0110    GPIOG
0110    GPIOG

比如配置GPIOA.0就是将EXTICR0的低4位配置成0000,若配置GPIOB.1就是配置EXTICR0的4到7位,为0001。
这里有一个问题,如果要配置GPIOA.0和GPIOB.0,会引起冲突,不知道是不是分时配置解决的。我用的固体库的方式,不需要考虑这些,呵呵。注意使用固件库时中断复位函数是写在stm32f10x_it.c这个文件里的。

下面结合外部中断附上固件库版本的程序:

主函数里:

void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitSructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);          //设置为优先级组2NVIC_InitSructure.NVIC_IRQChannel = EXTI15_10_IRQn;       //定义外部中断线13中断通道
NVIC_InitSructure.NVIC_IRQChannelPreemptionPriority = 0;        //抢占优先级0
NVIC_InitSructure.NVIC_IRQChannelSubPriority = 0;                       //响应优先级0
NVIC_InitSructure.NVIC_IRQChannelCmd = ENABLE;                               //使能指定通道
NVIC_Init(&NVIC_InitSructure);                                                                      NVIC_InitSructure.NVIC_IRQChannel = EXTI15_10_IRQn;        //定义外部中断线15中断通道
NVIC_InitSructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitSructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitSructure.NVIC_IRQChannelCmd = ENABLE;                               //使能指定通道
NVIC_Init(&NVIC_InitSructure);NVIC_InitSructure.NVIC_IRQChannel = EXTI0_IRQn;        //定义外部中断线0中断通道
NVIC_InitSructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitSructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitSructure.NVIC_IRQChannelCmd = ENABLE;                               //使能指定通道
NVIC_Init(&NVIC_InitSructure);}void EXTI_Configuration(void)
{       EXTI_InitTypeDef EXTI_InitStructure;                                                    //初始化结构GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource13);  //指明当前哪个引脚为外部中断触发引脚GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource15);EXTI_ClearITPendingBit(EXTI_Line13);                                      //清除中断标志位 EXTI_Line13对应相应的中断线13EXTI_ClearITPendingBit(EXTI_Line15);EXTI_InitStructure.EXTI_Mode =EXTI_Mode_Interrupt;                            //选择中断模式请求EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;                    //下降沿触发EXTI_InitStructure.EXTI_Line = EXTI_Line13|EXTI_Line15;  // 选择待使能的外部中断线EXTI_InitStructure.EXTI_LineCmd = ENABLE;                                                        // 定义选中线的新状态  使能EXTI_Init(&EXTI_InitStructure);                     //把EXIT_InitStructure中的每一个参数按缺省值填入GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);     //指明当前哪个引脚为外部中断触发引脚EXTI_ClearITPendingBit(EXTI_Line0);  EXTI_InitStructure.EXTI_Mode =EXTI_Mode_Interrupt;                            //选择中断模式请求EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;                    //上升沿触发EXTI_InitStructure.EXTI_Line = EXTI_Line0;            // 选择待使能的外部中断线EXTI_InitStructure.EXTI_LineCmd = ENABLE;                                                        // 定义选中线的新状态  使能EXTI_Init(&EXTI_InitStructure);                     //把EXIT_InitStructure中的每一个参数按缺省值填入}stm32f10x_it.c这个文件里
void EXTI15_10_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line13)!=RESET){               GPIO_WriteBit( GPIOA,GPIO_Pin_8,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8))); //LED0翻转EXTI_ClearITPendingBit(EXTI_Line13);}if(EXTI_GetITStatus(EXTI_Line15)!=RESET){               GPIO_WriteBit( GPIOD,GPIO_Pin_2,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_2))); //LED0翻转EXTI_ClearITPendingBit(EXTI_Line15);  }}void EXTI0_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line0)!=RESET)
{ GPIO_WriteBit( GPIOA,GPIO_Pin_8,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8))); //LED0翻转GPIO_WriteBit( GPIOD,GPIO_Pin_2,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_2))); //LED0翻转EXTI_ClearITPendingBit(EXTI_Line0);
}
}

转载于:https://www.cnblogs.com/ljxh/p/8807269.html

【转-Andrew_qian】stm32中断嵌套全攻略相关推荐

  1. [RHEL5企业级Linux服务攻略]--第3季 DHCP服务全攻略

    1 DHCP原理  1.1 DHCP概述 DHCP(Dynamic Host Configuration Protocal)就是动态主机配置协议哈,可以自动配置主机的IP地址.子网掩码.网关及DNS等 ...

  2. iSCSI存储技术全攻略

    什么是iSCSI iSCSI(iSCSI = internet Small Computer System Interface )是由IEETF开发的网络存储标准,目的是为了用IP协议将存储设备连接在 ...

  3. Gradle脚本基础全攻略

    转载http://blog.csdn.net/yanbober/article/details/49314255 [工匠若水 http://blog.csdn.net/yanbober 转载请注明出处 ...

  4. 用C#制作PDF文件全攻略(转)

    PDF文件是目前比较流行的电子文档格式,在办公自动化(OA)等软件的开发中,经常要用到该格式,但介绍如何制作PDF格式文件的资料非常少,在网上搜来搜去,都转贴的是同一段"暴力"破解 ...

  5. wifi软件linux版本,[转载]Wii安装运行可用WIFI的Linux系统全攻略

    Wii运行Linux的优势: 低功耗,Wii玩3D游戏的平均功耗在18W,而运行linux的功耗更低,连续运行50天才耗一度电(甚至不到).如果用Wii来下电驴.如果给wii-linux装上图形界面来 ...

  6. 用C# itextsharp.dll制作PDF文件全攻略

    StreamWriter pPDF=new StreamWriter(filePath); ArrayList xRefs=new ArrayList(); float yPos =0f; long ...

  7. 用C#制作PDF文件全攻略 (专至csdn)

    前 言 丽水市汽车运输集团有限公司信息中心 苟安廷 PDF文件是目前比较流行的电子文档格式,在办公自动化(OA)等软件的开发中,经常要用到该格式,但介绍如何制作PDF格式文件的资料非常少,在网上搜来搜 ...

  8. 用C#製作PDF文件全攻略

    PDF文件是目前比較流行的電子文檔格式,在辦公自動化(OA)等軟件的開發中,經常要用到該格式,但介紹如何製作PDF格式文件的資料非常少,在網上搜來搜去,都轉貼的是同一段「暴力」破解的方法,代碼片斷如下 ...

  9. 万能Ghost全攻略(最详细完整的教程)

    万能Ghost全攻略(最详细完整的教程) 一.运行 Sysprep 工具的要求      要使用 Sysprep 工具,计算机的硬件和相关设备必须满足下列要求: 1. 参考计算机和目标计算机必须具有兼 ...

最新文章

  1. python windows错误码
  2. 用 eclipse SVN 插件共享项目
  3. Java之旅(二)--- ServletContext
  4. keil编译时提示 Undefined symbol __ROR
  5. 面试题leetcode 3. 无重复字符的最长子串 暴力法和滑动窗口解法
  6. 线性结构(顺序存储和链式存储)和非线性结构的特点及区别
  7. golang微服务框架对比_Go语言开发的微服务框架,你了解多少?
  8. 剑指offer 面试题62. 圆圈中最后剩下的数字
  9. 使用GSM6315模块,采用http或者https协议与服务器通信笔记
  10. 邓俊辉数据结构与算法学习笔记-第四章
  11. Python爬虫入门-python之jieba库制作词云图
  12. 设计模式----仲裁者模式(Mediator Pattern)例题
  13. 一文读懂 HTTPS 与 TLS证书链校验
  14. 停止win10自动更新
  15. android判断是否json格式,简单方法判断字符串是否是json字符串
  16. 你在日常的测试工作中遇到过哪些困境呢?
  17. 利用FFmpeg编码器将JPG图片进行H.264编码原理
  18. elasticSearch常见问题答疑
  19. 威学一百_威学一百app下载-威学一百官网版下载v1.0.0_MDPDA手机网
  20. CodeVs 1148 传球游戏

热门文章

  1. 一段.net 发邮件的代码
  2. WMPLib.WindowsMediaPlayer 的用法
  3. 【Java从0到架构师】Zookeeper 应用 - Java 客户端操作、服务器动态感知、分布式锁业务处理
  4. shell脚本 获取第几行 第几列 的命令 awk sed
  5. SpringAs3的一些配置参数
  6. 安卓用targetSdk来兼容各个版本
  7. 帧间差分法python代码_图像处理算法之帧间差分法
  8. anaconda如何装python_如何在已安装Python条件下,安装Anaconda,,并将原有Python添加到Anaconda中...
  9. php中怎样创建数据库服务器,实例讲解通过​PHP创建数据库
  10. python中xpath如何获取内容_python requests + xpath 获取分页详情页数据存入到txt文件中...