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内 ...
随机推荐
- mysql表复制和修改部分字段
今天在工作中,需要造大量的加数据,1000多条数据如果都是手工输入的话,那么我今天不要干别的了,就造吧! 当时手工操作重复的事情,对程序员来说,是一件很丢人的事情,所以就上网查了一下,需要用到两个知识 ...
- [No00007C]dreamweaver cc 注释快捷键
设置快捷键入口:编辑->快捷键 打开后: 先复制一份快捷键拷贝(系统自带的不让修改), 选择代码编辑 下拉到后面,设置快捷键
- fMRI: spatial smoothing
Source: Brain voyager support Theoretical Background Spatial smoothing means that data points are av ...
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 外部服务调用、内部服务调用优化,面向服务化的
现在的信息系统越来越复杂,越来越庞大,不仅需要内部是一个整体,而且还需要提供很多对外的服务调用. 1:别人如何调用最方便?用不同的开发语言调用.例如app.手持设备.服务器.2:服务的返回状态是什么样 ...
- Apache Shiro系列一,概述 —— 初识
一.什么是Shiro Apache Shiro是一个强大.灵活.开源的安全框架,它支持用户认证.权限控制.企业会话管理以及加密等. Apache Shiro的第一个也是最重要的一个目标就是易于使用和理 ...
- 修改httpd默认端口号
Tomcat: vim /etc/httpd/conf/httpd.conf//别忘了service httpd restart Nginx: vim /etc/nginx/nginx.conf//完 ...
- 解决:Microsoft Office Word已停止工作
1/按组合键WIN+R打开运行对话框 2/在打开框中键入%USERPROFILE%\AppData\Roaming\Microsoft\Templates,单击“确定”按钮 3/在打开的窗口鼠标右键删 ...
- springMVC文件上传
参考的地址:http://www.tuicool.com/articles/nMVjaiF 1.需要使用的jar. commons-fileupload.jar与commons-io-1.4.jar二 ...
- IE8的parseInt
踩到一个IE8的parseInt的坑: Chrome:
- 常见linux命令释义(第九天)—— Bash Shell 的操作环境Shell 中的管道命令一些管道命令
最近好懒好懒.连写文章都写不好了.于是只能写读一点书,记一点读书笔记了.太懒了,没办法.慢慢恢复自己的状态吧. 管道命令仅会处理strandard output 的内容,对于strandard err ...