文档库 最新最全的文档下载
当前位置:文档库 › msp430 IO实验报告

msp430 IO实验报告

Msp430单片机第一次实验报告

1. IO实验——LED跑马灯

实验目的:本实验作为学习入门实验,介绍了如何操作MSP430的IO口。实验控制开

发版上的三个LED灯延时闪烁。本实验采用三种方法,第一种是直接找到相关寄存器的地址,然后向其写入值。这种方法与平台无关。介绍这种方法只是使我们的理解更为透彻;第二种方法采用传统的单片机编程模式,调用msp430f6638.h包含芯片相关的头文件;第三种方法采样调用TI driverlib库的函数。通过三种方法,我们可以对比C语言编程效率。

1.1 实验原理

开发板上的3个LED灯和IO口的对应关系如下:

LED_YELLOW——P4.1 LED_GREEN——P4.2 LED_RED——P4.3

从MSP430F6638的芯片手册中找到,与P4端口相关的寄存器地址信息:

如表1-1 所示,P4 端口的基地址为0x0220,要完成该实验,只需要设置两个相关寄存

器。P4OUT 和P4DIR。P4DIR 为方向寄存器,P4OUT 为数据输出寄存器。从图一可以知道,P4OUT 和P4DIR 的偏移地址分别为0x03 和0x05。

这两个寄存器的地址我们采用“基地址+偏移地址”的方式来表示。

#define P4DIR (*((volatile unsigned char*)(P3P4_BASE_Address + 0x05)))

#define P4OUT (*((volatile unsigned char*)(P3P4_BASE_Address + 0x03)))

1.2 实验步骤

(1)将PC 和板载仿真器通过USB 线相连;

(2) 打开CCS 集成开发工具,选择Project->Import Existing CCS Eclipse Project,导入

MSP430F6638_DemoV2.0\1.LED\MSP430F6638_LED01 或者

MSP430F6638_DemoV2.0\1.LED\MSP430F6638_LED02 或者

MSP430F6638_DemoV2.0\1.LED\MSP430F6638_LED03 工程;

(3)选择对该工程进行编译链接,生成.out 文件。然后选择,将程序下载

到实验板中。程序下载完毕之后,可以选择全速运行程序,也可以选择

单步调试程序,选择F3 查看具体函数。也可以程序下载之后,按下,

软件界面恢复到原编辑程序的画面。再按下实验板的复位键,运行程序。(调试方式下的全速运行和直接上电运行程序在时序有少许差别,建议上电运行程序)。

1.3 实验现象

开发板上3 个LED 定时翻转,实现闪烁的效果。

1.4 关键代码分析

实验1:

#define P3P4_BASE_Address 0x0220

#define BIT1 (0x0002)

#define BIT2 (0x0004)

#define BIT3 (0x0008)

#define P4DIR (*((volatile unsigned char*)(P3P4_BASE_Address + 0x05))) #define P4OUT (*((volatile unsigned char*)(P3P4_BASE_Address + 0x03)))

void main(void)

{

volatile unsigned int i;

volatile unsigned int count=0;

P4DIR |= BIT1 + BIT2 + BIT3; // P4.1,P4.2,P4.3 set as output

while(1) // continuous loop

{

P4OUT ^= BIT1 + BIT2 + BIT3; // XOR P4.1,P4.2,P4.3 for(i=50000;i>0;i--); // Delay

}

}

实验2:

#include

void main(void)

{

volatile unsigned int i;

volatile unsigned int count=0;

WDTCTL = WDTPW+WDTHOLD; // Stop WDT

P4DIR |= BIT1 + BIT2 + BIT3; // P4.1,P4.2,P4.3 set as output

while(1) // continuous loop

{

P4OUT ^= BIT1 + BIT2 + BIT3; // XOR P4.1,P4.2,P4.3 for(i=20000;i>0;i--); // Delay

}

}

实验三:

#include"inc/hw_memmap.h"

#include"driverlib/5xx_6xx/gpio.h"

#include"driverlib/5xx_6xx/wdt.h"

void main (void)

{

volatile unsigned int i;

WDT_hold(__MSP430_BASEADDRESS_WDT_A__);//Stop WDT

GPIO_setAsOutputPin(__MSP430_BASEADDRESS_PORT4_R__,

GPIO_PORT_P4,

GPIO_PIN1 + GPIO_PIN2 + GPIO_PIN3

);//P4.x output

while(1)

{

for(i=20000;i>0;i--); // Delay

GPIO_setOutputLowOnPin(

__MSP430_BASEADDRESS_PORT4_R__,

GPIO_PORT_P4,

GPIO_PIN1 + GPIO_PIN2 + GPIO_PIN3

);

for(i=20000;i>0;i--); // Delay

GPIO_setOutputHighOnPin(

__MSP430_BASEADDRESS_PORT4_R__,

GPIO_PORT_P4,

GPIO_PIN1 + GPIO_PIN2 + GPIO_PIN3

);//Set all P4 pins HI

}

// //Enter LPM4 w/interrupts enabled

// __bis_SR_register(LPM4_bits + GIE);

//

// //For debugger

// __no_operation();

}

1.5 思考题

(1)MSP430 的IO口都具备哪些功能?

答:GPIO是MCU与外界交互的重要途径,它具有如下的特性:1.可以独立控制每个GPIO口的方向(输入/输出模式)2.可以独立设置每个GPIO的输出状态(高/低电平);3.所有GPIO口在复位后都有个默认方向(或输入输出)。GPIO接口类型丰富,P1和P2具有输入输出、中断和外部模块功能,这些功能可以通过他们各自9个控制寄存器的设置来实现。

(2)与IO 口相关的寄存器有哪些?

答:MSP430各种端口有大量的控制寄存器供用户操作。最大限度提供了输入/输出的灵活性。方向寄存器:PxDIR:Bit=1,输出模式;Bit=0,输入模式。

输入寄存器:PxIN,Bit=1,输入高电平;Bit=0,输入低电平。

输出寄存器:PxOUT,Bit=1,输出高电平;Bit=0,输出低电平。

上下拉电阻使能寄存器:PxREN,Bit=1,使能;Bit=0,禁用。

功能选择寄存器:PxSEL,Bit=0,选择为I/O端口;Bit=1,选择为外设功能。

驱动强度寄存器:PxDS,Bit=0,低驱动强度;Bit=1,高驱动强度。

中断使能寄存器:PxIE,Bit=1,允许中断;Bit=0,禁止中断。

中断触发沿寄存器:PxIES,Bit=1,下降沿置位,Bit=0:上升沿置位。

中断标志寄存器:PxIFG,Bit=0:没有中断请求;Bit=1:有中断请求。

2.IO实验--按键输入与中断

2.1 实验介绍

本实验通过中断的方式演示了按键的操作。与查询方式相比,中断按键具有响应速度快,占用MCU 资源少的优点。

2.2 实验目的

(1) 熟悉CCS 开发环境的使用;

(2) 了解MSP430 的中断系统;

(3) 掌握MSP430 的中断编程方法。

2.3 实验原理

开发板上的按键和MCU 的IO 口对应关系如下:

P2.6---KEY1 P2.7---KEY2

开发板上三个LED 灯和MCU 的IO 口对应关系如下:

与查询按键方式相比,中断方式用到了两个新的寄存器:PxIE 和PxIFG。

PxIE---中断使能寄存器

PxIFG---中断标志寄存器

中断函数的写法:

在MSP430 中,用扩展关键字来__interrupt 来表明该函数为中断函数。

__interrupt void port_2(void);

语法:interrupt void 函数名()或者Interrupt【中断向量】void 函数名()

参数:中断函数没有参数。中断函数需要指定中断向量。

返回:中断返回一般是void,没有返回值。

2.4 实验步骤

(1) 将PC 和板载仿真器通过USB 线相连;

(2) 打开CCS 集成开发工具,选择Project->Import Existing CCS Eclipse Project,导入

MSP430F6638_DemoV2.0\2.Key_interrupt\MSP430F6638_Key_interrupt 文件夹中的

工程;

(3)选择对该工程进行编译链接,生成.out 文件。然后选择,将程序下载

到实验板中。程序下载完毕之后,可以选择全速运行程序,也可以选择

单步调试程序,选择F3查看具体函数。也可以程序下载之后,按下,软件界面恢复到原编辑程序的画面。再按下实验板的复位键,运行程序。(调试方式下的全速运行和直接上电运行程序在时序有少许差别,建议上电运行程序)。

2.5 实验现象

按下开发板上的按键,产生一个中断请求,在中断服务函数中,点亮对应的LED灯。

2.6 关键代码分析

实验1:

#include"msp430f6638.h"

void interrupt_key(void);

void main(void)

{

WDTCTL = WDTPW+WDTHOLD; // Stop WDT

interrupt_key();

}

void interrupt_key(void)

{

P4DIR |= BIT1+BIT2+BIT3; // P4.1,P4.2,P4.3 set as output

P4OUT &=~(BIT1+BIT2+BIT3); // set led off

P2IE |= BIT6+BIT7; // enable P2.6 ,P2.7 interrupt

P2IFG &= ~(BIT6+BIT7); // clean interrupt flag

__enable_interrupt(); // enable interrupt

while(1);

}

// PORT2 interrupt service routine

#pragma vector=PORT2_VECTOR

__interrupt void port_2(void)

{

__delay_cycles(5000); // disappears shakes

if(P2IN & BIT6){ // disappears shakes

P4OUT ^= BIT1+BIT2+BIT3; //

XOR P4.1,P4.2,P4.3

P2IFG &=~(BIT6+BIT7); // clean interrupt flag

}

}

2.7 思考题

(1)如何定义一个MSP430 的中断函数?

答:汇编语言程序例子:

#pragma vector=TIMERA0_A0_VECTOR

__interrupt void Timer_A(void)

{

P5OUT^=0x02;

CCR0+=50000;

}

TIMERA0_VECTOR是TA的CCR0中断矢量地址,不同的中端服务有不同的地址。

(2)在中断服务程序中,为什么要清除中断标志位?

答:中断标志位为1表示有中断请求,中断标志位为0表示没有中断请求,在中断服务程序的

最后加上清除中断标志位的语句表示一次中断执行完了,为下一个新的中断信号产生做准

备。

(3)MSP430 单片机与IO 中断相关的寄存器有哪些?

答:中断使能寄存器:PxIE,Bit=1,允许中断;Bit=0,禁止中断。

中断触发沿寄存器:PxIES,Bit=1,下降沿置位,Bit=0:上升沿置位。

中断标志寄存器:PxIFG,Bit=0:没有中断请求;Bit=1:有中断请求。

3.IO实验--按键消抖

3.1 实验介绍

按键是电子产品中的一个常用器件。通常的按键所用的开关为机械开关,当机械触点

断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定的接通,

在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产

生这种现象而采取的措施就是按键消抖。

3.2 实验目的

(1) 掌握按键的工作原理;

(2) 了解按键抖动产生的原因;

(3) 掌握按键去抖动的方法。

3.3 实验原理

按键和MCU 连接有两种方式:(1) Pull-UP (2) Pull-DOWN

Pull-up 连接方式:在按键没有按下的时候,MCU 相应的管脚为低电平。按键按下时,MCU 的管脚连接到VCC,此时为高电平。

Pull-down 连接方式:在按键没有按下的时候,MCU 相应的管脚为高电平。按键按下时,MCU 的管脚连接到地,此时为低电平。

按键按下的前后存在一个抖动的时间。

抖动时间:

抖动的时间长短由机械按键特性决定,一般为5ms~10ms。按键闭合时间的长短则由操作人员的按键动作决定,一般为零点几秒到数秒。按键抖动会引起一次按键被误读多次。为确保MCU 对按键的一次闭合仅作一次处理,必须去除按键抖动。在按键闭合稳定时读取键的状态,并且必须判断到按键释放稳定后再作处理。

消抖方法:按键的消抖,可用硬件的方法和软件方法。

硬件消抖:

在键数较少时可用硬件方法消除抖动。下图所示的RS 触发器为常用的硬件去抖。

图中两个“与非”门构成一个RS 触发器。当按键未按下时,输出为1;当键按下时,

输出为0。此时即使用按键的机械性能,使按键因弹性抖动而产生瞬时断开(抖动跳开B),只要按键不返回原始状态A,双稳态电路的状态不改变,输出保持为0,不会产生抖动的波形。也就是说,即使B 点的电压波形是抖动的,但经双稳态电路之后,其输出为正规的矩形波。这一点通过分析RS 触发器的工作过程很容易得到验证。

另一种硬件消抖的方法利用电容的放电延时,采用并联电容法,也可实现硬件消抖,

软件消抖:

如果按键较多,常用软件方法去抖,即检测出键闭合后执行一个延时程序,5ms~

10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms 的延时,待后沿抖动消失后才能转入该键的处理程序。还可以利用定时器中断来消抖。本实验通过软件方法消抖。

本实验中,用到如下两个函数来简单的进行消抖处理。

unsigned char Is_sw1_pressed(void);

unsigned char Is_sw2_pressed(void);

3.4 实验步骤

(1)将PC 和板载仿真器通过USB 线相连;

(2) 打开CCS 集成开发工具,选择Project->Import Existing CCS Eclipse Project,导入

\MSP430F6638_DemoV2.0\3.Key_debounce\msp430f6638_Key_debounce 文件夹中的工程;

(3) 选择对该工程进行编译链接,生成.out 文件。然后选择,将程序下载

到实验板中。程序下载完毕之后,可以选择全速运行程序,也可以选择

单步调试程序,选择F3 查看具体函数。也可以程序下载之后,按下,软件界面恢复到原编辑程序的画面。再按下实验板的复位键,运行程序。(调试方式下的全速运行和直接上电运行程序在时序有少许差别,建议上电运行程序)。

3.5 实验现象

按下按键,相应的LED 灯点亮。

3.6 关键代码分析

#include

void delay_ms(unsigned int duration);

unsigned char Is_sw1_pressed(void);

unsigned char Is_sw2_pressed(void);

void main(void)

{

volatile unsigned int i;

volatile unsigned int count=0;

WDTCTL = WDTPW+WDTHOLD; // Stop WDT

P4DIR |= BIT1 + BIT2 + BIT3; // P4.1,P4.2,P4.3 set as output P4OUT &= ~(BIT1 + BIT2 + BIT3); //turn off led

//Setting key port P2.6 P2.7

P2DIR &= ~(BIT6+BIT7);//setting IO for input

while(1)

{

if(Is_sw1_pressed()==1) // is key 1 pressed

{ // yes

P4OUT |= BIT1; // turn ON LED1

}

else

{ //no

P4OUT &= ~BIT1; //turn off LED1

}

if(Is_sw2_pressed()==1) // is key 2 pressed

{ // yes

P4OUT |=BIT2; // turn ON LED2

}

else

{ //no

P4OUT &= ~BIT2; //turn off LED2

}

}

}

void delay_ms(unsigned int duration)

{

unsigned int i;

for(i=0;i<5000*duration;i++){};

}

unsigned char Is_sw1_pressed(void)

{

if ((P2IN & 0x40) == 0) // is SW1 pressed?

{ //yes

delay_ms(10); // wait 10mS for debounce.

if ((P2IN & 0x40) == 0) // is SW1 still has pressed status after 10mS delay?

{ // yes, we have key press

return 1;

}

}

return 0;// if key is not pressed, return 0

}

unsigned char Is_sw2_pressed(void)

{

if ((P2IN & 0x80) == 0) // is SW1 pressed?

{ //yes

delay_ms(10); // wait 10mS for debounce.

if ((P2IN & 0x80) == 0) // is SW1 still has pressed status after 10mS delay?

{ // yes, we have key press

return 1;

}

}

return 0;// if key is not pressed, return 0

}

3.7 思考题

(1)软件消抖方法,除了采用延时以外,是否还有其它方法可以实现去抖的效果?

答:还可以用中断来检测按键。

(2) 延时函数delay_ms 延时精确吗?如果不精确,用什么方法可以达到精确的延时效

果?

答:抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。通过调整delay_ms()

的参数可以更加精确。

(3)如果用中断来检测按键,和延时方法相比,是否更有优势?

答:中断可以通过边沿触发,在中断服务程序中把是否有键按下的信息反馈给主函数,省去了延时函数的等待过程,所以更有优势。

4.IO实验--按键输入(查询)

4.1 实验介绍

实验演示了按键的基本功能,MCU 通过检测相应I/O 的电平变化,来判断是否有按键

按下。有按键按下时,实验平台上的三个LED 点亮。松开按键的时候,LED 灯熄灭。

4.2 实验目的

(1) 掌握按键检测的原理;

(2) 掌握如何控制MSP430 的GPIO。

4.3 实验原理

(1) 当按键没有按下时:DVCC 进过两个电阻连接到MCU 的IO 口,此时MCU 相应的IO

口电平为高电平。

(2) 当按键按下时:DVCC 经过电阻R76 之后对地导通,此时MCU 相应的I/O 口电平为

低。

(3) 所以,通过检测与key1、key2 相连的两个IO 口电平状况就可以知道按键有无按下。

完成该实验,我们只需要用到3 个寄存器:PxIN、PxOUT、PxDIR。

4.4 实验步骤

(1)将PC 和板载仿真器通过USB 线相连;

(2) 打开CCS 集成开发工具,选择Project->Import Existing CCS Eclipse Project,导入

MSP430F6638_DemoV2.0\4.Key_inquiry\MSP430F6638_key_inquiry 文件夹中的工程;

(3) 选择对该工程进行编译链接,生成.out 文件。然后选择,将程序下载

到实验板中。程序下载完毕之后,可以选择全速运行程序,也可以选择

单步调试程序,选择F3 查看具体函数。也可以程序下载之后,按下,软件界面恢复到原编辑程序的画面。再按下实验板的复位键,运行程序。(调试方式下的全速运行和直接上电运行程序在时序有少许差别,建议上电运行程序)。

4.5 实验现象

按下按键,相应的LED 灯点亮。

4.6 关键代码分析

#include"msp430f6638.h"

void main(void)

{

WDTCTL = WDTPW+WDTHOLD; // Stop WDT

//setting direction

P2DIR &= ~(1<<6);//setting IO for input

P4DIR |= (1<<1)|(1<<2)|(1<<3);//setting IO for output

P4OUT = 0x00;

while (1)

{

if ((P2IN & 0x40) == 0)//If key is pressed

{

P4OUT = 0xff;//led on

}

else

P4OUT = 0X00;//led off

}

}

4.7 思考题

(1) 该实验代码的效果是只有按键按下时,LED 灯才会点亮。按键松开后,LED 熄

灭。如何修改程序,使按下按键一次,LED 点亮,再次按下按键时,LED 熄灭?

while (1)

{

if ((P2IN & 0x40) == 0)//If key is pressed

{

P4OUT ^= BIT1+BIT2+BIT3;//XOR P4.1,P4.2,P4.3

}

}

(2) 下面这种操作IO 的方法和直接对IO 口赋值相比,有什么好处?

P2DIR &= ~(1<<6); //IO口方向设置为输入

P4DIR |= (1<<1)|(1<<2)|(1<<3); //IO口方向设置为输出

答:避免对P2和P4其他的IO口造成影响

(3) 去掉该句代码,程序是否能正常运行?为什么?

WDTCTL = WDTPW+WDTHOLD; // 关闭看门狗

答:不能。因为在程序开始之前,关门狗计时器是开启状态,如果不先关掉,有可能在程序运行过程中发生复位。

相关文档
相关文档 最新文档