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; // 关闭看门狗
答:不能。因为在程序开始之前,关门狗计时器是开启状态,如果不先关掉,有可能在程序运行过程中发生复位。