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 = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
NVIC_IRQChannel
定义配置的对象,是哪一个中断源,它不能使用“EXTI0_IRQnEXTI0_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,则不会有
STM32外部中断控 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)