首页 > 代码库 > 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的中断的时候,在进入中断后应该判断是哪一个中断发生了,并且在处理完中断之后将标志位清除,这里千帆就省略了,读者在写的时候 一定要加上)。
暂时的代码就只有这么多,其余的部分在日后有空是继续更新,敬请期待!
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。