中易网

如何用stm32实现使用中断exti按一下实现一个功能

答案:1  悬赏:50  
解决时间 2021-01-09 15:15
如何用stm32实现使用中断exti按一下实现一个功能
最佳答案
外部中断/事件控制器由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寄存器来判

  断中断的来源。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
对于深基坑,在开挖前要先做好什么? 挡土桩
超过40岁博士毕业,能在北上广深高校找到工作
创新5.1 内置声卡SB0060 Win7 64位系统KX效果
油炸放冷了还有火气么?
长沙微友圈微信号多少
日语はく,かぶる,する,着る的用法区别?
WIN7下WINRE.WIM这个文件到底在哪里
猜成语了,想破脑袋了
0.36×1.5×0.4梯等式
请问牯牛降有几个景区,各景区门票分别是多少
用姓于的姓氏写句情话 比如我姓王你在身旁弃
泰州复读学校学费多少
“莲师念修很重要”是什么意思
2012年12月20日星期四用英文写
新刑事诉讼中的非法证据排除包括哪些
推荐资讯
princ函数 prinl函数 print函数的区别
森林植物群落演替自然其自然度应不低于多少
亚麻子仁与酥麻子仁各有什么营养价值
密度为0.91g/ml的氨水,质量分数为25%。
女人有几个突出问题有几个巨大漏洞
农历l974年1月14曰是什么座是什星座
营业税和增值税有什么区别呢,具体怎样算?
excel 高级引用
怎样使公文用词更准确
进贤七个“一”是哪七个?
深圳福田网站建设哪家好
对硬盘容量要求不大 希捷160G和320G 哪个性能
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?