首页 > 代码库 > MSP430G2库文件使用说明---IO

MSP430G2库文件使用说明---IO

这次介绍一下MSP430的IO口的使用,首先需要点击这里下载库文件。解压完成之后有下面的几个文件:

1.System.h  里面主要是一些关系系统的文件,以及各种各样模块函数的头文件(现在仅仅编写了IO的部分);

2.IO.cpp,这个文件是有关IO的实现文件;

3.Interrupt.cpp这个文件是中断的文件;


解压完成之后,将IO.cpp和Interrupt.cpp文件添加进你的工程中,如果System.h没有放在你的Project所在的目录中,那么就要在工程中添加一下头文件了。

我们的编译环境是TI公司的CCS。如果你使用的是IAR,那么需要将System.h里面的<msp430.h>修改成为<io430.h>.


点亮一个流水灯

在main.cpp文件中添加如下的代码:
#include"System.h"

int main()
{
	SystemInit();

	SetPinMode(LED1,Out);
	while(1)
	{
		DigtalWrite(LED1,1);
		Delay(1000);
		DigtalWrite(LED1,0);
		Delay(1000);
	}

}

点击编译,下载,运行之后,会看见LED1,也就是LaunchPad上面左边的那个灯开始闪烁。下面是几个函数的解释:
1.SystemInit()
这个函数不带有任何参数。必须也是只能在main函数开始的时候运行。这个函数是设置MSP430的工作频率在16MHZ。这个SystemInit支持4中不同的频率,分别是1MHZ,8MHZ,12MHZ,16MHZ。我们默认的情况下是使用16Mhz。当然这并不是最快的。我们为什么选择这四种频率呢?因为这四种频率设置的初值在430的Flash中已经出厂固话了。我们只需要读出固化的数值,然后写到相应的寄存器中即可。
  这里说到我们默认的频率是16MHZ,那么如果我想换用其他的频率呢?我们这里给你提供了上面所说的四种选择。修改方法:
在Project上面右键,选择属性(properties,快捷菜单的最后面的一项),如下图所示:
在宏定义中添加MCLK_1MHZ,这时候调用SystemInit的时候就设置时钟为1M,同样,可以设置8,12,16M。另外,如果在这里什么也不添加,那么默认的频率就是16M。这里要注意,MCLK_1MHZ,和其他的只能在define中添加一个,不能添加多个。如果一个也不添加,那么默认的就是16M;

2.SetPinMode
我们知道,一个引脚可能有几种不同的方式,输入,输出。当然,输入也有不同的,可以设置成为上拉输入(Input Pull Up),也可以设置成为下拉输入(Input pull down ),或者上拉或者下拉都不加的浮空输入(In floating)。所以,在System.h下面有这么几个enum:

typedef enum{IPU,IPD,InFloating,Out,PrimaryIn,PrimaryOut,SecondIn,SecondOut}PinMode;

目前只实现了前面的四个输入输出,后面的还没有实现。SetPinMode的第一个参数是从const Pin pin,第二个参数是const PinMode mode;什么是Pin呢?我在System.h文件中define了P1,P2口的所有引脚,可以查看System.h文件。如果不明白什么意思的 话,可以查看这篇博客(这是STM32下面,我写的实现方式,原理是一样的)。我是链接。
这样,比如想将P1.0引脚设置成为输出模式,可以这样写:SetPinMode(P10,Out);
3.DigtalWrite
在这里就不必解释了,不明白的话可以看看我在STM32平台下面的代码:我是链接
4.Delay,DelayUs
这里的Delay是延时有参数指定的ms。这一,他的参数的类型是int,在CCS中,int是一个16位的,所以最大的范围是32767.
DelayUs是延时参数指定的us。同样,参数也是int。
这里要注意了,这个Delay和DelayUs是与时钟的频率无关的,不管你是1M,还是16M,都能够达到相应的延时。

到这里,我们已经完成一个简单的流水灯了。

引脚的输入

在main函数中输入下面的代码:
#include"System.h"

int main()
{
	SystemInit();

	SetPinMode(LED1,Out);
	SetPinMode(BUTTON,IPU);
	while(1)
	{
		DigtalWrite(LED1,DigtalRead(BUTTON));
	}

}

在launchPad中,这个BUTTON其实也就是P13,LED1其实 也就是P10,他们都是相同的define。这些代码将开关的IO口设置成为一个上拉输入,在开关没有按下的时候是高电平,这样将读出的高电平写到LED1上面。当开关按下的时候DigtalRead读出的是低电平,这时候LED1熄灭。

MCLK_xxMHZ

在main函数中写下面的程序:
#include"System.h"

int main()
{
	SystemInit();

	SetPinMode(LED1,Out);
	while(1)
	{
		DigtalWrite(LED1,1);
		for(int i=0;i<30000;i++);
		DigtalWrite(LED1,0);
		for(int i=0;i<30000;i++);
	}

}

通过在define中定义不同的MCLK_xMHZ,观察LED1闪烁的速度。可以看出,在MCLK_16MHZ的时候LED1闪烁的最快,在MCLK_1MHZ的时候闪烁的最慢。

IO口的中断

430中PORT1和PORT2的每一个引脚都能够设置成为中断模式。这个中断模式可以选择上升沿或者下降沿有效。下面来看看QianFan Lib对中断的支持:在main中输入下面的代码:
#include"System.h"

int main()
{
	SystemInit();

	SetPinMode(LED1,Out);
	DigtalWrite(LED1,0);
	SetPinMode(BUTTON,IPU);
	SetPinIt(BUTTON,true,High_Low);

	while(1)
	{

	}

}

main函数将LED1设置成为输出模式,接着关闭LED1(DigtalWrite(LED1,0);)。下面将BUTTON设置成为上拉输入,并且允许中断,中断检测为下降沿(High_Low)。下面来简单的解释一下SetPinIt(Set Pin Interrupt的缩写)。这个函数有三个参数,第一个参数为const Pin pin,表示对哪一个引脚操作。第二个参数为bool isEnable,表示是否开启中断。true开启,false关闭。第三个参数为const ItSelect select,选择上升沿还是下降沿。他的声明是这样的:
typedef enum {Low_High,High_Low} ItSelect;

这样SetPinIt就打开了BUTTON 的中断,并且设置成为下降沿触发。
这里就要说明一下为什么BUTTON 设置成为上拉输入。因为BUTTON按下的时候是低电平。所以平时应该是高电平,这样按下的时候才能够触发下降沿。
写完了main函数,接下来就要写一下中断的函数,打开Interrupt.cpp文件:
#pragma vector=PORT1_VECTOR
__interrupt void Port1_Handler(void)
{
  //Add your code in there...
	DigtalWrite(LED1,1);
}

#pragma vector=PORT2_VECTOR
__interrupt void Port2_Handler(void)
{
}

#pragma vector=ADC10_VECTOR
__interrupt void Adc10_Handler(void)
{
}

有上面的代码,其中Port1_Handler是关于PORT1引脚的中断的处理函数(P10~P17)的所有中断的处理函数都在这。我们在Port1的处理函数中将LED1打开,这样按下BUTTON之后就能够看见LED1亮了。(其实,这时候我们在处理Port1的中断的时候,在进入中断后应该判断是哪一个中断发生了,并且在处理完中断之后将标志位清除,这里千帆就省略了,读者在写的时候 一定要加上)。



暂时的代码就只有这么多,其余的部分在日后有空是继续更新,敬请期待!