STM32之外部中断控制
一、STM32外部中断
1、STM32外部中断结构图
如上图所示:主要包括四个环节,GPIO、AFIO、EXTI、NVIC。以STM32F103VE(100脚)为例说明硬件模块的数量:
GPIO: 80个
AFIO选择通道: 16个
外部中断线EXTI: 16 + 3 = 19个
NVIC : 1个
2、EXTI控制器结构图
① 功能
- 中断 申请中断
- 事件 当事件发生的时候,将产生事件脉冲,可以用来唤醒内核
② 功能详细说明
如果要产生中断,必须事先配置好并使能中断线。根据需要的边沿检测设置2个触发寄存器,同时在中断屏蔽寄存器的相应位写’1’ 允许中断请求。当外部中断线上发生了需要的边沿时,将产生一个中断请求,对应的挂起位也随之被置’1’ 。在挂起寄存器的对应位写’1’,可以清除该中断请求。
如果要为产生事件,必须事先配置好并使能事件线。根据需要的边沿检测通过设置2个触发寄存器,同时在事件屏蔽寄存器的相应位写’1’允许事件请求。当事件线上发生了需要的边沿时,将产生一个事件请求脉冲,对应的挂起位不被置’1’。
通过在软件中断/事件寄存器写’1’,也可以通过软件产生中断/事件请求。
3、STM32外部中断软件配置步骤
① 配置NVIC控制器
② 使能GPIO和AFIO时钟
③ 配置GPIO (复用功能的输入输出配置)
④ 配置AFIO (选定要配置为EXTI的I/O口线)
⑤ EXTI控制器的配置
配置寄存器就好像是我们在更改STM32的硬件电路,让它们处于一种新的工作状态--外部中断模式。
二、STM32外部中断软件配置细节
以PA0引脚的外部中断为例进行介绍:
1、配置NVIC控制器
PA0引脚对应的外部中断线是EXTI_Line0,而EXTI_Line0对应的中断源是EXTI0_IRQn。
调用NVIC_Init函数设置中断源EXTI0_IRQn的抢占优先级和响应优先级,并且使能中断。
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = ;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_IRQChannel
定义配置的对象,是哪一个中断源,它不能使用 “EXTI0_IRQn|EXTI0_IRQn”方式调用一次NVIC_Init函数配置多个中断源
2、使能GPIO和AFIO时钟
GPIO用作EXTI外部中断或使用重映射功能的时候,不仅需要开启外设时钟RCC_APB2Periph_GPIOA,还需要开启AFIO时钟RCC_APB2Periph_AFIO。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);
3、配置GPIO(复用功能的输入输出配置)
配置PA0为上拉输入。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
4、配置AFIO(选定要配置为EXTI的I/O口线)
PA0引脚对应的外部中断线是EXTI_Line0,但是PB0~PG0对应的也都是这个外部中断线。所以,需要通过多路选择器确定到底是哪一个引脚映射到EXTI_Line0。
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
5、EXTI控制器的配置
配置外部中断线EXTI_Line0的工作模式,为中断模式,下降沿触发中断,并且使能外部中断线EXTI_Line0。
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿中断
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
三、中断配置过程以及STM中断结构解惑
1、为什么NVIC有使能中断,EXTI控制器还有一个使能控制呢?
NVIC控制器是在ARM公司设计的Cortex-M3内核中,EXTI控制器是ST公司自己设计的外设。
在NVIC控制器中,有“Interrupt set-enable register&Interrupt clear-enable register”,它们来控制是否使能中断源EXTI0_IRQn。
而EXTI控制器中,有“Interrupt mask register”来控制中断线EXTI_Line0的中断标志位是否传送给NVIC控制器。
2、为什么NVIC控制器使能中断源的寄存器要两种?
中断的使能与除能分别使用各自的寄存器来控制——这与传统的,使用单一比特的两个状态来表达使能与除能是不同的。CM3 中可以有 240 对使能位/除能位(SETENA 位/CLRENA 位),每个中断拥有一对。这 240 个对子分布在 8 对32位寄存器中(最后一对没有用完)。欲使能一个中断,我们需要写1 到对应SETENA的位中;欲除能一个中断,你需要写 1 到对应的CLRENA位中。如果往它们中写0,则不会有任何效果。
写零无效是个很关键的设计理念:通过这种方式,使能/除能中断时只需把“当事位”写成 1,其它的位可以全部为零。再也不用像以前那样,害怕有些位被写入0 而破坏其对应的中断设置(反正现在写 0 没有效果了),从而实现每个中断都可以自顾地设置,而互不侵犯——只需单一的写指令,不再需要读-改-写三步曲。(摘自《CM3权威指南》)
3、在清除中断标志位的时候,为什么只需要清除EXTI的中断标志位就行,而不需要清除NVIC的悬起寄存器SETPEND?
有些程序员在中断服务程序结束的位置清除中断源的时候,还调用了NVIC_ClearPendingIRQ()函数清除中断源的悬起标志位,其实是不需要的。
如果中断发生时,正在处理同级或高优先级异常,或者被掩蔽,则中断不能立即得到响应。此时中断被悬起。中断的悬起状态可以通过“中断设置悬起寄存器(SETPEND) ”和“中断悬起清除寄存器(CLRPEND) ”来读取,还可以写它们来手工悬起中断。(这段文字摘自《CM3权威指南》)
由此我们可以得出结论:如果中断服务程序得到执行(中断得到响应),此时中断就不会被悬起。所以我们的中断服务程序不需要清除“悬起标志位”。
有人可能还会这么想:倘若一个中断服务程序因为处理器正在执行同级中断服务程序而不能被执行,中断被悬起,那么当轮到这个中断得到响应后,这个中断服务程序需要清楚“悬起标志位”吗?
我认为还是不需要,因为中断标志位的悬起和解悬,硬件都是可以自动控制的。也就是说,当悬起的中断被响应的时候,“悬起标志位”自动被硬件予以清除,不必手动清除。
参考资料:《STM32 库开发实战指南》
《CM3权威指南》
《STM32F10X芯片手册》
《STM32F10xxx Cortex-M3 programming manual.pdf》
STM32之外部中断控制的更多相关文章
- STM32的外部中断配置及使用
STM32的外部中断配置及使用 配置1:GPIO: 配置外部中断为输入模式: 配置2:EXTI: 配置外部中断线和触发模式: 配置3:NVIC: 配置外部中断源和中断优先级: 需要注意的是:RCC_A ...
- 嵌入式外部中断控制编程方法论—比較CC2541(51核)和S5PV210(ARM核)
这是一篇阐述怎样对嵌入式SOC外部中断进行控制编程的方法论文章.希望读者理解本篇文章后.能够具备对市场上全部已经面世和将来面世的嵌入式芯片的外部中断进行控制编程的能力. 笔者原创的技术分享一直都恪守下 ...
- STM32 GPIO外部中断总结
一.STM32中断分组: STM32 的每一个GPIO都能配置成一个外部中断触发源,这点也是 STM32 的强大之处.STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB ...
- STM32之外部中断
图1.0 图1.1 中断控制器支持23条中断线,其中16条是IO管脚中断线,分别是EXTI0~EXTI15: 图 1.2 另外七根中断线如下图: 中断线和管脚的对应关系:EXTI0~EXTI15 和 ...
- 浅谈stm32的外部中断
简述 本文简单介绍stm32外部中断的一般操作步骤,后续会补充外部中断的相关内容 stm32的中断控制器支持19个外部中断/事件请求: line0~line15:这16条line分别对应不同GPIO口 ...
- EXIT(外部中断)控制实验
实验目的 设计使用外接的按键来作为触发源,使得控制器产生中断,并在中断服务函数中实现控制小灯的亮灭. 按键硬件点路 编程要点 初始化用来产生中断的 GPIO: 初始化 EXTI: 配置 NVIC: 编 ...
- stm32寄存器版学习笔记03 外部中断
stm32的每个I/O口都可以作为中断输入,要把I/O口设置为外部中断输入,必须将I/O口设置为上拉/下拉输入 或 浮空输入(但浮空的时候外部一定要带上拉或下拉电阻,否则可能导致 中断不停的触发),干 ...
- STM32 EXTI(外部中断)
一.EXTI 简介 EXTI(External interrupt/event controller)-外部中断/事件控制器,管理了控制器的 20个中断/事件线.每个中断/事件线都对应有一个边沿检测器 ...
- STM32之EXTI——外部中断
互联网的广大网友,大家早上中午晚上好.EXTI...故名思义..EX表外,出..I表示Intrrupt..所以合起来就是外部中断...说到这..我觉得我最近的六级水平(背单词)又进了一步,稍微自夸了下 ...
随机推荐
- Nginx重要结构request_t解析之http请求的获取
请在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 本文主要参考为<深入理解nginx模块开发与架构解析>一书,处理用户请求部分,是一篇包含作者理解的读书笔记.欢迎指正,讨论. ...
- 正尝试在 OS 载入程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内执行托管代码,这样做会导致应用程序挂起。
出错提示: 正尝试在 OS 载入程序锁内执行托管代码. 不要尝试在 DllMain 或映像初始化函数内执行托管代码,这样做会导致应用程序挂起. 原因分析: .NET2.0中添加了42种非常强大的调试助 ...
- 标准I/O库之读和写流
一旦打开了流,则可在三种不同类型的非格式化I/O中进行选择,对其进行读.写操作: (1)每次一个字符的I/O.一次读或写一个字符,如果流是带缓冲的,则标准I/O会处理所有缓冲. (2)每次一行的I/O ...
- PPPoE Server Under Ubuntu/Debian
http://imranasghar.blogspot.com/2009/05/pppoe-server-under-ubuntudebian.html ----------------------- ...
- Java基础知识强化之集合框架笔记65:Map集合之集合多层嵌套的数据分析
1. 为了更符合要求: 这次的数据就看成是学生对象. 传智播客 bj 北京校区 jc 基础班 林青霞 27 风清扬 30 jy 就业班 赵雅芝 28 武鑫 29 sh 上海 ...
- iOS数据处理之SQLite数据库
1. 数据库管理系统 1> SQL语言概述 SQL: SQL是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集, 是一种功能齐全的 ...
- textarea限制字符数
html代码: <div class="remark_edit J_Remark_Edit"> <div class="tip-body"&g ...
- commons-io源码阅读心得
FileCleanTracker: 开启一个守护线程在后台默默的删除文件. /* * Licensed to the Apache Software Foundation (ASF) under on ...
- DevExpres.XtraLayout控件运行时动态设置数据项
问题分析: 通常.我们使用XtraLayout控件,是需要做以下的几个步骤来实现的: 1. 在窗体上拖拉一个 LayoutControl控件,设置它的填充属性: 2. 拖拉一些常规编辑控件到Lay ...
- T-SQL基础 (存储过程,触发器|| 笔记0808)
一:存储过程 1.使用EXEC 调用存储过程 2.系统存储过程是以SP_开头,SP_ProcedureName.:例子:EXEC sp_columns TableName 查看列信息 扩展存储过程 ...