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