STM32中断学习笔记

   日期:2021-04-15     浏览:116    评论:0    
核心提示:提示:小白自学,大神看到不对的地方请指出指导一下。中断是啥中断可以这样比喻:你在做一件事情,然后电话打进来,你去做电话里要求你做的是,然后做完了又回来做刚才没做完的事情。NVIC嵌套向量中断控制器,属于内核外设,管理着包括内核和片上所有外设的中断相关的功能。EXTI外部 中断/事件 控制器EXTI 有20个中断/事件线,每个GPIO都可以被设置为输入线,占用 EXTI0至EXTI15。中断分组、主优先级、子优先级一般来说先选定优先级分组,选好之后就不要改了,因为改分组可能会

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

中断是啥

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

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的中断有了个了解,会用按键中断来电灯,这算是入门的一大步嘛?哈哈哈,

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
更多>相关资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服