这几天在调试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的器件手册及编程指导.