当前位置:主页 > 查看内容

STM32中断学习笔记

发布时间:2021-07-08 00:00| 位朋友查看

简介:提示小白自学大神看到不对的地方请指出指导一下。 中断是啥 中断可以这样比喻你在做一件事情然后电话打进来你去做电话里要求你做的是然后做完了又回来做刚才没做完的事情。 NVIC 嵌套向量中断控制器属于内核外设管理着包括内核和片上所有外设的中断相关的功……

提示:小白自学,大神看到不对的地方请指出指导一下。


中断是啥

中断可以这样比喻:你在做一件事情,然后电话打进来,你去做电话里要求你做的是,然后做完了又回来做刚才没做完的事情。

NVIC

嵌套向量中断控制器,属于内核外设,管理着包括内核和片上所有外设的中断相关的功能。

EXTI

外部 中断/事件 控制器
EXTI 有20个中断/事件线,每个GPIO都可以被设置为输入线,占用 EXTI0至EXTI15。在这里插入图片描述

中断分组、主优先级、子优先级

在这里插入图片描述

一般来说先选定优先级分组,选好之后就不要改了,因为改分组可能会使程序错乱。然后配置主优先级和子优先级。

如果同一分组里,主优先级相同,子优先级越低,越先发生。如果是主优先级不同,那么主优先级越低,也越先发生。等一个发生完了,再接下一个发生…当然,如果一个优先级高的先发生了,这是来了个低的,是不会打断这个正在发生的。

配置过程分析

用的是按键中断

1.初始化要连接到EXTI的GPIO

代码如下(示例):

GPIO_InitTypeDef  	GPIO_InitStruct;	//声明结构体
RCC_APB2PeriphClockCmd(KEY1_INT_GPIO_CLK, ENABLE); //开时钟
GPIO_InitStruct.GPIO_Pin = KEY1_INT_GPIO_PIN;		//配置按键的引脚
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //配置模式
	
GPIO_Init( KEY1_INT_GPIO_PORT	, &GPIO_InitStruct);  //端口初始化写入

2.初始化EXTI用于产生中断/事件

代码如下(示例):

EXTI_InitTypeDef		EXTI_InitStruct;//声明结构体

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//打开APB2的时钟
GPIO_EXTILineConfig( GPIO_PortSourceGPIOA, GPIO_PinSource0);//选择GPIO引脚作为EXTI线
	
EXTI_InitStruct.EXTI_Line = EXTI_Line0;//选择EXTI线
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;//选择中断模式
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;//选择上升触发类型
EXTI_InitStruct.EXTI_LineCmd = ENABLE;//EXTI使能
	
EXTI_Init( &EXTI_InitStruct);

3.初始化NVIC,用于处理中断

代码如下(示例)

	NVIC_InitTypeDef 	NVIC_InitStruct;//声明结构体
	
	NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1);//选择优先级分组
	
	NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;//选择中断源
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;//选择主优先级
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;//选择子优先级
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//中断使能
	
	NVIC_Init( &NVIC_InitStruct);

NVIC_IROChannel:用来设置中断源,不同的中断中断源不一样,且不可写错,即使写错了程序也不会报错,只会导致不响应中断。
在这里插入图片描述
有需要的可以去固件库里查所需要的中断源

4.编写中断服务函数

#define LED_G_TOGGLE	{LED_GPIO_PORT->ODR ^= LED_GPIO_PIN;}//寄存器异或实现亮灭

void EXTI0_IRQHandler(void)
{
	if(EXTI_GetITStatus( EXTI_Line0) != RESET )//检测是否按下
	{
		LED_TOGGLE;//灯亮灭
	}
	EXTI_ClearITPendingBit( EXTI_Line0 );//清除
}

5.主函数

int main(void)
{
	LED_GPIO_Config();
	EXTI_KEY1_Config();	
	while(1)
	{
	}
}

总结

算是对STM32的中断有了个了解,会用按键中断来电灯,这算是入门的一大步嘛?哈哈哈,

;原文链接:https://blog.csdn.net/p467616/article/details/115669632
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐