您的位置:首页 > 其它

外部中断

2016-12-27 20:58 169 查看
STM32每个IO都可以作为外部中断输入.

中断控制器支持22个外部中断/事件请求:

EXTI线0~15:对应外部IO口的输入中断。

EXTI线16:连接到PVD输出。

EXTI线17:连接到RTC闹钟事件。

EXTI线18:连接到USB OTG FS唤醒事件。

EXTI线19:连接到以太网唤醒事件。

EXTI线20:连接到USB OTG HS(在FS中配置)唤醒事件。

EXTI线21:连接到RTC入侵和时间戳事件。

EXTI线22:连接到RTC唤醒事件。

STM32F4供IO使用的中断线只有16个,但是STM32F4xx系列的IO口多达上百个,STM32F103ZGT6(112),那么中断线怎么跟IO口对应呢?

STM32设计GPIOx.0~GPIOX.15(x=A,B,C,D,E,F,G,H,I),选中GIOPA~I任意一个即可。

每个中断线,我们可以设置相应的触发方式(上升沿触发,下降沿触发,边沿触发)以及使能。

IO口外部中断在中断向量表中只分配了7个中断向量,也就是

只能使用7个中断服务函数



外部中断线5~9分配一个中断向量,共用一个服务函数

外部中断线10~15分配一个中断向量,共用一个中断服务函数

外部中断的一般配置步骤:

①使能SYSCFG时钟:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

② 初始化IO口为输入。

GPIO_Init();

③设置IO口与中断线的映射关系。

void SYSCFG_EXTILineConfig();

④初始化线上中断,设置触发条件等。

EXTI_Init();

⑤配置中断分组(NVIC),并使能中断。

NVIC_Init();

⑥ 编写中断服务函数。

EXTIx_IRQHandler();

⑦清除中断标志位

EXTI_ClearITPendingBit();

exti.c

#include "exti.h"
#include "delay.h"
#include "led.h"
include "key.h"
#include "beep.h"

//外部中断服务程序   根据需要修改编写//

//外部中断初始化程序
//初始化PE2~4,PA0为中断输入.
void EXTIX_Init(void)
{
NVIC_InitTypeDef   NVIC_InitStructure;
EXTI_InitTypeDef   EXTI_InitStructure;

KEY_Init(); //按键对应的IO口初始化

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟

//IO口与中断线的映射关系
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource2);//PE2 连接到中断线2
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource3);//PE3 连接到中断线3
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource4);//PE4 连接到中断线4
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);//PA0 连接到中断线0

//初始化线上中断,设置触发条件等
/* 配置EXTI_Line0 */
EXTI_InitStructure.EXTI_Line = EXTI_Line0;//LINE0
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE0
EXTI_Init(&EXTI_InitStructure);//配置
/* 配置EXTI_Line2,3,4 */
EXTI_InitStructure.EXTI_Line = EXTI_Line2
EXTI_Line3 | EXTI_Line4;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断线使能
EXTI_Init(&EXTI_InitStructure);//配置

//配置中断分组(NVIC),并使能中断
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//外部中断0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
NVIC_Init(&NVIC_InitStructure);//配置

NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;//外部中断2
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
NVIC_Init(&NVIC_InitStructure);//配置

NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;//外部中断3
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
NVIC_Init(&NVIC_InitStructure);//配置

NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;//外部中断4
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;//抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
NVIC_Init(&NVIC_InitStructure);//配置

}


exti.h

#ifndef __EXTI_H
#define __EXIT_H
#include "sys.h"
void EXTIX_Init(void);  //外部中断初始化
#endif


main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "exti.h"
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168);    //初始化延时函数
uart_init(115200);  //串口初始化
LED_Init();         //初始化LED端口
BEEP_Init();        //初始化蜂鸣器端口
EXTIX_Init();       //初始化外部中断输入
LED0=0;                     //先点亮红灯
while(1)
{
printf("OK\r\n");   //打印OK提示程序运行
delay_ms(1000);   //每隔1s打印一次
}
}




中断处理函数的编写根据需要在exti.c中实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  stm32