【STM32HAL库】外部中断

发布于:2024-04-26 ⋅ 阅读:(20) ⋅ 点赞:(0)

目录

一、中断简介

二、NVIC

1.寄存器

2.工作原理

3.优先级

4.使用NVIC

三、EXTI

1.简介

2.AFIO:复用功能IO,主要用于重映射和外部中断映射配置​编辑

3. 中断使用

 4.HAL库配置使用


一、中断简介

中断的意义:高效处理紧急程序,不会一直占用CPU资源

 NVIC:嵌套向量中断控制器,属于内核,支持256个中断(16内核,240外部),支持256个优先级,允许裁剪为16个(ST的)

中断向量表:定义一块固定的内存,以四字节对齐,存放在各个中断服务函数程序的首地址,定义在启动文件中

二、NVIC

1.寄存器

2.工作原理

3.优先级

优先级:一般一个工程中只进行一次优先级分组就行,否则可能会导致优先级混乱,如果真的设置了多次,那就会以最后一次设置为准

注意:NVIC的函数都存放在cortex.c里面

4.使用NVIC

三、EXTI简介

EXTI:外部(扩展)中断事件控制器,F1包含20个产生事件/中断请求的边沿检测器,即F120EXTI线

中断:进NVIC,有服务函数,需要CPU处理

事件:不进NVIC,仅用于内部硬件自动控制的,如TIMDMAADC

2.AFIO:复用功能IO,主要用于重映射和外部中断映射配置

3. 中断使用流程

 4.HAL库配置使用步骤

四、HAL库实现

利用按键进行中断的实现,由图,按键是外部下拉了,所以配置下拉输入,然后中断触发方式可以配置为上升沿触发

与标准库不同的是,这个触发方式是直接可以用GPIO结构体直接配置

回调函数是已经被库弱定义了,我们直接再次定义一下就行,但是不用我们去声明

#ifndef __EXTI_H
#define __EXTI_H

#include "./SYSTEM/sys/sys.h"
void EXTI_Init(void);



#endif
#include "exti.h"

void EXTI_Init(void)
{
    //开启时钟
	__HAL_RCC_GPIOA_CLK_ENABLE();
	__HAL_RCC_GPIOC_CLK_ENABLE();
	__HAL_RCC_AFIO_CLK_ENABLE();
	
    //初始化结构体
	GPIO_InitTypeDef GPIO_Init;
	
	GPIO_Init.Pin = GPIO_PIN_0;
	GPIO_Init.Mode=GPIO_MODE_IT_RISING;//设置为上升沿触发中断
	GPIO_Init.Pull = GPIO_PULLDOWN;//外部下拉
	HAL_GPIO_Init(GPIOA,&GPIO_Init);
	GPIO_Init.Pin = GPIO_PIN_13;
	HAL_GPIO_Init(GPIOC,&GPIO_Init);

	HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);//优先级分组
	
	HAL_NVIC_SetPriority(EXTI0_IRQn,0, 1);//配置优先级
	HAL_NVIC_SetPriority(EXTI15_10_IRQn,0, 2);
	
	HAL_NVIC_EnableIRQ(EXTI0_IRQn);//使能中断
	HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
}

void EXTI15_10_IRQHandler(void)//中断服务函数
{
	HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);//HAL库中断处理共用函数
}

void EXTI0_IRQHandler()//中断服务函数
{
	HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);//HAL库中断处理共用函数
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//HAL库数据处理回调函数
{
	if(GPIO_Pin==GPIO_PIN_13)
	{
		if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)==1)//如果按键按下
		{
			HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);//翻转电平
		}
	}
	if(GPIO_Pin==GPIO_PIN_0)
	{
		if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==1)
		{
			HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
		}
	}
}

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "led.h"
#include "key.h"
#include "exti.h"



int main(void)
{
    HAL_Init();                              /* 初始化HAL库 */
    sys_stm32_clock_init(RCC_PLL_MUL9);      /* 设置时钟, 72Mhz */
    delay_init(72);                          /* 延时初始化 */
    LED_Init();                              /* LED初始化 */
    KEY_Init();
	EXTI_Init();
    while(1)
    { 

		
    }
}