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

浙公网安备 33010602011771号