【转-Andrew_qian】stm32中断嵌套全攻略
断断续续学习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级,无响应优先级。
总结一下:
- 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。
- 抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。
- 抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。
- 如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行。
所以可以看出判断两个中断的优先级时先看抢占优先级的高低,如果相同再看响应优先级的高低。如果全都相同最后看中断通道向量地址。
一般来说在使用过程中,一个系统使用一个组别就完全可以满足需要。所以在使用一个组别后一般不要在系统中再改动组别,骨灰级玩家可以去试试(小心芯片烧了)。
外部中断:
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中断嵌套全攻略相关推荐
- [RHEL5企业级Linux服务攻略]--第3季 DHCP服务全攻略
1 DHCP原理 1.1 DHCP概述 DHCP(Dynamic Host Configuration Protocal)就是动态主机配置协议哈,可以自动配置主机的IP地址.子网掩码.网关及DNS等 ...
- iSCSI存储技术全攻略
什么是iSCSI iSCSI(iSCSI = internet Small Computer System Interface )是由IEETF开发的网络存储标准,目的是为了用IP协议将存储设备连接在 ...
- Gradle脚本基础全攻略
转载http://blog.csdn.net/yanbober/article/details/49314255 [工匠若水 http://blog.csdn.net/yanbober 转载请注明出处 ...
- 用C#制作PDF文件全攻略(转)
PDF文件是目前比较流行的电子文档格式,在办公自动化(OA)等软件的开发中,经常要用到该格式,但介绍如何制作PDF格式文件的资料非常少,在网上搜来搜去,都转贴的是同一段"暴力"破解 ...
- wifi软件linux版本,[转载]Wii安装运行可用WIFI的Linux系统全攻略
Wii运行Linux的优势: 低功耗,Wii玩3D游戏的平均功耗在18W,而运行linux的功耗更低,连续运行50天才耗一度电(甚至不到).如果用Wii来下电驴.如果给wii-linux装上图形界面来 ...
- 用C# itextsharp.dll制作PDF文件全攻略
StreamWriter pPDF=new StreamWriter(filePath); ArrayList xRefs=new ArrayList(); float yPos =0f; long ...
- 用C#制作PDF文件全攻略 (专至csdn)
前 言 丽水市汽车运输集团有限公司信息中心 苟安廷 PDF文件是目前比较流行的电子文档格式,在办公自动化(OA)等软件的开发中,经常要用到该格式,但介绍如何制作PDF格式文件的资料非常少,在网上搜来搜 ...
- 用C#製作PDF文件全攻略
PDF文件是目前比較流行的電子文檔格式,在辦公自動化(OA)等軟件的開發中,經常要用到該格式,但介紹如何製作PDF格式文件的資料非常少,在網上搜來搜去,都轉貼的是同一段「暴力」破解的方法,代碼片斷如下 ...
- 万能Ghost全攻略(最详细完整的教程)
万能Ghost全攻略(最详细完整的教程) 一.运行 Sysprep 工具的要求 要使用 Sysprep 工具,计算机的硬件和相关设备必须满足下列要求: 1. 参考计算机和目标计算机必须具有兼 ...
最新文章
- python windows错误码
- 用 eclipse SVN 插件共享项目
- Java之旅(二)--- ServletContext
- keil编译时提示 Undefined symbol __ROR
- 面试题leetcode 3. 无重复字符的最长子串 暴力法和滑动窗口解法
- 线性结构(顺序存储和链式存储)和非线性结构的特点及区别
- golang微服务框架对比_Go语言开发的微服务框架,你了解多少?
- 剑指offer 面试题62. 圆圈中最后剩下的数字
- 使用GSM6315模块,采用http或者https协议与服务器通信笔记
- 邓俊辉数据结构与算法学习笔记-第四章
- Python爬虫入门-python之jieba库制作词云图
- 设计模式----仲裁者模式(Mediator Pattern)例题
- 一文读懂 HTTPS 与 TLS证书链校验
- 停止win10自动更新
- android判断是否json格式,简单方法判断字符串是否是json字符串
- 你在日常的测试工作中遇到过哪些困境呢?
- 利用FFmpeg编码器将JPG图片进行H.264编码原理
- elasticSearch常见问题答疑
- 威学一百_威学一百app下载-威学一百官网版下载v1.0.0_MDPDA手机网
- CodeVs 1148 传球游戏
热门文章
- 一段.net 发邮件的代码
- WMPLib.WindowsMediaPlayer 的用法
- 【Java从0到架构师】Zookeeper 应用 - Java 客户端操作、服务器动态感知、分布式锁业务处理
- shell脚本 获取第几行 第几列 的命令 awk sed
- SpringAs3的一些配置参数
- 安卓用targetSdk来兼容各个版本
- 帧间差分法python代码_图像处理算法之帧间差分法
- anaconda如何装python_如何在已安装Python条件下,安装Anaconda,,并将原有Python添加到Anaconda中...
- php中怎样创建数据库服务器,实例讲解通过​PHP创建数据库
- python中xpath如何获取内容_python requests + xpath 获取分页详情页数据存入到txt文件中...