注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Leo

笑:胸怀,傲:实力,才能笑傲江湖。

 
 
 

日志

 
 

STM32的外部中断  

2011-09-23 10:45:13|  分类: 大学留笔 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

外部中断,没什么好解释的,两种触发方式,上升沿和下降沿, EXTI00~4有专门的中断向量,而EXTI5~9和EXTU10~15分别共用一个中断向量,因此,进入中断服务程序时首先要判断石油EXTIx引起的中断。

STM32的外部中断


由上图可见,EXTIx对应PXx。

 

按以下步骤配置外部中断:

1.配置外部管脚的参数,应为输入

2.配置管脚时钟

3.配置中断线的相关参数

4.配置NVIC

5.外部中断服务程序

 

以下是我写的按键中断程序,下降沿触发:

void GPIO_PA_Init()
{//PA13管脚配置
 GPIO_InitTypeDef GPIO_InitStructure;
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP ;//推挽输出
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);//使能端口时钟A
 GPIO_Init(GPIOA, &GPIO_InitStructure);

 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU ;//上拉输入,按键接地,构成下降沿触发
 GPIO_Init(GPIOA, &GPIO_InitStructure);

 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource13);
}

void EXIT_Line13_Init()
{//EXIT13配置
 EXTI_InitTypeDef EXTI_InitStructure;
 EXTI_InitStructure.EXTI_Line = EXTI_Line13;//外部中断线
 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断模式
 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
 EXTI_InitStructure.EXTI_LineCmd = ENABLE;//打开中断
 EXTI_Init(&EXTI_InitStructure);
}

void NVIC_Configuration()
{  
 NVIC_InitTypeDef NVIC_InitStructure;
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);   // 抢占式优先级别 
 NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQChannel;//指定中断源
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;// 指定响应优先级别1
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 NVIC_Init(&NVIC_InitStructure);
}

int main(void)
{     
 Stm32_Clock_Init(9); //系统时钟设置
 delay_init(72);      //延时初始化
 
 GPIO_DeInit(GPIOA);
 GPIO_PA_Init();
 EXIT_Line13_Init();
 NVIC_Configuration();
 GPIO_ResetBits(GPIOA, GPIO_Pin_8);
 while(1); 
}

void EXTI15_10_IRQHandler()
{
 

if(EXTI_GetITStatus(EXTI_Line13) != RESET)
 {
  delay_ms(10);
  if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_13)==0)
  {
   while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_13)==0);
   if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8)) GPIO_ResetBits(GPIOA, GPIO_Pin_8);
   else GPIO_SetBits(GPIOA, GPIO_Pin_8);
  }
  EXTI_ClearFlag(EXTI_Line13);
  EXTI_ClearITPendingBit(EXTI_Line13);
 }
}

  评论这张
 
阅读(1266)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017