GPIO接口及其外部中断的应用

一、实验目的

(1)掌握MSP430系列芯片结构、主要功能部件和片上外设;

(2)掌握MSP430系列CPU的结构特征和存储器结构、寻址总线和寻址方式;

(3)掌握MSP430系列16位CPU精简指令系统和C语言基础;

(4)掌握MSP430系列位操作运算与表达式;

(5)熟悉CCS编译环境及其基本操作、系统设计与调试的方法;

(6)掌握MSP430系列软件编程﹑单任务和多任务典型程序结构以及模块化程序设计方法。

二、实验内容

(1)利用软件循环查询方法编程实现:扩展板上的按键S1控制L1指示灯的亮灭,按键S2控制L2指示灯的亮灭,均为高电平点亮。要求按键被按下再松开一个来回后切换LED指示灯的亮灭状态。LED指示灯模块和机械按键模块的原理图如图2.1(a)和(b)所示。

注意:

①初始化GPIO接口的输出方式、输出模式和使能上下拉电阻功能;

②利用软件循环查询方法检测技键是否被按下。

③使用按键时会有抖动,按键抖动的时间一般为5ms~10ms。调用实验一中编写的软件延时函数void delayms (volatile unsigned int n),调试延时参数实现软件延时消抖功能。提示:①以S1技键为例:已知按键被按下P1.2=0,按键被松开P1.2=1

②查询S1按键是否技下的代码为:

if(!(P1IN&BIT2))或者if(P1IN&BIT2)==0)

(2)利用GPIO接口外部中断方式,设置下降沿触发外部中断编程实现上题功能。要求利用外部中断方式检测按键是否按下,并使用变量NUM统计中断次数。 

提示:

(1)以S1按键为例,利用IO外部中断判断S1按键是否按下的代码为: if(P1FG&BIT2);

(2)通过单步调试,观察并记录变量NUM数值的变化情况;

(3)分析并说明循环查询和外部中断方式分别在什么情况下使用更有效。

三、实验代码:

#include <msp430.h> 
/**
 * main.c
 */
void delay()
{
    volatile unsigned int i;
    for(i=1000;i>0;i--);
}
void main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	P8DIR |= BIT1;
	P1DIR &=~BIT2;
	P8OUT |= BIT1;
	P1REN |= BIT2;
	P1OUT |= BIT2;
	P3DIR |= BIT7;
	P3OUT |= BIT7;
	P2DIR &=~BIT6;
	P2REN |= BIT6;
	P2OUT |= BIT6;
	while(1)
	{
	    if(!(P1IN&BIT2))
	    {
	        delay();
	       if(P1IN & BIT2)
	       {
	           P8OUT ^=BIT1;
	       }
	    }

	    else if(!(P2IN&BIT6))
	            {
	                delay();
	               if(P2IN & BIT6)
	               {
	                   P3OUT ^= BIT7;
	               }
	            }
	  }
	return 0;
}

#include <msp430.h>
//按键控制LED
unsigned int num=0;
int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;   // stop watchdog timer
    /*初始化LED2为输出*/
    P3DIR |= BIT7;
    P8DIR |= BIT1;
    /*初始化LED2为低电平,熄灭*/
    P3OUT &= ~BIT7;
    P8OUT &= ~BIT1;
    /*初始化KEY P1.3为输入*/
    P1DIR &= ~BIT2;
    P1DIR &= ~BIT3;
    /*使能P1.3口的上拉电阻*/
    P1REN |= BIT2;
    P1OUT |= BIT2;
    P1REN |= BIT3;
    P1OUT |= BIT3;
    /*打开P1.3口的中断*/
        P1IE |= BIT2;
        P1IE |= BIT3;
        /*设定为下降沿触发*/
        P1IES |= BIT2;
        P1IES |= BIT3;
        /*清除中断标志位*/
        P1IFG &= ~BIT2;
        P1IFG &= ~BIT3;
        /*打开全局中断*/
        __bis_SR_register(GIE);
    while(1)
    {
    }
    return 0;
}
#pragma vector = PORT1_VECTOR
__interrupt void Port1_ISR(void)    //Port1_ISR(void)   中断服务函数
{
       if(!(P1IN & BIT2)) /*如果P1.3口为高电平,证明按键没有被按下*/
        {__delay_cycles(500);
        if(P1IN & BIT2)
            {P8OUT ^= BIT1;//翻转LED2
            num++;
            P1IFG  &= ~ BIT2;   //清除标志位
            }
        }
       else if(!(P1IN & BIT3)) /*如果P1.3口为高电平,证明按键没有被按下*/
                {  __delay_cycles(500);
                    if(P1IN & BIT3)
                        {P3OUT ^= BIT7;//熄灭LED2
                        num++;
                         P1IFG  &= ~ BIT3;   //清除标志位
                        }
                }
}/*
#pragma vector = PORT2_VECTOR
__interrupt void Port2_ISR(void)    //Port1_ISR(void)   中断服务函数
{
        if(!(P2IN & BIT1)) //如果P1.3口为高电平,证明按键没有被按下
           {  __delay_cycles(500);
               if(P2IN & BIT1)
                   {P8OUT ^= BIT1;//熄灭LED2
                   num++;
                    P2IFG  &= ~ BIT1;   //清除标志位
                   }
           }
}*/

四、问题讨论

1.叙述MSP430F5529的工作模式,以及如何在低功耗模式下转到活动模式﹖

工作模式:

①改变工作模式会立即生效;

②发生中断时,当前的模式设置信息会被保存,以便恢复(除非中断服务程序中改变了工作模式);

③处于LPM4.5模式时,PMM的电源监管不会生效,所有的RAM和寄存器都会丢失,但是I/O口状态会锁定;

退出低功耗模式如下:

LPM0_EXIT; //退出低功耗模式0

LPM4_EXIT; //退出低功耗模式4

LPM0:CPU停止工作,MCLK时钟停止,SMCLK、ACLK时钟还在工作。

LPM1:CPU停止工作,MCLK时钟停止,在活动模式如果DCO没有作为MCLK和SMCLK时钟时,则直流发生器被禁止,否则就保持活动状态,SMCLK、ACLK时钟依然还在工作。

LPM2:CPU停止工作,MCLK、SMCLK时钟停止工作,如果DCO没有作为MCLK、SMCLK,自动被禁止直流发生器保持有效,ACLK还处于工作中。

LPM3:CPU停止工作,MCLK、SMCLK时钟停止工作,DCO时钟也停止工作,仅ACLK时钟还处于工作状态。

LPM4:CPU停止工作,MCLK、SMCLK时钟停止工作,DCO时钟也停止工作,ACLK也停止工作。此时功耗最低。

  一般情况下,处理器进入低功耗模式后,由中断来唤醒,外部中断或内部中断。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值