微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32单片机学习(2) 外部中断

STM32单片机学习(2) 外部中断

时间:11-20 来源:互联网 点击:
灯GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入GPIO_Init(GPIOB, &GPIO_InitStructure); //PB.0用于接受按键k1输入}void NVIC_Configuration(void) //中断分组和优先级配置 详见《STM32的函数说明(中文).pdf》P165{NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //0组,先占优先级0位,从优先级4位NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //外部中断线 0 中断NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //0组无抢占优先级,所以只配置从优先级,即响应式优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能NVIC_Init(& NVIC_InitStructure); //初始化配置}void EXTI_Configuration(void) //中断配置 //详见《STM32的函数说明(中文).pdf》 P99{EXTI_InitTypeDef EXTI_InitStructure; EXTI_ClearITPendingBit(EXTI_Line0);//清除 EXTI 线路挂起位EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置 EXTI 线路为中断请求EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //设置输入线路下降沿为中断请求EXTI_InitStructure.EXTI_Line = EXTI_Line0; //外部中断线 0EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能EXTI_Init(& EXTI_InitStructure); //初始化配置GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0); ///*将EXTI线0连接到PB0*/}/*中断服务程序*/void EXTI0_IRQHandler() //按下按钮还是放开按钮是下降沿??{if(EXTI_GetITStatus(EXTI_Line0) == SET)//检查指定的EXTI线路触发请求发生与否,返回一个EXTI_Line新状态{EXTI_ClearITPendingBit(EXTI_Line0);//清除线路挂起位EXTI_ClearFlag(EXTI_Line0);//清除中断挂起位 GPIO_SetBits(GPIOA,GPIO_Pin_0);//点亮LED delay_ms(500);//延时GPIO_ResetBits(GPIOA,GPIO_Pin_0);//灭if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0)) GPIO_SetBits(GPIOA,GPIO_Pin_2);//点亮LEDelse GPIO_ResetBits(GPIOA,GPIO_Pin_2);//灭} }

可另行参考文章:

STM32学习笔记之EXTI(外部中断)http://blog.sina.com.cn/s/blog_6623834301018woa.html

参考资料: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将公用一个中断程序段。当然如果特殊需要,也

可以这样设计。

==================================================================================

配置使用方法:

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

==================================================================================

程序代码

  • 初始化相应的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);

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top