STM32学习笔记05-EXTI中断

首先是需要用到的外设有:GPIO、AFIO、EXTI、NVIC

GPIO:配置引脚的输入输出模式

AFIO:负责选择对应的引脚或者进行引脚重映射。

AFIO上连接了多个引脚,比如PA0~PA15,PB0~PB15,AFIO有多个输入,但是只有16个输出,所以PA0和PB0、PA1和PB1……不能同时使用。

EXTI:为边缘检测器。

用于配置触发相关参数,比如允许哪根输入线等,触发边缘为上升沿还是下降沿。

EXIT的输入有20个,其中16个接AFIO的输出,4个接事件输出(暂不了解)。

EXIT的输出可以连接到NVIC用于触发中断或者其他外设上用于驱动其他外设工作,实现硬件全自动(这个功能真强)。

NVIC:为触发管理器,负责中断的开关以及优先级控制。

NVIC的输入来源于EXTI,当EXTI触发一个中断时,如果NVIC允许该中断,则向CPU发出中断指令,CPU执行对应中断函数。

有中断嵌套或者中断同时发生时,NVIC根据设置的优先级来裁决,最终决定CPU执行哪个中断。

他们之间个关系如下图所示:

 

编程思路:开启RCC时钟-->配置GPIO-->配置AFIO-->配置EXIT-->配置NVIC-->写中断函数

中断计次演示代码:

#include "stm32f10x.h"                  // Device header
/*
1、配置RCC,把外设时钟打开(EXTI默认开启,NVIC内核外设默认开启)
2、配置GPIO外设,设置为输入模式
3、配置AFIO外设,将GPIO连接到EXTI
4、配置EXTI外设,选择触发方式(上升沿……),响应方式(中断或事件)
5、配置NVIC外设,配置中断优先级
*/
uint16_t count;
void CountSensor_Init(void)
{
	//开启RCC时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	//配置GPIO
	GPIO_InitTypeDef GPIO_Initstruct;//gpio配置结构体
	GPIO_Initstruct.GPIO_Mode=GPIO_Mode_IPU;//gpio模式:上拉输入
	GPIO_Initstruct.GPIO_Pin=GPIO_Pin_0;//gpio引脚0
	GPIO_Initstruct.GPIO_Speed=GPIO_Speed_50MHz;//gpio频率50M
	GPIO_Init(GPIOB,&GPIO_Initstruct);
	//配置AFIO
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);//使用GPIOB组的0号引脚,也就是PB0
	//配置EXTI
	EXTI_InitTypeDef EXTI_Initstruct;
	EXTI_Initstruct.EXTI_Line=EXTI_Line0;//0号输入线
	EXTI_Initstruct.EXTI_LineCmd=ENABLE;//启用
	EXTI_Initstruct.EXTI_Mode=EXTI_Mode_Interrupt;//响应方式:中断
	EXTI_Initstruct.EXTI_Trigger=EXTI_Trigger_Falling;//触发边缘
	EXTI_Init(&EXTI_Initstruct);
	//配置NVIC
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组
	NVIC_InitTypeDef NVIC_Initstruct;
	NVIC_Initstruct.NVIC_IRQChannel=EXTI0_IRQn;//EXTI0中断
	NVIC_Initstruct.NVIC_IRQChannelCmd=ENABLE;//开启
	NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority=1;//响应优先级
	NVIC_Initstruct.NVIC_IRQChannelSubPriority=1;//抢占优先级
	NVIC_Init(&NVIC_Initstruct);
}
//中断指定函数名
void EXTI0_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line0)==SET)
	{
		count++;
		EXTI_ClearITPendingBit(EXTI_Line0);
	}
}
//返回中断统计
uint16_t CountSensor_Get(void)
{
	return count;
}

  

知识点:

1、中断函数的名称可以在startup_stm32f10x_md.s文件中找到,名称为:中断名_IRQHandler

 

 

posted @ 2023-07-23 14:53  Lin_zzZ  阅读(40)  评论(0编辑  收藏  举报