0%

EXTI入门

Main Takeaway

Following 哈工深上传到B站的电控组培训来入门robomaster电控组,我购买了普中科技玄武套餐开发板作为硬件。

本篇介绍我学习EXIT的见闻

EXTI

中断简介

中断指计算机运行过程中,出现某些意外情况需要主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。中断是实现多线程设计的必要条件

EXTI:(External interrupt/event controller)外部中断/事件控制器

NVIC

NVIC的全称是Nested vectoredinterrupt controller,即嵌套向量中断控制器

能够打断当前代码执行流程的事件分为异常(exception)中断(interrupt),他们都被编排在中断向量表(在stm32中文参考手册中可查找,在stm32的启动文件中也能找到eg:startup_stm32f103xe.s)里面。

  • 编号为负的内核异常不能被设置优先级,如复位(Reset)、不可屏蔽中断 (NMI)、硬错误(Hardfault)。从编号 7 开始的为外部中断,这些中断的优先级都是可以自行设置的。
  • NVIC的核心功能是中断优先级分组、中断优先级的配置、读中断请求标志、清除中断请求标志、使能中断、清除中断等.
  • 外部中断信号从核外发出,信号最终要传递到NVIC(嵌套向量中断控制器)。
  • NVIC跟内核紧密耦合,它控制着整个芯片中断的相关功能。

中断优先级分组

STM32 的中断向量具有两个属性:抢占,响应

  • 抢占(编号越小,优先级越高),是指打断其它中断的属性,即因为具有这个属性,会出现嵌套中断(在执行中断服务函数 A 的过程中被中断 B 打断,执行完中断服务函数 B 再继续执行中断服务函数 A)。

  • 响应(编号越小,优先级越高)属性则应用在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,如果两个中断同时到达,则先处理响应优先级高的中断。(不能打断其他中断)

  • 在STM32中,抢占优先级和响应优先级的数量由一个 4 位的数字来决定,把这个 4 位数字的位数分配成抢占优先级部分和响应优先级部分。(都写在寄存器内)

image-20230607154202250

Tips:两个中断不可能同时来,所以响应优先级主要给出了一种响应的优先队列,当多个中断向量的抢占优先级相同时,它们不会互相打断,后续的排队会按照响应优先级排队。

EXTI介绍

中断引脚的序号需要不一样才能配置不停的中断(F1系列的硬件实现)

Tips:F1系列中断是共用的eg:中断/事件线EXTI0,输入源PX0(X可为A,B,...I)PA0用了则PB0就用不了。

EXTI有两大模式;中断模式和事件模式

  • 中断模式产生中断:把输入信号输入到NVIC中,进一步执行中断服务函数,实现功能,这是软件级别的。
  • 事件模式产生事件:传输一个脉冲信号给其他外设使用,并且这是电路级别的信号传输,不需要软件处理,硬件直接触发
image-20230821013658350
  • 23:并行传输数据,和这个寄存器一样的有23个
  • 边沿检测电路:一个符合则输出1

每一种模式都可配置为上升沿触发、下降沿触发,以及上升下降沿触发三种触发方式

中断函数的实现

要产生中断,必须先配置好并使能中断线。根据需要的边沿检测设置2个触发寄存器,同时在中断屏蔽寄存器的相应位写’1’允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置’1’。在挂起寄存器的对应位写’1’,将清除该中断请求。

如果需要产生事件,必须先配置好并使能事件线。根据需要的边沿检测通过设置2个触发寄存器,同时在事件屏蔽寄存器的相应位写’1’允许事件请求。当事件线上发生了需要的边沿时,将产生一个事件请求脉冲,对应的挂起位不被置’1’。

image-20230607154902377

通过在软件中断/事件寄存器写’1’,也可以通过软件产生中断/事件请求。

  • 一般来说单片机的中断发生有两个条件,一是中断标志位置位,二是中断允许(中断屏蔽寄存器),如果这两个条件都满足则进入中断,因为正常情况下中断一直是允许的,那么只能通过标志位来区分是否有中断挂起

  • 中断标志位:挂起请求寄存器设置。

    PRx:挂起为(pending bit):

    0没有发生触发请求,1发生了选择触发请求

    当在外部中断线上发生了选择的边沿事件,该位被置1。在该位写入1可以清楚它,也可以通过改变边沿检测的极性清除。

  • 如果进入中断不清除标志位,那么这一中断服务程序结束后由于标志位还是置位的并且中断是允许的,那么还会再次进入该中断,就会发生一直在执行中断程序的情况

  • 周期性中断是由定时器辅助完成的,只要定时时间到,硬件就会自动置位标志位,这时中断发生,定时器还在运行,与中断处理是并行的没有冲突,因此周期性的中断不是从中断标志位清零开始的。

    Tips:MCU和定时器是并行的,互不影响

  • 如果中断程序没有执行完并且一下个中断又来了,那么硬件还是会自动置位标志位的,如果在这之前已经清零标志位那么中断结束后会再进入一次该中断,如果这时还没有清除中断标志位,则第二个中断无效。

    Tips:有中断,中断标志位变为1,不清0,则不能响应新的中断。

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* @brief EXTI line detection callbacks.
* @param GPIO_Pin: Specifies the pins connected EXTI line
* @retval None
*外部中断的回调函数,hal库
*/
__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(GPIO_Pin);
/* NOTE: This function Should not be modified, when the callback is needed, the HAL_GPIO_EXTI_Callback could be implemented in the user file */
}

Tips: _weak在其他地方重新定义该函数此_weak定义的函数会被覆盖,即我们要重写void HAL_GPIO_EXTI_Callback(uin16_t,GPIO_Pin);函数

实验

按键扫描

根据需要确定GPIO模式:选择下拉输入还是上拉输入or浮空输入,通过反复读取按键状态是否为高电平判断按键是否被触发

按键扫描的原理: 按键的两个引脚的一端通过下拉电阻拉倒低电平,另一端接着电源。当按下开关时,输入引脚为高电平。通过反复读取按键状态是否为高电平判断按键是否被触发。

notes:

  • 记得在cubeMX的GPIO把NVIC设置为enable

  • 在keil 5中添加新文件:先将文件放在同一目录下,右键add添加.c文件/双击add即可,.h文件用#include包含即可

  • 机械按键的抖动,毛刺,延时再判断,hal_delay是用systick实现的

    Tips:设置中断优先级(比时钟低,不然不能HAL_Delay(),会陷入死循环)

如下图:数码管8位一般定义为:DP G F E D C B A

B C亮表示1,即00000110=0x06;

A B G E D亮表示2 即01011011=0x5b;

依次类推

a1ec08fa513d26975dfc13c055fbb2fb4316d87b

References