STM32 关于外部中断线、中断源和中断服务函数的问题

                                           STM32 关于外部中断线、中断源和中断服务函数的问题

中断线问题:

上图可以看出,PA0、PB0...PG0共用的EXTI0中断线,PA1、PB2...PG1共用的EXTI1中断线,也就是 编程里面的(如下图库文件),对应16个中断线,后面三个是专用的中断线,不做讨论。

 有人要问,假设:我设置的引脚是PB9和PE9都开启外部中断怎么办?小编告诉你,这还真办不了,我实测过。配置函数的时候后覆盖之前的函数的(如下图所示)

如果这样配置的话,会出现出货光电1的初始化覆盖掉编码盘的初始化,说白了就是编码盘的设置被覆盖掉了,结果是外部中断  出货光电1管脚会触发而编码盘就不起作用了,这也是STM32其中一个问题所在吧! 反过来,结果是外部中断  编码盘 管脚会触发 而 出货光电1管脚就不起作用了!

中断源问题:

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0); //设置GPIOX中断源以及哪个中断脚
  EXTI_InitStructure.EXTI_Line = EXTI_Line0;//中断线
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//设置为外部中断模式
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断线使能
  EXTI_Init(&EXTI_InitStructure);//配置使能

中断服务函数:

 简单的配置:

void EXTI15_10_IRQHandler(void)//中断服务函数,如果中断线是10-15。
{
	if(EXTI_GetITStatus(EXTI_Line10) != RESET) 
	{
		Beep_ON;SOFT_DELAY; Beep_OFF;
		EXTI_ClearITPendingBit(EXTI_Line10);     
	}  
	
	if(EXTI_GetITStatus(EXTI_Line11) != RESET) 
	{
		Beep_ON;SOFT_DELAY; Beep_OFF;
		EXTI_ClearITPendingBit(EXTI_Line11);     
	}  
	
	if(EXTI_GetITStatus(EXTI_Line12) != RESET) 
	{
		Beep_ON;SOFT_DELAY;Beep_OFF;
		EXTI_ClearITPendingBit(EXTI_Line12);     
	}  

void EXTI9_5_IRQHandler(void)//中断服务函数,如果中断线是5-9。
{
	if(EXTI_GetITStatus(EXTI_Line5) != RESET) 
	{
		Beep_ON;SOFT_DELAY; Beep_OFF;
		EXTI_ClearITPendingBit(EXTI_Line5);     
	}  
	
	if(EXTI_GetITStatus(EXTI_Line8) != RESET) 
	{
		Beep_ON;SOFT_DELAY; Beep_OFF;
		EXTI_ClearITPendingBit(EXTI_Line8);     
	}  
	
	if(EXTI_GetITStatus(EXTI_Line9) != RESET) 
	{
		Beep_ON;SOFT_DELAY;Beep_OFF;
		EXTI_ClearITPendingBit(EXTI_Line9);     
	}  

 每个中断服务函数代表一个或者一类,上面的代码说明:只要是中断线在EXTI_Line   10-15 的,中断服务函数就只有一个,但是由于中断线只有唯一性,可以在中断服务函数里面判断到底是哪个中断线触发,这也保证不会误触发或者是占线的一系列的问题。

如上图,外部中断分为几类:如下:

  DCD     EXTI0_IRQHandler           ; EXTI Line 0//只是管脚的中断服务函数,还有串口等等中断服务函数
  DCD     EXTI1_IRQHandler           ; EXTI Line 1             
  DCD     EXTI2_IRQHandler           ; EXTI Line 2
  DCD     EXTI3_IRQHandler           ; EXTI Line 3
  DCD     EXTI4_IRQHandler           ; EXTI Line 4
  DCD     EXTI9_5_IRQHandler         ; EXTI Line 9..5
  DCD     EXTI15_10_IRQHandler       ; EXTI Line 15..10

所以在配置外部中断服务函数或者其他中断服务函数的问题时,参照:库启动件 startup_stm32f10x_hd.s

此文章只是个人交流,学术有限!不足之处,望各位爱好者批评指正!

猜你喜欢

转载自blog.csdn.net/Britripe/article/details/82115432