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内 ...
随机推荐
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 7687 Solved: 3516[Subm ...
- BZOJ3223: Tyvj 1729 文艺平衡树 [splay]
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3595 Solved: 2029[Submit][Sta ...
- Spring MVC 使用HiddenHttpMethodFilter配置Rest风格的URL
/** Rest 风格的 URL. 以 CRUD 为例: 新增: /order POST 修改: /order/1 PUT update?id=1 获取:/order/1 GET get?id=1 删 ...
- 操作系统IO模型
操作系统IO模型 声明:如下内容是根据APUE和mycat两本著作中关于I/O模式的一些内容加上自己的一些理解整理而成,仅供学习使用. 本节内容 UNIX下可用的五种I/O模型 三种I/O模型 Rea ...
- reveal
链接 界面调试工具Reveal Reveal使用教程 iOS分析UI利器——Reveal及简单破解方法 Reveal使用步骤和 破解Revealapp的试用时间限制 end
- keyset获取元素
public static void main(String[] args){ Map map = new HashMap(); map.put("apple", "新鲜 ...
- 数据表格 - DataGrid - 查询
toolbar头部工具栏 <script type="text/javascript"> $(function () { $("#datagrid" ...
- Learning Roadmap of Robotic Operating System (ROS)
ROS Wiki: http://wiki.ros.org/ Robots Using ROS Textbooks: A Gentle Introduction to ROS Learning ROS ...
- IO(三)----序列流
SequenceInputStream 表示其他输入流的逻辑串联.它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的 ...
- 浅谈 underscore 内部方法 group 的设计原理
前言 真是天一热什么事都不想干,这个月只产出了一篇文章,赶紧写一篇压压惊! 前文(https://github.com/hanzichi/underscore-analysis/issues/15)说 ...