MSP432学习笔记5——外部中断

所用单片机型号:MSP432P401r

今日继续我的MSP432电赛速通之路。

外部中断是个很有用的配置

STM32几乎每个I/O口都能配置复用为外部中断

但MSP432并不是这样。

我经过查阅数据手册发现支持中断的引脚为:

P1^0~ P1^7        P3^0~ P3^7     P5^0~ P5^7

P2^0~ P2^7        P4^0~ P4^7     P6^0~ P6^7

其余引脚都不包含中断功能(来源:msp432p401r.pdf  第17~20页


目录

外部中断相关库函数:

外部中断一般配置步骤:

完整工程下载:


外部中断相关库函数:

外部中断相关库函数1~5在gpio.h库中,6~5在interrupt.h库中

1.开启外部中断:

GPIO_enableInterrupt(GPIO_PORT_PX,GPIO_PINx);

2.配置触发方式:

GPIO_interruptEdgeSelect(GPIO_PORT_PX,GPIO_PINx,Edge);

 Edge表示触发方式

3.Edge有效值:

GPIO_HIGH_TO_LOW_TRANSITION  //下降沿触发
GPIO_LOW_TO_HIGH_TRANSITION  //上升沿触发

4.获取GPIO中断状态:

GPIO_getEnabledinterruptStatus(GPIO_PORT_Px);

5.清除GPIO中断标志位:

GPIO_clearInterruptFlag(GPIO_PORT_Px,GPIO_PINx);

配合使用:

//获取中断状态存在变量
status=GPIO_getEnabledInterruptStatus(GPIO_PORT_Px);
//然后在清除对应的中断标志位
GPIO_clearinterruptFlag(GPIO_PORT,status);

6.开启总中断:

Interrupt_enableMaster(void);

7.开启对应端口中断:

Interrupt_enableInterrupt(interruptNumber);
//interruptNumber可以填下面几个外部中断的参数之一

INT_PORT1
INT_PORT2
INT_PORT3
INT_PORT4
INT_PORT5
INT_PORT6

外部中断一般配置步骤:

1.配置GPIO输入
2.清除中断标志位
3.配置触发方式
4.开启外部中断
5.开启端口中断
6.开启总中断
7.编写GPIO ISR(中断服务函数)

让我们根据以上步骤进行如下俩个函数的编写:

首先是外部中断初始化函数:

/*
	中断初始化函数	
	一般在主函数while()循环之外调用一下	
*/

void interrupt_inint(void)
{
//1.配置GPIO输入 
MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1 + GPIO_PIN4);	
//2.清除中断标志位
MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, GPIO_PIN1);
MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, GPIO_PIN4);
	
//3.配置触发方式  //下降沿触发
GPIO_interruptEdgeSelect(GPIO_PORT_P1,GPIO_PIN1,GPIO_HIGH_TO_LOW_TRANSITION);
GPIO_interruptEdgeSelect(GPIO_PORT_P1,GPIO_PIN4,GPIO_HIGH_TO_LOW_TRANSITION);	
//4.开启外部中断
GPIO_enableInterrupt(GPIO_PORT_P1,GPIO_PIN1);
GPIO_enableInterrupt(GPIO_PORT_P1,GPIO_PIN4);	
//5.开启端口中断
Interrupt_enableInterrupt(INT_PORT1);	
//6.开启总中断
Interrupt_enableMaster();

}

然后就是对中断服务函数的编写:

首先我们找到启动文件看一下,这里有定义许多中断服务函数:

复制一下进行编写:

MSP432学习笔记5——外部中断_第1张图片

//7.编写GPIO ISR(中断服务函数)

void  PORT1_IRQHandler(void)
{
	uint16_t status;
	status=GPIO_getEnabledInterruptStatus(GPIO_PORT_P1);
	GPIO_clearInterruptFlag(GPIO_PORT_P1,status);
	GPIO_clearInterruptFlag(GPIO_PORT_P1,status);
	
	if(status & GPIO_PIN1)//对应KEY1中断
	{
		 delay_ms(15);    //消抖
			if(KEY1==0)	
			{
				LED_RED_On();
			}
		}

	if(status & GPIO_PIN4)
		//对应KEY2中断
	{
		 delay_ms(15);    //消抖
			if(KEY2==0)	
			{
				LED_RED_Off();
			}
		}		
		
}	

 该服务函数作用是打开和关闭LED

  如果有失败的情况,请检查自己:

1.对应LED端口有没有初始化,(1.LED初始化函数 2.开机调用初始化)

2.对应按键端口有没有初始化为输入模式

3.中断函数的编写是否是7步都做好了

4.开启对应端口中断函数填的是不是对应按键端口的初始化,

                (比如按键接在P1^1就是INT_PORT1)

完整工程下载:

https://download.csdn.net/download/qq_64257614/87802677

你可能感兴趣的:(MSP432学习笔记,笔记,嵌入式硬件,单片机)