江科大STM32学习记录3——EXIT外部中断

中断介绍:

中断系统是管理和执行中断的逻辑结构,外部中断是能产生众多中断的原因之一。

中断主程序运行时,出现了特定的中断触发条件(中断源),CPU暂停当前正在运行的程序转而去处理中断程序,处理完成又返回原来暂停的位置继续运行。

中断优先级:CPU会依据中断源的轻重缓急进行裁决,优先相应更加紧急的。

中断嵌套:一个中断程序正在运行,又有新的更高优先级的中断请求,CPU再次暂停当前中断,转而去处理新的中断程序。

主函数执行,遇到中断跳出主函数,到相应的中断函数,执行完继续执行主函数。

STM32中的中断:

1:68个可屏蔽中断通道(中断源),包含EXIT、TIM,ADC,USART,SPI,I2C,RTC等多个外设(中断源,可以产生中断)

2:使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级响应优先级

(程序中的中断函数地址由编译器分配,是不固定的,但是中断跳转只能跳到固定的地址执行程序,为了跳到不固定的地址,需要在内存中定义一个地址的列表,列表地址是固定的,中断跳到固定位置,由编译器再加上一条到中断函数的代码跳转到任意位置。该地址的列表称为中断向量表。(C语言编程不需要管中断向量表,编译器已经处理好了)。)

NVIC

嵌套中断向量控制器。Stm23中用于统一管理分配中断优先级和管理中断的,内核外设(不需要启动时钟),cpu小助手

NVIC优先级分组:由优先级寄存器的4位(0-15)(值越小,优先级越高)决定,这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级。

抢占优先级、响应优先级:

抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队。

响应优先级:插队

抢占优先级:直接暂停当前工作执行响应

分组方式:自己选择,配置好后注意两个优先级的取值范围。

不同外设产生中断,由cpu小助手NVIC统一管理,发送给CPU

优先级分配取值

EXTI介绍

  • EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序(引脚电平变化,申请中断)
  • 支持的触发方式:上升沿/下降沿/双边沿/软件触发
  • 支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断(不同同时pin_1
  • 通道数:16GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒
  • 触发响应方式:中断响应/事件响应(不会触发中断,但是触发外设其他事件)

因为所有0口,1口等GPIO相同pin口连接到了一块,一次能选择不同的GPIO端口,但是不能相同的pin口。

AFIO复用io口:数据选择器

  • AFIO主要用于引脚复用功能的选择重定义
  • STM32中,AFIO主要完成两个任务:复用功能引脚重映射(引脚功能重定义)中断引脚选

◯中断里不要使用延迟函数,中断本身设计就是快进快出,中断函数里使用延迟函数会导致上一个中断没处理完,下一个中断又来了

◯GPIO\AFIO\NVIC\EXTI均是外设,都需要开启时钟\NVIC\EXTI时钟一直开着。 NVIC为内核外设,时钟一直开启。RCC管理内核外的外设

中断函数

◯写中断配置-中断函数

◯中断函数:stm32中,中断函数的名字都是固定的,每个中断通道都对应着一个中断函数,名字可以参考一下启动文件 以IRQHandler结尾的的字符串就是中断函数的名字

◉中断函数都是无参无返回值的、需要判断重复的exti线路是不是想要的exti线路。通过判断标志位来进行判断。

中断函数不需要声明,自动调用的

◯中断函数通过标志位进行判断,最后一定要调用清除中断标志位的函数,因为中断标志位置置1了,程序就会跳转到中断函数。不然会一直响应中断函数,卡死在中断函数。

使用EXTI

开启GPIO时钟,初始化GPIO

RCC_APB2PeriphClockCmd开启时钟     GPIO_Init初始化(不需要的量先用GPIO_StructInit填入)

开启AFIO时钟,将GPIO管脚用作外部中断线路

RCC_APB2PeriphClockCmd开启时钟 ,GPIO_EXTILineConfig外部线路(位于GPIO函数)

初始化EXTI

EXTI_Init初始化(时钟一直开着),EXTI_StructInit(含有不需要值时先用这个)

初始化NVIC

NVIC_Init初始化(时钟一直开着),NVIC_StructInit(含有不需要值时先用这个)

写中断函数

void EXTI9_5_IRQHandler(void)类型,无参无返回值,无需声明,名称固定

实例

void Encoder_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  //开启GPIO时钟,初始化,固定套路
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);  //开启AFIO时钟,选择GPIO为中断线路
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource9);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource10);
	
	EXTI_InitTypeDef EXTI_InitStruct;    //初始化EXTI,固定套路
	EXTI_InitStruct.EXTI_Line = EXTI_Line9 | EXTI_Line10;
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
	
	EXTI_Init(&EXTI_InitStruct);
	
	NVIC_InitTypeDef NVIC_InitStruct; //初始化NVIC,固定套路
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStruct);

}
void EXTI15_10_IRQHandler(void)  //中断函数
{
	if(EXTI_GetFlagStatus(EXTI_Line10 == SET))
	{
		if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10) == 0)
			Encoder_count--;
		EXTI_ClearFlag(EXTI_Line10);
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
科大STM32外部中断是指通过配置STM32外部中断和相应的GPIO引脚,使得当外部事件(如按键按下)发生时,可以触发中断并执行相应的中断服务程序。 在配置外部中断时,需要进行时钟配置、GPIO配置、AFIO配置、EXTI配置以及NVIC配置。时钟配置用于使能外部中断所需要的时钟源,GPIO配置用于设置外部中断引脚的功能和模式,AFIO配置用于选择外部中断引脚对应的AFIO映射功能,EXTI配置用于使能和设置外部中断事件的触发方式,NVIC配置用于使能和设置外部中断的中断向量。 在具体实验中,可以通过按键触发外部中断,并在OLED屏幕上显示计数器的数值。需要注意的是,按键可能存在抖动现象,但不应该在中断返回函数中盲目地增加HAL库的delay函数来解决抖动问题。可以采用多个for循环去抖动的方法来处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [关于STM32-外部中断配置(非常详细,看不懂你打我)](https://download.csdn.net/download/safasdfe/76778516)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [STM32Cubemx HAL移植标准库例程3:按键外部中断](https://blog.csdn.net/qq_41968464/article/details/126961959)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值