stm32之外部中断使用按键控制LED

本章节是为了快速上手使用单片机,需要知道如何用就好。

一中断

1.1 概述

:打断cpu的执行,转而去执行紧急的程序 然后返回原暂停的程序继续执行

举例说明:当你在写作业,家里喊你吃饭(相当于中断触发条件),然后去吃饭,吃完继续写作业

1.2中断的优先级

由于操控中断的寄存器位数是有限的,所以不是说中断的优先级是可以有无数个的

一般抢占优先级和响应优先级是由这个寄存器决定 共有四个位

在hal_init()已经设置了 即四个抢占优先级,0个响应优先级。可以go to一下看原型

当然中断还有很多知识,比如exti nvic等,这里就不说明了 只需要知道如何使用,如何用cubemx配置就好

二分析原理图

同理我们还是看PA0 按键按下的时候是流通的 高电平 所以不按下的时候设置下拉 (具体分析上节有)不一样的是 因为是外部中断,所以我们设置的输入模式不一样 按键按下的时候会产生一个上升沿的电平变化,所以我们选择上升沿触发

PE4 PE3 设置上拉,下降沿触发

三cubemx配置

在上节led的基础上进行配置

生成代码就好

四代码分析

我们打开gpio.c会发现除了引脚初始化多了几个不一样的代码'

cs 复制代码
  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 0);
  HAL_NVIC_EnableIRQ(EXTI0_IRQn);

  HAL_NVIC_SetPriority(EXTI3_IRQn, 1, 0);
  HAL_NVIC_EnableIRQ(EXTI3_IRQn);

  HAL_NVIC_SetPriority(EXTI4_IRQn, 1, 0);
  HAL_NVIC_EnableIRQ(EXTI4_IRQn);

1 官方定义:Sets the priority of an interrupt.

意思就是设置设置中断的优先级。可以go to一下看函数原型 每个参数都有具体的解释

cs 复制代码
void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)

2 使能NVIC中断,这里就理解为开启中断

cs 复制代码
void HAL_NVIC_EnableIRQ(IRQn_Type IRQn)

这里相当于函数处理 EXTI line0/3/4 中断 然后会跳转到一个中断处理函数(是公用的)

会跳转到这里来,中断的处理函数就在这里面写, 官方给的是弱定义(即我们可以自己去重新定义)

我们在GPIO.c里面去写

主函数是不需要写的

这里需要注意,在中断里面如果想使用hal库的延时函数我们需要将这里的优先级设置优先级高

因为官方给的延时函数也是使用中断来完成的,如果延时函数的优先级太低 会导致卡住

中断处理函数

cs 复制代码
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	  HAL_Delay(20);
    switch(GPIO_Pin)
    {
        case KEY0_PIN:
            if (HAL_GPIO_ReadPin(KEY0_PORT,KEY0_PIN) == 0)//按键按下
            {
							HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5); 
            }
            break;
        case  KEY1_PIN :
            if (HAL_GPIO_ReadPin(KEY1_PORT,KEY1_PIN) == 0)//按键按下
            {
            	HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_5); 
            }
            break;
				case KEY_UP_PIN:
					if(HAL_GPIO_ReadPin(KEY_UP_PORT,KEY_UP_PIN) == 1)//按键按下
					{
					  HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5); 
					  HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_5);
					}
		}
}
相关推荐
youcans_29 分钟前
【STM32C5教程】(9)DAC 模拟量信号输出实验
stm32·单片机·嵌入式硬件·stm32c5·cubemx2
智购科技自动售货机工厂32 分钟前
省电40%的底层逻辑:冷热双温售货机基于SaaS的智能温控算法~YH
单片机·嵌入式硬件·百度·架构·emacs
深圳市恒锐丰科技杨生41 分钟前
SS6203D 200V 单路半桥栅极驱动芯片|LeadPower 率能半导体
嵌入式硬件·硬件工程
深圳老胡1 小时前
STM32C5 系列 MCU 的 FreeRTOS 软件架构搭建指南:外设配置与应用实践
笔记·stm32·单片机·代码规范
霖霖7141 小时前
【ESP32笔记】I2S的音频录制与播放
笔记·单片机·mcu·音视频
深圳市恒锐丰科技杨生1 小时前
SS6200 半桥栅极驱动芯片|LeadPower 率能半导体
嵌入式硬件·硬件工程
HQB20261 小时前
EG11732|屹晶微电子 30V 内置 80A 功率管大电流同步降压 DC‑DC
嵌入式硬件·硬件工程
LCG米1 小时前
STM32 HardFault故障定位实测:压栈帧寄存器解析、CFSR故障源判读与出错地址回溯
前端·javascript·stm32·单片机·嵌入式
yuehuaxin012 小时前
LP3717BSL 芯茂微|SOP8L 自供电 PSR,SEL 电阻调峰值电流,12W 充电器物料替代评估笔记
嵌入式硬件·适配器模式·智能硬件
G***技13 小时前
杰和科技亮相中国工博会:嵌入式边缘AI驱动自动化场景落地
嵌入式硬件·边缘ai·工博会