STM32 外部中断实现

时间:2023-01-27 19:36:23

这几天在调试mpu6050,期间想试试6050的DMP.看了很多例子都要用中断触发dmp fifo数据的读取,之前对smt32外部中断也不是很了解,正好借此机会实践一下.

以下都是外部中断的实现过程以及注意事项.

实现过程:

首先利用外部按键来测试中断.我的按键硬件连接是stm32 pin直接连接外部案件,所以在定义pin时需要定义为input且加上内部的上拉电阻.

首先是初始化RCC,初始化时选择bankA

void RCC_INIT(){
	//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
}

初始化GPIO,外部中断连接到bankA pin0上

void GPIO_INIT(){
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

}
初始化EXTI,也就是把gpio与中断做关联

void EXTI_INIT(){
	EXTI_InitTypeDef EXTI_InitStructure;
	EXTI_ClearITPendingBit(EXTI_Line0);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
	EXTI_InitStructure.EXTI_Line = EXTI_Line0;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//EXTI_Trigger_Falling;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);
}

注意这里"EXTI_ClearITPendingBit(EXTI_Line0);"这李line的num一定于pin的num相同,否则不能建立内部连接


初始化NVIC,中断注册

void NVIC_INIT(){
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//这个channel要与io号相匹配,比如pin0 要用exti0; //PPP外部中断线
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}

再有一个init_IRQ调用

void init_IRQ(){
	RCC_INIT();
	GPIO_INIT();
	NVIC_INIT();
	EXTI_INIT();
}
在你想初始化irq的地方调用就行了.

最后是中断相应函数

void EXTI0_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line0) != RESET)
    {
        trace_printf("key down !!!!\n");
        EXTI_ClearITPendingBit(EXTI_Line0); //清除标志
    }
}
这里仅判断中断,打印并清除中断标志.我的这段相应函数只能放在main.cpp中.在其他文件中会导致cpu跑飞...

好了,以上代码就能建立一个外部中断并对其进行相应了,更详细的中断说明可以参考stm32的器件手册及编程指导.