前言
本次我们来学习开发板的按键以及外部中断实验
一、实验原理
1.根据原理图我们可以看到,开发板的四个按键一端10k的上拉电阻接入电源,另一端是直接接入GND的,因此当按键未按下时,IO口读取的状态为高电平,当按键按下后,IO口读取的状态则为低电平,因此我们有两种方式去判断按键是否按下↓
1.在主循环中,循环判断IO口的状态,当IO状态为低电平时,则表示按键被按下。
2.使用外部中断,配置下降沿触发,当按键被按下时,状态由高电平转换为低电平,此时外部中断被触发一次。
2. 外部中断是什么?
首先我们要理解什么是中断。
想象一个场景:你在家里看书学习,这时候突然来电话了。你的做法是停止学习去接电话,电话打完再放下电话继续学习。这一个过程就体现了中断的思想。我们抽象一下,把自己想象成一个单片机系统,看书就是正在执行的主任务,如果没有外界干扰,这个系统会一直执行当前的主任务。而当外部有改变(电话响了)的时候,系统会第一时间响应,从主任务跳转到这个紧急任务中,这个突发的事件就是(外部)中断,而系统处理的紧急任务则是中断处理函数。当紧急任务(接电话)完毕之后,系统又会回到最初的主任务中。这就是MCU的外部中断过程。
3. STM32的外部中断线
- STM32的每个IO都可以作为外部中断输入。
- STM32的中断控制器支持19个外部中断/事件请求:
线0~15:对应外部IO口的输入中断
线16:连接到PVD输出。
线17:连接到RTC闹钟事件。
线18:连接到USB唤醒事件。
每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。
4. STM32的外部中断线与IO口映像,如下图所示,由于所有不同分组的相同位号IO口对应同一条中断线,因此STM32最多只能有16个单独的外部IO中断(而开发板的B1和B4按键对应PB0和PA0两个同位号的IO,因此我们将按键B4设置为循环判断按下的方式,B1至B3按键使用外部中断方式)。
二、配置步骤
2.配置GPIO,先配置LED灯,然后将PB0-PB2设置为外部中断模式,PA0设置为输入模式。
3.将四个IO口配置上拉电阻,同时将PB0-PB2配置为下降沿触发中断,并为四个IO自定义名称为B1-B4
4.使能外部中断,为外部中断配置抢占优先级以及子优先级,然后点击右上角Generate Code生成Keil5代码。
三、循环判断按键按下
1.在main.c中输入相应的代码。
//判断B4按键状态 如果是低电平则表示按下了
if(HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin) == GPIO_PIN_RESET){
HAL_Delay(1); //延时1ms消除抖动
//再次判断是否按下
if(HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin) == GPIO_PIN_RESET){
//翻转LED1 2 3的状态
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10);
//等待松手
while(HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin) == GPIO_PIN_RESET);
}
}
2.实验现象,按下B4按键后,LED1-LED3状态翻转
四、外部中断判断按键按下
1.在main.c中重写外部中断回调函数,并判断是哪条中断线按下。
//外部中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
//如果按键1按下
if(GPIO_Pin == B1_Pin){
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_11); //翻转LED4
}
//如果按键2按下
if(GPIO_Pin == B2_Pin){
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_12); //翻转LED5
}
//如果按键3按下
if(GPIO_Pin == B3_Pin){
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13); //翻转LED6
}
}
2.实验现象,按下B1 B2 B3时,对应的LED4 5 6状态翻转
总结
以上就是开发板的按键以及外部中断实验,如有错误,感谢指正。
鉴于官方开发板售价过高,本人自己制作了一款蓝桥杯嵌入式开发板,完全兼容官方的开发板,并且接下来会基于这款开发板进行学习和制作学习日志,到时候所拍实物图片会与官方开发板略有不同,如果有意向一起学习的同学也可以私聊我互相学习交流,ps:
找我低价买块开发板自己学习也是可以的~ 。