stm32成长记之中断介绍

来源:互联网 发布:网络电话拨号软件 编辑:程序博客网 时间:2024/06/15 17:52

嵌套向量中断控制器

特性

●68个可屏蔽中断通道(不包含16个Cortex™-M3的中断线); 

● 16个可编程的优先等级(使用了4位中断优先级);


外部中断/事件控制器框图


外部中断程序设计思路:

中断初始化,主要是完善三个结构体:

①GPIO_InitTypeDef   (功能:IO配置)

②EXTI_InitTypeDef (功能:中断配置)

③NVIC_InitTypeDef (功能:中断优先级配置)

抢占优先级高的可以抢占优先级低的,即发生中断嵌套响应优先级高的中断先进行,但不会抢占响应优先级低的中断,即不能发生中断嵌套


void exti_init()  {GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //若是,开启复用功能,需要开启复用时钟。
GPIO_InitStructure.GPIO_Pin=k_left;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //按键所接IO口设置为上拉模式

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOE,&GPIO_InitStructure); 
//此处注意,若是没有将中断引脚映射到外部中断线路上,中断将无效
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);//选择GPIO管脚作外部中断线路/*设置外部中断模式 */ 
EXTI_InitStructure.EXTI_Line=EXTI_Line2;//挂载中断线2
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//设置为中断模式
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); /*设置中断优先级*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //打开EXIT2的全局中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //响应优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //使能
NVIC_Init(&NVIC_InitStructure); 
}
中断处理程序实现:

①通过EXTI_GetITStatus检测中断线是否发生了变化

(EXTI_GetITStatus通过检测中断的挂起寄存器EXTI_PR是否和当前发生变化的中断线相同,是的话,返回SET;否的话,返回RESET。)

②发生中断后,使用EXTI_ClearITPendingBit清除EXTI线路挂起位。

中断处理函数,应该放置与stm32f10x_it.c中,也可将该函数copy到Keil编译路径下

如果放在新建的文件夹中,需要将对应的目录添加到Keil编译目录中

void EXTI2_IRQHandler()   {if(EXTI_GetITStatus(EXTI_Line2)==SET){   EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI线路挂起位delay_ms(10);//消抖if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET)   //k_left被按下{delay_ms(10);//消抖处理if(GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_0)==Bit_RESET){//LED 熄灭   GPIO_SetBits(GPIOC,GPIO_Pin_0);}else{   //LED 点亮GPIO_ResetBits(GPIOC,GPIO_Pin_0);}} while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0);}}

 
原创粉丝点击