STM32-外部中断配置
外部中断配置的整体图:
步骤如下:
- 配置RCC,把我们这里涉及到的外设的时钟都打开,不打开时钟外设是没有办法工作的。
- 配置GPIO,选择我们的端口为输入模式。
- 配置AFIO,选择我们用的这一路GPIO,连接到后面的EXIT。
- 配置EXTI,选择边沿触发方式,比如上升沿,下降沿或双边沿。还有选择触发响应方式,可以选择中断响应和事件响应,这里我们一般都是中断响应。
- 配置NVIC,给我们的中断选择一个合适的优先级。最后,通过NVIC,外部中断信号就能进入CPU了。
- 最后是找到相应的中断函数。
以下是每一步的具体步骤:
- 配置RCC
- 配置GPIOB的时钟
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB,ENABLE);
- 配置AFIO的时钟
RCC_APB2PeriphClockCmd (RCC_APB2Periph_AFIO,ENABLE);
- EXTI和NVIC都不需要开启时钟,因为这两个都是内核的外设,内核的外设都是不需要开启时钟的,相当于和CPU一起都是住在“皇宫”里面的,RCC管的都是内核外的外设,因此管不着NVIC。
- 配置GPIO,这里和都在熟悉不过了,这里根据ST公司的手册推荐,对应EXTI配置相应的模式。
GPIO_InitTypeDef GPIO_InitStructure;//将该枚举类型结构体命名为 GPIO_InitStructure
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//这里因为用到的是EXTI,根据手册推荐我们配置为上拉输入。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_Init (GPIOB,&GPIO_InitStructure);
- 配置AFIO
//AFIO的配置
GPIO_EXTILineConfig (GPIO_PortSourceGPIOB,GPIO_PinSource14);
这条语句的作用相当于把GPIOB的第14个 i\o口和EXTI的第14个外部中断线路连通了。
- 配置EXTI
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line14; //配置第十四个中断线
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能EXTI
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 使用中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
EXTI_Init(&EXTI_InitStructure);
- 配置NVIC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//分组方式每个芯片只能用一种,因此该刚代码只能出现一次,这里建议放在main()函数最开始。
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel =EXTI15_10_IRQn;//STM32中的EXTI10到EXTI15都是合并到了这个通道里。
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStructure);
- 配置相应的中断函数,要找到相应中断通道对应的中断函数,则要到STM32库函数中的启动文件里面找(startup_stm32f10x_md.s)
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line14)== SET)//判断是不是14号中断口进来的中断函数。
{
/*
这里写要中断函数要执行的程序
*/
EXTI_ClearITPendingBit(EXTI_Line14);//清除中断标志位,如果不清楚,则程序会一直卡死在中断程序里面。
}
}
最后要记得在中断程序执行完成后要清楚中断标志位。
所有程序
#include "stm32f10x.h" // Device header
void Countsensor_Init(void)
{
//GPIO的配置
GPIO_InitTypeDef GPIO_InitStructure;//将该枚举类型结构体命名为 GPIO_InitStructure
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//这里因为用到的是EXTI,根据手册推荐我们配置为上拉输入。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_Init (GPIOB,&GPIO_InitStructure);
//时钟配置
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd (RCC_APB2Periph_AFIO,ENABLE);
//AFIO的配置
GPIO_EXTILineConfig (GPIO_PortSourceGPIOB,GPIO_PinSource14);
//配置EXTI
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line14; //配置第十四个中断线
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能EXTI
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 使用中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
EXTI_Init(&EXTI_InitStructure);
//配置NVIC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//分组方式每个芯片只能用一种,因此该刚代码只能出现一次,这里建议放在main()函数最开始。
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel =EXTI15_10_IRQn;//STM32中的EXTI10到EXTI15都是合并到了这个通道里。
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line14)== SET)//判断是不是14号中断口进来的中断函数。
{
/*
这里写要中断函数要执行的程序
*/
EXTI_ClearITPendingBit(EXTI_Line14);//清除中断标志位,如果不清楚,则程序会一直卡死在中断程序里面。
}
}
声明:本文参照b站up主江科大自化协的视频所写,即学习笔记。