嵌入式 中断系统编程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
②接下来是编号3的或门,这个或门的另一个输入是“软件中断/事 件寄存器”,从这里可以看出,软件可以优先于外部信号请求一个 中断或事件,既当“软件中断/事件寄存器”的对应位为“1”时,不 管外部信号如何,编号3的或门都会输出有效信号。
③一个中断或事件请求信号经过编号3的或门后,进入“登记(挂 起)请求寄存器” ,到此,中断和事件的信号传输通路都是一致的 ,也就是说, “登记(挂起)请求寄存器”中记录了外部请求信号 。
③上升沿触发选择寄存器(EXTI_RTSR) : RTSR--Rising trigger
selection register, 用于屏蔽(或开放)来自输入线X上的上升沿触发(中断和事 件)
④下降沿触发选择寄存器(EXTI_FTSR): FTSR--Falling trigger
selection register, 禁止输入线x上的下降沿触发(中断和事件)
中断
和
事件的比较
在这张图上我们也可以知道, 从外部激励信号来看,中断和事件是没有分别的, 只是在芯片内部分开,一路信号会向CPU产生中断请求,另一路 信号会向其它功能模块发送脉冲触发信号,其它功能模块如何相 应这个触发信号,则由对应的模块自己决定。
事件本质上就是一个触发信号,是用来触发特定的外设模块或核心本 身(唤醒);事件只是一个触发信号(脉冲),而中断则是一个固定 的电平信号 事件可以触发中断,也可以不触发; 中断有可能被更优先的中断屏蔽,事件不会被屏蔽
第四章 中断系统编程
1.1
EXTI (外部中断/事件)控制器
1.2
1.3
NVIC (嵌套中断向量控制器)
中断系统 编程步骤
1.1 EXTI (外部中断/事件)控制器
EXTI: External interrupt/event,外部中断、
外部事件 1.1.1 1.1.2 STM32 单片机的 EXTI工作机制 STM32 单片机的 EXTI线路
STM32F10x
/* Peripheral base address in the bit-band region */ #define PERIPH_BASE ((u32)0x40000000) /* Peripheral memory map */ #define APB1PERIPH_BASE #define APB2PERIPH_BASE #define AHBPERIPH_BASE PERIPH_BASE (PERIPH_BASE + 0x10000) (PERIPH_BASE + 0x20000)
8
9 10
15
16 17
可设置 EXTI2 EXTI线2中断
可设置 EXTI3 EXTI线3中断 可设置 EXTI4 EXTI线4中断
0x0000_ 0060 0x0000_ 0064 0x0000_
位 置
……
优先级 优先级 名称 类型 30
说明
地址
23
……
可设置 EXTI9_5 EXTI线[9:5]中断
EXTI外部中断/事件寄存器组 的首地址:
0x40010400
#define EXTI_BASE
(APB2PERIPH_BASE + 0x0400)
#ifdef _EXTI
#define
STM32F10x
EXTI
((EXTI_TypeDef *) EXTI_BASE)
#endif /*_EXTI */
④外部请求信号最后经过编号4的与门,向CM3内核的NVIC中断控制 器发出一个中断请求,如果“中断屏蔽寄存器”的对应位为“0” ,则该请求信号不能传输到与门的另一端,实现了中断的屏蔽。
对不能立即响应的中断请求信号 的 处理方法不同: 如果一个发生的中断(异常)不能被即刻响应,就称它被“挂起 ”(pending)。不过,少数fault异常是不允许被挂起的。 一个中断(异常)被挂起的原因,可能是系统当前正在执行一个 更高优先级中断(异常)的服务例程,或者因相关掩蔽位的设置 导致该中断(异常)被除能。 在ARM Cortex-M3中,对于每个中断(异常)源,在被挂起的情况 下,都会有一个对应的“挂起状态寄存器”保存其中断(异常) 请求,直到该中断(异常)能够执行为止,这与MCS51单片机 是 完全不同的。 在MCS51单片机中,中断请求信号是由产生中断的设备保持住。现 在NVIC 的挂起状态寄存器的出现解决了这个问题,即使设备在后 来已经释放了请求信号,曾经的中断请求也不会错失。
STM32F10x
另外,在固件库函数RCC_APB2PeriphClockCmd ( )中:参数 RCC_APB2Periph指定的APB2外设,不包括EXTI外设,即固件 库函数不能使能EXTI外设对应的时钟。
另外四个EXTI线的连接方式如下: ● EXTI线16连接到PVD(电源电压检测)输出 ● EXTI线17连接到RTC闹钟事件 ● EXTI线18连接到USB唤醒事件 ● EXTI线19连接到以太网唤醒事件(只适用于互联型产品) STM32F10x
62
69
可设置 ETH_WKU 连接到EXTI的以太 0x0000_ P 0138 网唤醒中断
注意:
位 置
……
优先级 优先级 名称 类型 48
说明
地址
41
……
可设置 RTCAlarm 连接到EXTI的RTC 0x0000_ 00E4 闹时中断
不 同
3 10 可设置 RTC 实时时钟(RTC) 0x0000_ 009C 全局中断
在这个通道上有4个控制部分 ①外部的信号首先经过边沿检测电路,这个边沿检测电路受上升沿 或下降沿选择寄存器控制,用户可以使用这两个寄存器控制需要哪 一个边沿产生中断,因为选择上升沿或下降沿是分别受2个平行的 寄存器同时控制,所以用户可以同时选择上升沿或下降沿,而如果 只有一个寄存器控制,那么只能选择一个边沿了。
PAx、 PBx、 PCx、 PDx 和 PEx端口的相同口线 对应的是 同 一个外部中断/事件源EXTIx(x:0~15)。 注意: ∵配置GPIO口线上的EXTI (外部中断/事件),是通过 AFIO_EXTICRx寄存器来进行的。∴使用前,必须先使能AFIO时钟。 虽然,挂接在APB2总线上的,既有EXTI外设,又有AFIO外设,但 当使用EXTI外设时,使能时钟的是使能AFIO时钟。
STM32F10x
1.1.2 STM32 单片机的 EXTI线路 (或 STM32 单片机的 GPIO 与 EXTI 的映射关系)
STM32单片机的112个通用I/O端口线(口的某一位,称为口线 )以下图的方式连接到16个外部中断/事件(EXTIx)线上:------其 中每根EXTIx线上 可接 PAx~PGx共7个通用I/O端口线其中之一。 x=0~15。(16*7=112)
蔽(或开放)来自线X(0~19)上的中断请求。
外部中断/事件
wk.baidu.com
定义
①中断屏蔽寄存器(EXTI_IMR) :IMR--Interrupt mask register, 用于屏 ②事件屏蔽寄存器(EXTI_EMR):EMR--Event mask register, 用于屏蔽(
或开放)来自线X(0~19)上的事件请求。
2、GPIO_EXTILineConfig
选择GPIO管脚接EXTIx线
①其中参数GPIO_PortSource可能的取指:
GPIO_PortSourceGPIOA, GPIO_PortSourceGPIOB, GPIO_PortSourceGPIOC, GPIO_PortSourceGPIOD, GPIO_PortSourceGPIOE, GPIO_PortSourceGPIOF, GPIO_PortSourceGPIOG
STM32F10x
2、
外部事件
的请求机制
图中红色虚线箭头,标出了外部事件信号的传输路径:外 部请求信号经过编号3的或门后,进入编号5的与门,这个 与门的作用与编号4的与门类似,用于引入“事件屏蔽寄 存器”的控制;最后脉冲发生器把一个跳变的信号(边沿 检测电路检测到的 跳变信号)转变为一个单脉冲,输出到芯 片中的其它功能模块。
在文件“stm32f10x_gpio.h”中,定义
/* GPIO Port Sources ---------------------------------------------------------*/ #define GPIO_PortSourceGPIOA ((u8)0x00) #define GPIO_PortSourceGPIOB ((u8)0x01) #define GPIO_PortSourceGPIOC ((u8)0x02) #define GPIO_PortSourceGPIOD ((u8)0x03) #define GPIO_PortSourceGPIOE ((u8)0x04) #define GPIO_PortSourceGPIOF ((u8)0x05) #define GPIO_PortSourceGPIOG ((u8)0x06)
(即APB2 clock)
(EXTI线)
STM32F10x
STM32单片机的 EXTI(外部中断与外部事件) 控制器结构框图
STM32 单片机的外部中断、外部事件机制
1、 2、
外部中断 的请求机制 外部事件 的请求机制 中断 和 事件的比较
1、 外部中断
的请求机制
图中的蓝色虚线箭头,标出了外部中断信号的传输路径:首先外 部信号从编号1的芯片引脚进入,经过编号2的边沿检测电路, 通过编号3的或门进入中断“登记(挂起)请求寄存器”,最后 经过编号4的与门输出到M3内核的NVIC中断控制器。
1.1.3
STM32 单片机的 EXTI配置
1.1.1
STM32 单片机的 EXTI工作机制
对于互联型产品,外部中断/事件控制器由20个产生事件/中断请求 的边沿检测器组成; 对于其它产品,则由19个能产生事件/中断请求的边沿检测器组成 。如下图所示。 每个输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事 件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地 被屏蔽。挂起寄存器保持着状态线的中断请求。
⑤软件中断事件寄存器(EXTI_SWIER): SWIER--Software interrupt
event register, 输入线X上的软件中断/事件。由软件来请求一个中断或事件。
⑥挂起寄存器(EXTI_PR) : PR--Pending register。 PRx: 挂起位 (Pending
bit) ,当其为1时,登记了外部请求信号。
E
STM32F10x
1、EXTI外部中断/事件 定义
编程时, EXTI外部中断/事件的具体配置是从EXTI寄存器组开始。 首先,用结构体EXTI_TypeDef 定义 EXTI寄存器组: 在文件“stm32f10x_map.h”中定义如下: typedef struct { vu32 IMR; vu32 EMR; vu32 RTSR; vu32 FTSR; EXTI外部中断/事件的6个设置寄存器 vu32 SWIER; vu32 PR; } EXTI_TypeDef; //用结构体EXTI_TypeDef 定义EXTI外部中断/事件 //或称用结构体EXTI_TypeDef 定义EXTI寄存器组
0x0000_ 009C
40 41 42
……
47 48 49
可设置 EXTI15_10 EXTI线[15:10]中断 0x0000_ 00E0 可设置 RTCAlarm 连接到EXTI的RTC 闹钟中断 可设置 USB唤醒 连接到EXTI的从 USB待机唤醒中断 0x0000_ 00E4 0x0000_ 00E8
……
STM32F10x
外部中断配置寄存器1 (AFIO_EXTICR1)
STM32F10x
外部中断配置寄存器2 (AFIO_EXTICR2)
STM32F10x
外部中断配置寄存器3 (AFIO_EXTICR3)
STM32F10x
外部中断配置寄存器4 (AFIO_EXTICR4)
STM32F10x
STM32单片机的 可屏蔽中断通道 对应的中断向量表 位置 优先级 优先级 名称 说明 地址 类型
……
1
……
8
可设置 PVD
连接到EXTI的电源电 压检测(PVD)中断
0x0000_ 0044
0x0000_ 0058 0x0000_ 005C
6 7
13 14
可设置 EXTI0 EXTI线0中断 可设置 EXTI1 EXTI线1中断
STM32F10x
STM32F10x
1.1.3
STM32 单片机的 EXTI配置
1、EXTI (外部中断/事件)
2、GPIO_EXTILineConfig
定义
选择GPIO管脚接EXTIx线
3、EXTI_InitTypeDef 初始化EXTI参数 定义
4、EXTI_Init
初始化EXTI 定义
1、EXTI 每个EXTI:共有6个设置寄存器