STM32
直播中

的撒的

9年用户 724经验值
擅长:可编程逻辑
私信 关注
[问答]

详解STM32F103的外部中断

STM32F103的外部中断是什么意思?
使用STM32F103的外部中断有哪些注意事项?

回帖(1)

夏涌革

2021-11-16 10:20:07
  一、STM32F103知识总结-外部中断
  1.中断的相关概念
  (1)。定义: 专业说法:中断指的是计算机运行中,正在运行事情被打断,需要紧急处理
   中断是指一个突发事件,中止了CPU当前的工作,转而处理突发事件,处理完成后
   再回到当前的工作继续执行。
   STM32允许多种多样的中断,如外部IO、ADC、USART、I2C、RTC、USB、PVD等
  
  (1)。中断基础知识:
  cortex-m3支持256个中断,其中包含了16个内核中断,240个外部中断。(本博文只介绍60个外部可屏蔽中断)
  stm32只有84个中断,包括16个内核中断和68个可屏蔽中断
  stm32f103上只有60个可屏蔽中断,f107上才有68个中断
  先占优先级也就是抢占优先级,概念等同于51单片机中的中断。假设有两中断先后触发,已经在执行的中断先占优先级如果没有后触发的中断 先占优先级更高,就会先处理先占优先级高的中断。也就是说又有较高的先占优先级的中断可以打断先占优先级较低的中断。这是实现中断嵌套的基础。
  次占优先级,也就是响应优先级,只在同一先占优先级的中断同时触发时起作用,先占优先级相同,则优先执行次占优先级较高的中断。次占优先级不会造成中断嵌套。 如果中断的两个优先级都一致,则优先执行位于中断向量表中位置较高的中断。
  2.NVIC嵌套向量中断器
  嵌套向量中断控制器;用于为中断分组,从而分配抢占优先级和响应优先级;只要有中断就必须配置NVIC相关函数。从core_cm3.c及core_cm3.h和misc.c及misc.h中配置NVIC。
  对于NVIC,其重要知识点就是优先级分组(抢占优先级)和子优先级(响应优先级),STM32F1XX和STM32F4XX都只使用了8位寄存器的高四位[7:4]
  
  (1)。抢占优先级和响应优先级的联系和区别(重要原则):
   1.高优先级的抢占优先级可以打断正在进行的低抢占优先级中断的
   2.抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断
   3.抢占优先级相同的中断,当两个中断同时发生的情况下,哪一个的响应优先级高,哪个先执行
   4.如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行哪个中断
  下面两张图分别为分组:
  
  
  (2)。寄存器,工作器分析:(了解)
  typedef struct
  {
  __IO uint32_t ISER[8]; //中断使能寄存器(重要)
  uint32_t RESERVED0[24]; /保留位寄存器
  __IO uint32_t ICER[8]; //中断清除寄存器(重要)
  uint32_t RSERVED1[24];
  __IO uint32_t ISPR[8]; //中断使能悬起寄存器
  uint32_t RESERVED2[24];
  __IO uint32_t ICPR[8]; //中断清除悬起寄存器
  uint32_t RESERVED3[24];
  __IO uint32_t IABR[8]; //中断有效位寄存器
  uint32_t RESERVED4[56];
  __IO uint8_t IP[240]; //中断优先级寄存器(8Bit wide)最为重要
  uint32_t RESERVED5[644];
  __O uint32_t STIR; //软件触发中断寄存器
  } NVIC_Type;
  (3).NVIC代码配置:
  一、配置分组:
  NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);//上面有分组状态
  二、NVIC初始化:
  NVIC_InitTypeDef NVIC_InitStruct; //定义结构体变量
  NVIC_InitStruct.NVIC_IRQChannel=EXTI9_5_IRQn; //中断线*选择中断源*
  NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; //使能中断
  NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2; //抢占优先级 2
  NVIC_InitStruct.NVIC_IRQChannelSubPriority=2; //子优先级(响应优先级) 2
  NVIC_Init(& NVIC_InitStruct);
  (4)。中断线-中断源:
  
  
  
  4.外部中断、事件控制器(EXTI):
  
   STM32F1支持将所有GPIO设置为中断输入。
   外部IO可由上沿、下沿、高低电平的三种方式触发。
   可选择中断或事件触发。
  (1)。中断触发模式:
  
  (2)中断与事件:
  
  (3)外部中断/事件线路映射:
  
  额外说明图:
  
  (4)。中断开启过程:
  主要过程:中断——分组——具体中断设置到组里面
  1.在RCC里将要使用的IO口时钟和复位时钟打开
  2.在GPIO里将该IO口映射到相对应的外部中断
  3.在NVIC里将该中断通道打开
  (5)。中断固件库函数:
  
  (6)。中断代码实现:
  一、中断初始化:
  NVIC_InitTypeDef NVIC_InitStruct; //定义结构体变量
  EXTI_InitTypeDef EXTI_InitStruct; //定义结构体变量
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //启动GPIO时钟 (需要与复用时钟一同启动)
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);//配置端口中断需要启用复用时钟(此配置是必须的!!!!)
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4); //定义 GPIO 中断(PA4)
  EXTI_InitStruct.EXTI_Line=EXTI_Line4; //定义中断线(上图的额外:EXTI4)
  EXTI_InitStruct.EXTI_LineCmd=ENABLE; //中断使能
  EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt; //中断模式为 中断
  EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling; //下降沿触发
  EXTI_Init(& EXTI_InitStruct);//初始化
  二、中断函数:
  void EXTI0_IRQHandler(void)
  {
  if(EXTI_GetITStatus(EXTI_Line0)!=RESET)
  {
  GPIO_WriteBit(GPIOB,GPIO_Pin_0,(BitAction)(0)); //PB1接口输出低电平0
  }
  EXTI_ClearITPendingBit(EXTI_Line0);//清除LINE0上的中断标志
  }//此项目为打开LED灯
  (7)。中断的注意事项:
  中断函数的取名必须根据startup_stm32f10x_md.s上来:
  
举报

更多回帖

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