STM32
直播中

廉鼎琮

7年用户 948经验值
私信 关注
[问答]

介绍STM32外部IO口的中断功能

STM32外部IO口的功能有哪些?
使用STM32 IO口的外部中断有哪些步骤?

回帖(1)

杨颜

2021-11-17 09:37:27
  
  
  
  
  
  
  main函数
  #include “stm32f10x.h”
  #include “led.h”
  #include “delay.h”
  #include “key.h”
  #include “sys.h”
  #include “usart.h”
  #include “exti.h”
  #include “beep.h”
  int main(void)
  {
  delay_init(); //延时函数初始化
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  uart_init(115200); //串口初始化为115200
  LED_Init(); //初始化与LED连接的硬件接口
  BEEP_Init(); //初始化蜂鸣器端口
  KEY_Init(); //初始化与按键连接的硬件接口
  EXTIX_Init(); //外部中断初始化
  LED0=0; //点亮LED0
  while(1)
  {
  printf(“OKrn”);
  delay_ms(1000);
  printf(“hhhrn”);
  delay_ms(1000);
  }
  }
  外部中断exti.c
  #include “exti.h”
  #include “led.h”
  #include “key.h”
  #include “delay.h”
  #include “usart.h”
  #include “beep.h”
  void EXTIX_Init(void)
  {
  EXTI_InitTypeDef EXTI_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  KEY_Init(); // 按键端口初始化
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟
  //GPIOE.2 中断线以及中断初始化配置 下降沿触发
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
  EXTI_InitStructure.EXTI_Line=EXTI_Line2; //KEY2
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
  //GPIOE.3 中断线以及中断初始化配置 下降沿触发 //KEY1
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
  EXTI_InitStructure.EXTI_Line=EXTI_Line3;
  EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
  //GPIOE.4 中断线以及中断初始化配置 下降沿触发 //KEY0
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
  EXTI_InitStructure.EXTI_Line=EXTI_Line4;
  EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
  //GPIOA.0 中断线以及中断初始化配置 上升沿触发 PA0 WK_UP
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
  EXTI_InitStructure.EXTI_Line=EXTI_Line0;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按键WK_UP所在的外部中断通道
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //子优先级3
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
  NVIC_Init(&NVIC_InitStructure);
  NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //使能按键KEY2所在的外部中断通道
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子优先级2
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
  NVIC_Init(&NVIC_InitStructure);
  NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //使能按键KEY1所在的外部中断通道
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级1
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
  NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
  NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; //使能按键KEY0所在的外部中断通道
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子优先级0
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
  NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
  }
  //外部中断0服务程序
  void EXTI0_IRQHandler(void)
  {
  delay_ms(10);//消抖
  if(WK_UP==1) //WK_UP按键
  {
  BEEP=!BEEP;
  }
  EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位
  }
  //外部中断2服务程序
  void EXTI2_IRQHandler(void)
  {
  delay_ms(10);//消抖
  if(KEY2==0) //按键KEY2
  {
  LED0=!LED0;
  }
  EXTI_ClearITPendingBit(EXTI_Line2); //清除LINE2上的中断标志位
  }
  //外部中断3服务程序
  void EXTI3_IRQHandler(void)
  {
  delay_ms(10);//消抖
  if(KEY1==0) //按键KEY1
  {
  LED1=!LED1;
  }
  EXTI_ClearITPendingBit(EXTI_Line3); //清除LINE3上的中断标志位
  }
  //外部中断4服务程序
  void EXTI4_IRQHandler(void)
  {
  delay_ms(10);//消抖
  if(KEY0==0) //按键KEY0
  {
  LED0=!LED0;
  LED1=!LED1;
  }
  EXTI_ClearITPendingBit(EXTI_Line4); //清除LINE4上的中断标志位
  }
  exti.h文件
  #ifndef __EXTI_H
  #define __EXTI_H
  #include “sys.h”
  void EXTIX_Init(void);//外部中断初始化
  #endif
  代码解析
  
  实验效果
  
举报

更多回帖

发帖
×
20
完善资料,
赚取积分