STM32f103之外部中断
一、背景
有个需求,IO口检测上升沿,然后做相应的动作。在此记录STM32F103的外部中断结构及配置方法,
以备下次快速上手使用。
有许多不太明白,又是老司机(:-D)帮忙,真的是站在别人的肩膀上会让你看的更远,走的更快,
感谢老司机。 二、正文
STM32f103有68个可屏蔽中断。(但是,真正能用的其实远没有这么多,原因下面会详述。)
有16个可编程的优先等级,优先等级的概念可详见我的另外一篇博客《STM32 之 NVIC(中断向量、
优先级)简述》,链接:"http://www.cnblogs.com/ChYQ/p/5859974.html",接着看中断向量表,
如下图:

该中断向量表从高到低按照默认的中断优先级排序将所有可用的中断以表的形式列出来。仔细来看
每一列代表的意义:
"优先级":无需多言,默认的中断优先级次序。
"优先级类型":即表明,这个对应的默认优先级是否可被配置更改,以使其优先级升高或者降低。
"名称":外部中断名称简写
"说明":通过这个我们就可以清楚知道前一列的"名称"代表的是哪个具体的外设中断。
"地址":这个地址即当对应的外部中断来时,若是使能了该外部中断,则MCU会将PC指针跳转到该
地址,编译器一般会在该地址内保存对应的中断处理函数指针,进而可进入到相应的中断
处理函数做相应的处理。
然后说说外部中断事件(EXTI),外部中断事件由20个(互联型)/19个产生事件/中断的边沿检测器组
成,白话说,即GPIO口可检测到对应IO口的上升沿/下降沿/双边沿事件,进而产生相应中断。
接着看外部中断/时间框图,如下图:

从最右来看,输入线连接至GPIO口,检测外部引脚的电平信号,上升沿/下降沿触发器与软件中断
事件触发器,经过"或"器件传入下一级,意味着,这两类信号可独立引起中断/事件。经过"或"后,信
号出现了分支,信号一路进入请求挂起寄存器,若是中断屏蔽寄存器设置为允许该信号,则一起"与"使
能对应的中断。另一路则是同事件屏蔽寄存器信号相"与",通过则产生对应的事件。
说到这,中断和事件又有什么不同呢?
中断既是正常理解的中断,中断信号通过后,会让MCU的PC值跳转到相应的中断入口,找到对应的
中断处理函数,然后进行中断处理。
事件则用来向其他外设模块发送脉冲事件,通知外设去做相应的事情,就以ADC接收到脉冲事件后自动
开始ADC转换为例进行说明。
在ADC中,初始化ADC的结构体如下:
typedef struct
{
uint32_t ADC_Mode;
FunctionalState ADC_ScanConvMode;
FunctionalState ADC_ContinuousConvMode;
uint32_t ADC_ExternalTrigConv;
uint32_t ADC_DataAlign;
uint8_t ADC_NbrOfChannel;
}ADC_InitTypeDef;
选项"ADC_ExternalTrigConv",即是设置ADC的触发启动方式,可配置为软件触发启动,当该值配置为
"ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO"的时候,则ADC会在EXT产生脉冲事件的同时,开始自动
触发ADC转换,与软件触发启动不同的是,这种方式是硬件自动完成,不需要软件参与。当然,不限定
只能为EXT,还可以是定时器等等。
最后说说上文提及的,为什么明明有68个可屏蔽中断,可实际却远没有这么多。
上图提及,GPIO口通过连接到外部中断/事件线上来完成相应的中断请求,然后看看外部中断通用
I/O口映像,如下图:

外部中断/事件线只有16个,IO口却有A~G()组,每组有16个引脚,从上图可看出,实际上一次性
可用的外部中断/事件也只能有16个,并不是IO口有多少,就能有多少个外部中断/事件。
譬如说若是第一组PA0用了第一个中断/事件线,那么P(x)0就不能再被用作外部中断输入口了。(x
为B~G)。
外部中断结构大致就介绍到此。接下来说说,结合库函数,如何让外部中断配置成功并工作。一
一般步骤为:
--> 初始化对应IO口为输入;
--> 使能对应IO口时钟,并设定IO口与外部中断/事件线的联系;
注意:由于此处用了外部中断,所以对应的复用时钟要打开!
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 使能GPIO时钟复用
// 设定GPIO口与中断/事件线联系库函数
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
"GPIO_PortSource":选择对应的GPIO口。
"GPIO_PinSource" :选择对应的外部中断/事件线。
--> 初始化外部中断/事件线,并配置触发模式(上边沿/下边沿/双边沿);
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)
结构体"EXTI_InitStruct"如下:
typedef struct
{
// 外部中断/事件线是否被使能
// "EXTI_Line0"->"EXTI_Line15"
uint32_t EXTI_Line;
// 中断模式/事件模式
EXTIMode_TypeDef EXTI_Mode;
// 触发模式(上边沿/下边沿/双边沿)
EXTITrigger_TypeDef EXTI_Trigger;
// "Enable"或"Disable"
FunctionalState EXTI_LineCmd;
}EXTI_InitTypeDef; --> 设置NVIC,并使能中断;
详见NVIC博客,不再详述
--> 写中断处理函数。
STM32F103外部中断函数共有6个:
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
EXTI9_5_IRQHandler
EXTI15_10_IRQHandler
外部中断""->""有独立的中断处理函数;
外部中断""->""共用中断函数"EXTI9_5_IRQHandler";
外部中断""->""共用中断函数"EXTI15_10_IRQHandler";
中断函数示例如下:
void EXTI9_5_IRQHandler(void)
{
// 获取中断状态
if(EXTI_GetITStatus(EXTI_IMR_MR8) != RESET)
{
// 清除挂起位
EXTI_ClearITPendingBit(EXTI_IMR_MR8);
}
} 三、参考链接
STM32 external interrupt
http://www.programering.com/a/MDM4kzMwATg.html
STM32 外部中断学习笔记
http://blog.csdn.net/zzwdkxx/article/details/9036679 至此,记录完毕。 记录时间:--
记录地点:深圳WZ
STM32f103之外部中断的更多相关文章
- STM32F103外部中断编程
STM32F103外部中断编程 中断,顾名思义就是停下手头的活,去干另外一件急活,干完急活然后回来继续干手头的活. 单片机和人一样,有时候也有更急的程序需要执行,执行完之后再回来执行之前正在执行的 ...
- (stm32f103学习总结)—stm32外部中断
一.外部中断介绍 1.1 EXTI简介 EXTI简介 STM32F10x外部中断/事件控制器(EXTI)包含多达 20 个用于产生事 件/中断请求的边沿检测器.EXTI的每根输入线都可单独进行配置,以 ...
- STM32 GPIO外部中断总结
一.STM32中断分组: STM32 的每一个GPIO都能配置成一个外部中断触发源,这点也是 STM32 的强大之处.STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB ...
- stm32寄存器版学习笔记03 外部中断
stm32的每个I/O口都可以作为中断输入,要把I/O口设置为外部中断输入,必须将I/O口设置为上拉/下拉输入 或 浮空输入(但浮空的时候外部一定要带上拉或下拉电阻,否则可能导致 中断不停的触发),干 ...
- STM32之EXTI——外部中断
互联网的广大网友,大家早上中午晚上好.EXTI...故名思义..EX表外,出..I表示Intrrupt..所以合起来就是外部中断...说到这..我觉得我最近的六级水平(背单词)又进了一步,稍微自夸了下 ...
- 转别人的 STM32外部中断使用注意事项
前言:这些问题都是我之前在工作中遇到的,后来觉得需要总结,自己记忆不好,所以在这个给自己打个mark. 一:触发方式 STM32 的外部中断是通过边沿来触发的,不支持电平触发: 二:外部中断分组 ST ...
- STM32外部中断初理解
PA0,PB0...PG0--->EXTI0 PA1,PB1...PG1--->EXTI1 ....... PA15,PB15...PG15--->EXTI15 以上为GPIO和中断 ...
- STM32——外部中断EXIT实现
外部中断实现步骤: 一.初始化,包括:1.AFIO时钟中断和GPIO时钟使能: 2.GPIO初始化 ...
- 向linux内核中添加外部中断驱动模块
本文主要介绍外部中断驱动模块的编写,包括:1.linux模块的框架及混杂设备的注册.卸载.操作函数集.2.中断的申请及释放.3.等待队列的使用.4.工作队列的使用.5.定时器的使用.6.向linux内 ...
随机推荐
- 【第一篇献给markdown】markdown入门
Markdown 是一种轻量级的「标记语言」,语法十分简单,常用的标记符号也不超过十个.虽然功能很强大,但是上手估计不用十分钟. 一些认识 Markdown 官方文档 这里可以看到官方的 Markdo ...
- 输入url到页面返回的过程
输入url后,你看到了百度的首页,那么这一切是如何发生的呢? 这个问题之前.最近.我想以后肯定还会被问到,或者问到这样的题目,如果在百度框里输入查询的字符串开始,是怎么返回你需要的东西呢. 那这什么个 ...
- ACM失败之路
校赛打完,已过四月,该是准备背起行囊,踏上考研之路了,自然,得先阔别一下ACM了,想起这几年ACM路,感慨颇多,不得不一诉心肠,与大家分享一下我的ACM历程,如果有人能从此文获取一些益处,那我就很欣慰 ...
- 第16章 List集合的总结和遍历
第16章 List集合的总结和遍历 1.重构设计 根据Vector类,ArrayList类,和LinkedList类所具有的存储特点以及拥有的方法入手,发现共性往上抽取. 共同特点: 1.允许元素重复 ...
- IIS短文件名暴力枚举漏洞利用脚本
import sys import httplib import urlparse import threading import Queue import time class Scanner(): ...
- sqlite常用查询
做的小工具用到了sqlite,在查询上较sqlserver还是稍有差异,将常用操作汇总一下,慢慢收集和整理. --查询版本SELECT sqlite_version() AS 'SQLite Vers ...
- Enum简单例子DropdownList
借鉴:http://www.cnblogs.com/suizhikuo/archive/2013/06/07/3125225.html vs2012 mvc4 最终效果: 1.建立mvc4 Inter ...
- 基于webmagic的爬虫项目经验小结
大概在1个月前,利用webmagic做了一个爬虫项目,下面是该项目的一些个人心得,贴在这里备份: 一.为什么选择webmagic? 说实话,开源的爬虫框架已经很多了,有各种语言(比如:python.j ...
- Wireshark基本介绍和学习TCP三次握手
wireshark介绍 wireshark的官方下载网站: http://www.wireshark.org/ wireshark是非常流行的网络封包分析软件,功能十分强大.可以截取各种网络封包,显示 ...
- 配置javac环境
初始的javac是默认不可用,如下图: 系统变量->新建->变量名:JAVA_HOME 变量值:(C:\Program Files\Java\jdk1.7.0_03)(这只是我的JDK安装 ...