STM32----IO口外部中断

 

嵌套向量中断控制器(NVIC)

外部中断/事件控制器(EXTI)

 

 

外部中断初始化函数


初始化IO口为输入

KEY_Init();

开启复用时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);     //外部中断,需要使能AFIO时钟

初始化中断线

EXTI_InitTypeDef EXTI_InitStructure;                         //外设EXTI的初始化变量

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);   //GPIO与中断线映射,PA0
//外设EXTI的初始化变量成员
EXTI_InitStructure.EXTI_Line=EXTI_Line0;                     //选择了待使能或者失能的外部线路
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;          //被使能线路的模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;       //被使能线路的触发边沿
EXTI_InitStructure.EXTI_LineCmd = ENABLE;                    //定义选中线路的新状态

EXTI_Init(&EXTI_InitStructure);                              //初始化外设EXTI寄存器

WK_UP高电平有效,故上升沿触发;

KEY0和KEY1低电平有效,故下降沿触发;


初始化中断分组

NVIC_InitTypeDef NVIC_InitStructure;                          //外设NVIC的初始化变量
//外设NVIC的初始化变量成员
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;              //选择待使能或失能的外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;  //先占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;         //从优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;               //定义选中通道的新状态

NVIC_Init(&NVIC_InitStructure);                               //初始化外设NVIC寄存器

中断服务函数

中断服务函数的名字是在MDK中事先有定义的,STM32的IO口外部中断函数只有6个:

EXTI0_IRQHandler、EXTI1_IRQHandler、EXTI2_IRQHandler、EXTI3_IRQHandler、EXTI4_IRQHandler

EXTI9_5_IRQHandler、EXTI15_10_IRQHandler

中断线0-4每个中断线对应一个中断函数;

中断线5-9共用中断函数EXTI9_5_IRQHandler;

中断线10-15共用中断函数EXTI15_10_IRQHandler;


注意

中断函数无需再exit.h文件中进行声明;


重要函数

ITStatus EXTI_GetITStatus(u32 EXTI_Line)          //检查指定的EXTI线路触发请求发生与否

void EXTI_ClearITPendingBit(u32 EXTI_Line)       //清除EXTI线路挂起位


中断服务函数格式

void EXTI2_IRQHandler(void) 
{ 
    if(EXTI_GetITStatus(EXTI_Line2)!=RESET)           //判断某个线上的中断是否发生     
    { 
        中断逻辑
        EXTI_ClearITPendingBit(EXTI_Line2);           //清除LINE上的中断标志位   
    }       
} 

外部中断实验---->WK_UP的中断服务函数:WK_UP同时控制DS0和DS1,按一次,它们的状态就翻转一次。

void EXTI0_IRQHandler(void)
{
    delay_ms(10);                            //先延时10ms,再判断是否为高电平,消抖
	if(WK_UP==1)                             
	{	  
		LED0=!LED0;
		LED1=!LED1;	
	}
	EXTI_ClearITPendingBit(EXTI_Line0);      //清除EXTI0线路挂起位
}

主函数

中断优先级分组函数放在含中断设置的初始化函数前面;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);     //设置中断优先级分组2
EXTIX_Init();                                       //外部中断初始化

 

 

 

 

 

 

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值