由於各种外设都可以有中断,今天我们就来实际使用一种比较简单的中断-外部中断,但却是非常重要的功能。
外部中断顾名思义就是在外部来发起中断请求,例如用一个按钮连接到脚位,当按钮按下时,脚位产生电位的变化,就可以透过按钮来发起中断。
在讲更详细一些,STM32进入中断的时机有两种,一种是低电位变高电位时,也就是电位上升的过程(上升缘检测);另一种是高电位变低电位时,也就是电位下降的过程(下降缘检测),这两种都属於边缘检测,也就是只有在电位改变时才会检测到。
开发版上已经有现成的按钮可以使用,不必自己在接线路,非常方便。
由datasheet可以知道,按钮是连接在PC13脚位上。也就是说当你按下按钮後,PC13就会输入高电位,而放开则为低电位。我们就可以利用按钮来让电位从低变高(上升缘),从而触发中断。实际设定如下:
__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)。
实际使用时,不一定要使用开发板上面的按钮,可以设为任何一个脚位,我们就可以利用输入脚位的电位不同来触发中断。例如我们可以外接几个按钮,每个按钮分别代表不同的任务,当按下时就会触发中断执行相应的任务。
前言 昨天知道了怎麽使用 SELECT 和 WHERE 之後,就要来实际做做看啦 (先附上整段程序码...
Vortex 现在我们有火焰了,但是呢如果今天我的火焰想要有点这种效果呢。 感觉有个台风在那里影响火...
集合物件 集合物件代表 "一个放置一堆东西的地方" 它可以是有序 有可以是无序的...
swift 开启Xcode, 点选 Create a new Xcode project swift...
相较於资料湖,另一个更常见的大数据储存系统是 — 资料仓储。和资料湖一样,资料仓储也用来储存巨量资料...