学习日志——外部中断事件控制器EXTI
我用的是野火F429挑战者的板子,他的内核上有一个异常响应系统用于处理中断和事件,其中系统异常有10个,外部中断有91个,EXTI属于外部中断中的一个。有些异常的优先级被固定了,而且有特殊的功能,比如复位。大多是的优先级都是可以编程的。
NVIC嵌套向量中断控制器
顾名思义嘛,嵌套向量中断,跟中断的嵌套有关系,怎么个嵌套法呢,它主要的功能就是给每一个中断控制器分配顺序,排在前面的做事可以打断后面的做事,但后面的打断不了前面的,好比3在做事,2过来把他打断,1想做事就把2打断了,这不就是打断中的打断,不就嵌套了嘛
EXTI控制器
EXTI控制器有19个外部事件中断、LINE16、17、18、19都不能对I/O口进行操作,而且他们的操作都给I/O口订好了标号比如PA0、PB0、PC0等都采用LINE0这条线,这说明每一条线只能实现一个I\O口进行中断操作
程序配置
第一步要配置EXTI所连接的GPIO
比如要产生异常,你必须要告诉EXTI检测的是哪个I/O吧,不然我怎么产生中断,什么时候让我中断呢,我在学习F429的时候用的是按键检测,根据原理图中的KEY,当按键不按下的时候是低电平(GND把他拉低),当按键按下的时候是高电平,这不就产生了中断的标志,告诉我你一升高,我中断就来了
/*开启KEY相关的GPIO外设时钟*/
RCC_AHB1PeriphClockCmd ( RCC_AHB1Periph_GPIOA, ENABLE);
/*选择要控制的GPIO引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
/*设置引脚模式为输入模式*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
/*设置引脚为浮空模式*/
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
/*调用库函数,使用上面配置的GPIO_InitStructure初始化GPIO*/
GPIO_Init(GPIOA, &GPIO_InitStructure);
在配置EXTI初始化的结构体编译程序时
/*Line是用于配置产生中断或者事件的线*/
`EXTI_InitStruct.EXTI_Line = EXTI_Line0;
/*Mode 模式,有中断和事件两个选项*/
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
/*Trigger 即配置触发模式(上升沿触发、下降沿触发、上升沿和下降沿都出发选项)*/
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
/* LineCmd 即配置使能或者失能*/
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);`
这个时候你要想到你只是选择了EXTI0这个中断控制器,咱们还没有给他标序号,告诉他自己属于一个什么地位,这时候我们就需要用的NVIC这个工具,给他添加一个序号
void EXTI_NVIC_Config(void)
{
/*初始化NVIC的结构体*/
NVIC_InitTypeDef NVIC_InitStruct;
/*告诉他我要给哪一个标序*/
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
/*抢占优先级标个序*/
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
/*子优先级再来一个*/
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
/*使能或失能*/
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
这个时候我们就给他标完了,在把这个函数引用到咱们的中断程序中,就形成了一个完整的中断程序。
中断服务函数
必是有中断了嘛,中断服务函数是干嘛的,咱们前面设置了中断之后,1打断了2干事,1总要干点事吧,你不干活凭什么打断2呢,咱们得告诉1打断2之后我们要做什么事情,干什么活,这个中断服务函数是写在stm32f4xx_it.c文件中的而且函数名是不能随便起的,那怎么起函数名的,再启动文件中就可以找到
void EXTI0_IRQHandler(void)
{
if((EXTI_GetFlagStatus(EXTI_Line0)) !=RESET )
{
/*中断之后要干的活*/
}
/*清除中断的值,防止一直卡在中断中*/
EXTI_ClearITPendingBit(EXTI_Line0);
编写好这个程序,我们就可以把我们编写的中断程序放到主函数中应用啦,因为好多程序都是些在不同文件中的,再写中断服务函数的时候一定不要忘记引用人家的头文件,用人家的东西不打声招呼总是不行的。
这些基本上就是我学习中断控制器的的一些笔记和总结了,第一次写,还是希望有人能看,有什么错误,大佬们可以批评指正!