lab 6
GPIO输入配置
实现以下效果:开发板的LED2(绿灯)先闪烁两次,然后LED2(红灯)周期性地闪烁;当按压键S1(P1.1)时,增大count值,count值用于延时函数MyDelay,即随着count值增大,LED1的闪烁频率变慢。按压S2(P1.4)时,重置count的值为50
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>
void PORT1_IRQHandler(void)
{
uint32_t status;
status = MAP_GPIO_getEnabledInterruptStatus(GPIO_PORT_P1);
MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, status);
if(status & GPIO_PIN1) //判断P1.1按键(S1键)是否按压下
{
//写代码
MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P2,GPIO_PIN0);
MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P2,GPIO_PIN1);
MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P2,GPIO_PIN2);
//MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P2,GPIO_PIN2);
}
}
int main(void)
{
/* 停用看门狗定时器 */
MAP_WDT_A_holdTimer();
/* 配置时钟频率MCLK=3M DCO默认频率3M*/
MAP_CS_initClockSignal(CS_MCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1);
MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1); //设置P1.1(s1按键)为输入模式并拉高
MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, GPIO_PIN1); //清除P1.1中断
MAP_GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN1); //使能GPIO1.1中断
MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN4); //设置P1.4(s2按键)为输入模式并拉高
MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, GPIO_PIN4); //清除P1.4中断
MAP_GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN4); //使能GPIO1.4中断
MAP_Interrupt_enableInterrupt(INT_PORT1); //使能PORT1中断
MAP_Interrupt_enableMaster(); //开启中断总开关
//红灯,请配置P2.0为输出模式并设置初始模式为低电平(常暗)
GPIO_setAsOutputPin(GPIO_PORT_P2,GPIO_PIN0); //设置P2.0为输出模式
GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN0); //使LED2中红色灯初始为低电平(常暗)
//绿灯,请配置P2.1为输出模式并设置初始模式为低电平(常暗)
GPIO_setAsOutputPin(GPIO_PORT_P2,GPIO_PIN1); //设置P2.0为输出模式
GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN1); //使LED2中绿色灯初始为低电平(常暗)
//蓝灯,请配置P2.2为输出模式并设置初始模式为低电平(常暗)
GPIO_setAsOutputPin(GPIO_PORT_P2,GPIO_PIN2); //设置P2.0为输出模式
GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN2); //使LED2中蓝色灯初始为低电平(常暗)
while(1){
}
}
闪烁周期随按钮S1 S2控制
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>
#include <stdio.h>
unsigned int Count=50;
//延时函数
void MyDelay(unsigned int count)
{
volatile uint32_t i;
for(i=1000*count; i>0; i--);
return ;
}
void PORT1_IRQHandler(void)
{
uint32_t status;
status = MAP_GPIO_getEnabledInterruptStatus(GPIO_PORT_P1);
MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, status);
if(status & GPIO_PIN1) //判断P1.1按键(S1键)是否按压下
{
//写代码
Count += 10;
}
if(status & GPIO_PIN4) //判断P1.4按键(S2键)是否按压下
{
//写代码
Count = 50;
}
}
int main(void)
{
/* 停用看门狗定时器 */
MAP_WDT_A_holdTimer();
/* 配置时钟频率MCLK=3M DCO默认频率3M*/
MAP_CS_initClockSignal(CS_MCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1);
//请配置P1.1和P1.4
MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1); //设置P1.1(s1按键)为输入模式并拉高
MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, GPIO_PIN1); //清除P1.1中断
MAP_GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN1); //使能GPIO1.1中断
MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN4); //设置P1.4(s2按键)为输入模式并拉高
MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, GPIO_PIN4); //清除P1.4中断
MAP_GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN4); //使能GPIO1.4中断
MAP_Interrupt_enableInterrupt(INT_PORT1); //使能PORT1中断
MAP_Interrupt_enableMaster(); //开启中断总开关
//请配置P2.0(红灯)和P2.1(绿灯)
GPIO_setAsOutputPin(GPIO_PORT_P2,GPIO_PIN0); //设置P2.0为输出模式
GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN0); //使LED2中红色灯初始为低电平(常暗)
GPIO_setAsOutputPin(GPIO_PORT_P2,GPIO_PIN1); //设置P2.1为输出模式
GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN1); //使LED2中红色灯初始为低电平(常暗)
MyDelay(Count);
GPIO_toggleOutputOnPin(GPIO_PORT_P2,GPIO_PIN1);
MyDelay(Count);
GPIO_toggleOutputOnPin(GPIO_PORT_P2,GPIO_PIN1);
MyDelay(Count);
GPIO_toggleOutputOnPin(GPIO_PORT_P2,GPIO_PIN1);
MyDelay(Count);
GPIO_toggleOutputOnPin(GPIO_PORT_P2,GPIO_PIN1);
while(1)
{
//请写代码
MyDelay(Count);
GPIO_toggleOutputOnPin(GPIO_PORT_P2,GPIO_PIN0);
}
}
中断方式消除抖动
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>
//分频系数
int clock_divider[]={CS_CLOCK_DIVIDER_1,CS_CLOCK_DIVIDER_2,CS_CLOCK_DIVIDER_4,CS_CLOCK_DIVIDER_8,CS_CLOCK_DIVIDER_16};
void MyDelay(unsigned int count)
{
volatile uint32_t i;
for(i=1000*count; i>0; i--);
return ;
}
uint32_t divide=0;
void PORT1_IRQHandler(void)
{
uint32_t status;
status = MAP_GPIO_getEnabledInterruptStatus(GPIO_PORT_P1);
MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, status);
if(status & GPIO_PIN1) //判断P1.1按键(S1键)是否按压下
{
//写代码
if(divide<4){
divide++;
}
MAP_CS_initClockSignal(CS_MCLK, CS_DCOCLK_SELECT, clock_divider[divide]);
}
if(status & GPIO_PIN4) //判断P1.4按键(S2键)是否按压下
{
//写代码
if(divide>0){
divide--;
}
MAP_CS_initClockSignal(CS_MCLK, CS_DCOCLK_SELECT, clock_divider[divide]);
}
}
int main(void)
{
/* 停用看门狗定时器 */
MAP_WDT_A_holdTimer();
/* 配置时钟频率MCLK=3M DCO默认频率3M*/
MAP_CS_initClockSignal(CS_MCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1);
//请配置P1.1(s1按键)为输入模式并拉高
MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1,GPIO_PIN1);
MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1,GPIO_PIN1);
MAP_GPIO_enableInterrupt(GPIO_PORT_P1,GPIO_PIN1);
//请配置P1.4(s2按键)为输入模式并拉高
MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1,GPIO_PIN4);
MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1,GPIO_PIN4);
MAP_GPIO_enableInterrupt(GPIO_PORT_P1,GPIO_PIN4);
MAP_Interrupt_enableInterrupt(INT_PORT1); //使能PORT1中断
MAP_Interrupt_enableMaster(); //开启中断总开关
//请配置P2.0
GPIO_setAsOutputPin(GPIO_PORT_P2,GPIO_PIN0); //设置P2.0为输出模式
GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN0); //使LED2中红色灯初始为低电平(常暗)
uint32_t count=50;
while(1)
{
//写代码
MyDelay(count);
GPIO_toggleOutputOnPin(GPIO_PORT_P2,GPIO_PIN0);
}
}