嵌入式系统实践 06 ——基于ARM汇编 Keil5 MSP432 P401R开发板

该代码示例展示了如何使用MSP432P4xx微控制器的GPIO输入配置来控制LED闪烁。LED2(绿灯)先闪烁两次,接着红灯周期性闪烁。S1按键按压会增加计数器值,影响LED1的闪烁频率;S2按键按压则重置计数器值为50。中断被用来检测S1和S2按键的按下,以实现功能控制。
摘要由CSDN通过智能技术生成

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);	
						
		}
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值