stm32学习之中断

								stm32学习之中断事件
    相信很多小伙伴们早已在51系列的板子上接触中断,大概的概括便是:正在看电影的你,突然来了快递,你暂停了电影去签收了快递,回来继续看电影这便是一级中断。而多级中断也是一样,优先级高的就优先处理,就如在你去签收快递的时候,电话突然来了,电话的优先级更高,所以优先接电话。

在这里插入图片描述
而STM32F10x 芯片有 84 个中断通道,包括 16 个内核中断和 68 个可屏蔽中断,他有着自己的中断控制器NVIC,NVIC有控制着中断的相关功能(其中包括中断源、抢占优先级、响应优先级、中断的使能与失能)的功能。每一个中断都有着自己的地址,一旦中断来,cpu便会去到相应的地址处理相对应的中断,这个地址叫中断向量,以下是stm32f1对应的向量表:
在这里插入图片描述
在介绍中断的配置之前,优先级的知识梳理一下,一个中断的优先级由两部分决定,一个是抢占式优先级,还有一个是响应优先级。两个优先级组成了一个4位的控制字。 中断优先级分组,因为中断优先级只使用了高4位,所以,中断优先级的分组分别有以下几种情况:
在这里插入图片描述 在这连接一个大佬的文章:https://blog.csdn.net/qq_35547767/article/details/82688811
好了,接下来的是有关事件和中断的科普,事件中断和软件中断有什么区别呢,简单来说,事件是外接设备状态变化来了电平信号,不用通过软件的服务函数,仅仅靠硬件便能得到结果,而中断是要cpu的参与,中断来了之后通过写好的中断函数去处理中断。如图,3这个或门的另一个输入是软件中断/事件寄存器,软件可以优先于外部信号请求一个中断或事件,即当软件中断/事件寄存器的对应位为"1"时,不管外部信号如何,编号3的或门都会输出有效信号。4号和6号的屏蔽器用与门来控制。
在这里插入图片描述在此连接一个大佬的文章:https://www.cnblogs.com/smartjourneys/articles/7363114.html
好了,明白这些基础知识后,开始配置中断函数,首先,我要做的是按键中断实验,当按下key0时,led灯状态翻转,先是配置EXTI(外部中断控制器),在这里,小伙伴们可能会问,怎么扯上这个EXTI,是这样的,中断有份外部中断和内部中断,内部中断是指内部定时器、串口、AD、IIC、SPI等等资源的中断,而外部中断则是外部信号引起的中断,如高电平、低电平、上升沿、下降沿等。我做的是外部中断,所以要配置EXTI控制器,其实也是照猫画虎一样,配置EXTI的结构体:
EXTI_InitTypeDef Extra;
Extra.EXTI_Line=EXTI_Line4; //EXTI4对应GPIO的PA4-PG4
Extra.EXTI_Mode=EXTI_Mode_Interrupt;
Extra.EXTI_Trigger=EXTI_Trigger_Falling;
Extra.EXTI_LineCmd=ENABLE;
EXTI_Init(&Extra);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);//选择GPIOE,4的引脚作为中断发生源
然后要配置的是NVIC的结构体:
NVIC_InitTypeDef Press;
Press.NVIC_IRQChannel=EXTI4_IRQn;
Press.NVIC_IRQChannelSubPriority=2;
Press.NVIC_IRQChannelPreemptionPriority=2;
Press.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&Press);
接下来要配置的是中断发生的服务函数,就是中断来了之后的处理函数:
void EXTI4_IRQHandler()
{
//if( (GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)) ==0)
Led_Turn();
EXTI_ClearITPendingBit(EXTI_Line4);
}
最后,key0的初始化附上:
void Press_Init()
{

	/*  key0¼üµÄ³õʼ»¯  */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
	GPIO_InitTypeDef pre;
	pre.GPIO_Pin=GPIO_Pin_4;
	pre.GPIO_Mode=GPIO_Mode_IPD;
	pre.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOE,&pre);
	GPIO_SetBits(GPIOE,GPIO_Pin_4);
	}

好了,代码就是这些了,要记得初始化key0的时钟是AFIO,至于LED的初始化在这里就不放上来了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值