所用单片机型号: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();
}
然后就是对中断服务函数的编写:
首先我们找到启动文件看一下,这里有定义许多中断服务函数:
复制一下进行编写:
//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