STM32
直播中

恐龙之家

8年用户 806经验值
私信 关注
[问答]

STM32外部中断的中断线可以设置哪几种触发方式呢

STM32的外部中断有何优点?

STM32外部中断的中断线可以设置哪几种触发方式呢?



回帖(1)

高文利

2021-11-18 10:47:44
  *STM32学习之外部中断实验粗略了解
  刚开始粗略的学习STM32,写博客就当是学习笔记,简单的记录一下自己的学习过程。//文章是根据正点原子寄存器版中断实验进行撰写
  对于外部中断STM32有一个优点就是它的每一个I/O口都可以当作外部中断的输入口,在使用过程中不用去考虑I/O端口的问题。
  线1~15:对应外部IO口的输入中断。
  线16:连接到PVD输出。
  线17:连接到RTC闹钟事件。
  线18:连接到USB唤醒事件。
  现在暂时先考虑前十六个中断线(0~~15),16~18暂不考虑。
  I/O端口有很多个但是中断线却是只有6个,这时候就要考虑端口与线的映射关系。如下图
  
  (黄色标记需注意角标的变化,红色的线则是是说明在该中断线中只能有一个I/O端口进行中断输入)
  每个PX有16个I/O端口正好和中断线对应。
  中断线可以设置三种触发方式
  (1)上升沿触发
  (2)下降沿触发
  (3)边沿触发
  以及使能!!!!!
  一、中断线与服务函数的关系
  在这里要注意不是所有的中断线都有独立的函数来控制*//为什么不是一一对应?
  void EXTI0_IRQHandler(void)是外部中断 0 的服务函数,
  void EXTI1_IRQHandler(void)是外部中断 1 的服务函数,
  void EXTI2_IRQHandler(void)是外部中断 2 的服务函数,
  void EXTI3_IRQHandler(void)是外部中断 3 的服务函数,
  void EXTI4_IRQHandler(void)是外部中断 4 的服务函数,
  void EXTI9_5_IRQHandler(void)是外部中断 9~5 的服务函数,
  void EXTI15_10_IRQHandler(void)是外部中断 15~10 的服务函数
  在这其中前位线有独立的服务函数,而第6~10则是共用一个函数,第10—15则是另一个函数。
  1、void EXTI0_IRQHandler(void)//示例基于正点原子STM32 F103mini版
  {
  delay_ms(10); //延时 10ms 以消抖
  if(WK_UP==1) //再检测 WK_UP 是否还是为高电平
  {
  LED0=!LED0;
  LED1=!LED1;
  }
  EXTI-》PR=1《《0; //清除已经发生的中断请求
  }`
  二、初始化I/O端口为中断输入与设置优先级
  这里要用到两个函数:
  1、void Ex_NVIC_Config(u8 GPIOx, u8 BITx, u8 TRIM)
  只针对GPIOA~G;不包括PVD,RTC和USB唤醒,且一个函数对应一个I/O口,多个则需要多次调用!!!
  — 比如我们要设置GPIO PA0为上升沿触发则: Ex_NVIC_Config(GPIO_A,0,RTIR);
  —再比如我们要设置GPIO PB4为下降沿触发: Ex_NVIC_Config(GPIO_B,4,FTIR);
  2、void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)
  /NVIC_PreemptionPriority:抢占优先级
  NVIC_SubPriority :响应优先级
  NVIC_Channel :中断编号
  NVIC_Group :中断分组 0~4/
  此函数为设置优先级的高低,要注意两点:
  第一, 如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;
  第二, 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。 而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。
  以下是函数内容
  void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)
  {
  u32 temp;
  MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组
  temp=NVIC_PreemptionPriority《《(4-NVIC_Group);
  temp|=NVIC_SubPriority&(0x0f》》NVIC_Group);
  temp&=0xf; //取低四位
  NVIC-》ISER[NVIC_Channel/32]|=(1《《NVIC_Channel%32);//使能中断位(要清除的话,相反操作就OK)
  NVIC-》IP[NVIC_Channel]|=temp《《4; //设置响应优先级和抢断优先级
  }
  代码中涉及到了几个中断寄存器;
  ISER[8]:这是一个中断使能寄存器组,要使能某个中断,必须设置相应的 ISER 位为 1,使该中断被使能。
  ICER[8]:是一个中断除能寄存器组。
  IP[240]:是一个中断优先级控制的寄存器组,对于STM32来说这是一个十分重要的寄存器!IP 寄存器组由 240 个 8bit 的寄存器组成,每个可屏蔽中断占用 8bit,而 STM32 只用到了其中的 68 个。可屏蔽中断占用的 8bit 并没有全部使用,而是 只用了高 4 位。这 4 位,又分为抢占优先级和子优先级,抢占优先级在前,子优先级在后。
举报

更多回帖

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