【Day13】:EXTI外部中断/事件控制器

外部中断

由於各种外设都可以有中断,今天我们就来实际使用一种比较简单的中断-外部中断,但却是非常重要的功能。
外部中断顾名思义就是在外部来发起中断请求,例如用一个按钮连接到脚位,当按钮按下时,脚位产生电位的变化,就可以透过按钮来发起中断。
在讲更详细一些,STM32进入中断的时机有两种,一种是低电位变高电位时,也就是电位上升的过程(上升缘检测);另一种是高电位变低电位时,也就是电位下降的过程(下降缘检测),这两种都属於边缘检测,也就是只有在电位改变时才会检测到。
https://ithelp.ithome.com.tw/upload/images/20210915/20141525hm7AhQS6aD.jpg

实作-利用开发版上的按钮执行外部中断

开发版上已经有现成的按钮可以使用,不必自己在接线路,非常方便。
https://ithelp.ithome.com.tw/upload/images/20210915/20141525rgvTMebjTV.jpg
由datasheet可以知道,按钮是连接在PC13脚位上。也就是说当你按下按钮後,PC13就会输入高电位,而放开则为低电位。我们就可以利用按钮来让电位从低变高(上升缘),从而触发中断。实际设定如下:

  1. 先将PC13脚位设为GPIO_EXTI_13
    https://ithelp.ithome.com.tw/upload/images/20210915/20141525vP1j7C6mi3.jpg
  2. 接着可以在System Core 内的 GPIO选择刚刚的PC13脚位来设定GPIO mode,可以设定触发中断的时机。
  3. 接着在NVIC的地方将刚刚脚位的中断设为Enabled
    https://ithelp.ithome.com.tw/upload/images/20210915/20141525WpDJiIBai8.jpg
    接下来我们来写程序吧
    外部中断触发的函式是:
__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
   */
}

「触发这个函式」的意思就是呼叫这个函式,当按钮按下时,脚位侦测到上升缘,就会进行中断触发,
函式的开头有__weak,用在函式前,代表这个函式是弱定义,当你的程序码其他地方有对这个函式就其他地方做定义,就会以新的定义为主,那有人可能会问,这样他定义这个有什麽用呢?
就是给你复制的...通常不熟悉的人很难记住函式的API,照着打出来,因此你可以先到gpio.c当中找到这些程序码,直接复制到main.c当中,就可以直接使用了。
实际程序码演示:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  /* Prevent unused argument(s) compilation warning */
	if(GPIO_Pin == GPIO_PIN_13){
		x = (x == 0)? 1:0;
	}
}

记得在全域设一个变数x
这段函式可以放在程序码任何一个位置,我通常会放在 USER CODE BEGIN/END 4 之间
在EXTI模式当中,你只能用数字不同的脚位,例如PE9,PC9不可同时都为EXTI模式,一次只能有一个,从他的中断函式也可以知道,他的参数只有GPIO_PIN,他只知道数字多少,而不知道英文(A~F)哪一个。若你有很多的外部中断,你就可以用if-else的方式来决定哪一个脚位的中断要做什麽事。
编写完程序後,我们就可以用利用按钮来改变x的值啦~每按一次按钮x值就会改变(0变1或1变0)。

实际使用时,不一定要使用开发板上面的按钮,可以设为任何一个脚位,我们就可以利用输入脚位的电位不同来触发中断。例如我们可以外接几个按钮,每个按钮分别代表不同的任务,当按下时就会触发中断执行相应的任务。


<<:  Day 27 实作 user_bp (5)

>>:  D19 - TiDB Binlog

铁人赛 Day10-- PHP SQL基本语法(五) -- 帐密登入验证 & mysqli_query

前言 昨天知道了怎麽使用 SELECT 和 WHERE 之後,就要来实际做做看啦 (先附上整段程序码...

Day 29

Vortex 现在我们有火焰了,但是呢如果今天我的火焰想要有点这种效果呢。 感觉有个台风在那里影响火...

[Day07] swift & kotlin 入门篇!(5) 基础语法-集合物件

集合物件 集合物件代表 "一个放置一堆东西的地方" 它可以是有序 有可以是无序的...

[Day11] swift & kotlin 实作篇!(2) 建立专案

swift 开启Xcode, 点选 Create a new Xcode project swift...

DAY 5 Big Data 5Vs – Volume(容量) - RedShift

相较於资料湖,另一个更常见的大数据储存系统是 — 资料仓储。和资料湖一样,资料仓储也用来储存巨量资料...