20203020

学习日志——外部中断事件控制器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);

编写好这个程序,我们就可以把我们编写的中断程序放到主函数中应用啦,因为好多程序都是些在不同文件中的,再写中断服务函数的时候一定不要忘记引用人家的头文件,用人家的东西不打声招呼总是不行的。
这些基本上就是我学习中断控制器的的一些笔记和总结了,第一次写,还是希望有人能看,有什么错误,大佬们可以批评指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值