您的位置:首页 > 其它

STM32本学习笔记EXTI(外部中断)

2015-08-15 12:02 260 查看
参考资料:STM32数据表、网络信息

=========================================切割线=========================================

外部中断/事件控制器由19个产生事件/中断要求的边沿检測器组成。每一个输入线能够独立地配置

输入类型(脉冲或挂起)和相应的触发事件(上升沿或下降沿或者双边沿都触发)。每一个输入线都能够被独

立的屏蔽。

挂起寄存器保持着状态线的中断要求。

=========================================切割线=========================================

19个中断例如以下:





17——EXTI线16连接到PVD输出

18——EXTI线17连接到RTC闹钟事件

19——EXTI线18连接到USB唤醒事件

注:有上图可知EXTI0连接的引脚为PA0、PB0、PC0、PD0、PE0、PF0、PG0,其它外部中断EXTI1——

EXTI15类似。所以在使用时尽量将须要的外部中断配置在不同的EXTIx上。

比如须要3个外部中断,我们能够配置到PA0、PB4、PG3上,此时每一个中断都有自己的中断处理程

序段。假设配置到PA0、PB0、PC1,则PA0和PB0将公用一个中断程序段。

当然假设特殊须要,也

能够这样设计。

=========================================切割线=========================================

配置用法:

初始化对应的GPIO管脚
配置外部中断源并进行中断源和GPIO的连接
编写对应中断源的中断处理程序

=========================================切割线=========================================

程序代码

初始化对应的GPIO管脚

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;

GPIO_Init(GPIOE, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);

注:GPIO的复用功能必须打开,如红字部分

配置外部中断源并进行中断源和GPIO的连接

GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource0);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource1);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9);

EXTI_InitStructure.EXTI_Line =EXTI_Line0|EXTI_Line1|EXTI_Line8|EXTI_Line9;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

编写对应中断源的中断处理程序

void EXTI0_IRQHandler(void)

{

if(Sys_Status > MIN_STATUS)

{

Sys_Status--;

}

EXTI_ClearITPendingBit(EXTI_Line0);

}

void EXTI1_IRQHandler(void)

{

PEout(2) = ~PEout(2);

EXTI_ClearITPendingBit(EXTI_Line1);

}

#define Exti_From_Pin8 0x00000100

#define Exti_From_Pin9 0x00000200

void EXTI9_5_IRQHandler(void)

{

u32 Temp = 0x00;

PEout(2) = ~PEout(2);

Temp =EXTI->PR; //取读是那个引脚的中断

switch(Temp)

{

caseExti_From_Pin8:

EXTI_ClearITPendingBit(EXTI_Line8);

break;

caseExti_From_Pin9:

if(Sys_Status < MAX_STATUS)

{

Sys_Status ++;

}

EXTI_ClearITPendingBit(EXTI_Line9);

break;

default:break;

}

}

=========================================切割线=========================================

中断处理程序说明。因为外部中断EXTI5——EXTI9公用了一个中断(EXTI10——EXTI15类似)所以要

区分不同的中断源须要进行对应的推断。如上EXTI9_5_IRQHandler中,通过取读EXTI->PR寄存器来判

断中断的来源。

转自http://blog.sina.com.cn/s/blog_6623834301018woa.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: