[经验] 初学者先了解一下MSP430的 位操作

Jacktang   2016-10-31 20:50 楼主
以前很多做51 的朋友,又开始为自己寻找新的猎物了,MSP430 无疑成为他们的首选目标。因此,大多数程序员想轻松地实现过渡,那就是,把以前做的51C 程序尽可能多的移植到430平台中,很不幸,由于处理器架构不同,直接做这些工作起来确实相当困难。首先是位操作问题,51 程序中充彻着大量的位操作,因此,不得不采用变通的方法来做,以下描述了在IAR 编译平台中实现位操作的大致方法,但必须注意到,采用IO 头文件方式的程序,能够实现类似于51 的位编程语句,但并不是真正的位操作,仅仅是语法表达为一个位操作。

方法1--宏定义方式
我们来看对一个端口中位0(BIT0)的位操作程序是如何实现的,因此,假定P1.0 是输出,P1.1 是输入。
定义位操作宏如下:
#define P1BIT0_OUT_HIGH P1OUT |=BIT0
#define P1BIT0_OUT_LOW P1OUT &=~BIT0
#define P1BIT1_IN P1IN &=BIT1
注:BIT0,BIT1 定义在相应430 器件的头文件中使用位操作
......
P1BIT0_OUT_HIGH; //输出P1.0 为高
if(P1BIT_IN) P1BIT0_OUT_LOW; //如果P1.1 输入高,则输出P1.0 低
......
从某种程度上,这种编程方法具备高级语言的编程特点,具有很好的可读性,可移植性也不错,也是目前用的比较多的方法。但是缺点,是不能把宏定义统一起来,每个宏需要程序员自己定义,由此,在多项目管理中,对代码的移植性带来了一些问题。同时,也存在着一些潜在的问题,例如,无意的错误定义等。这给程序调试多多少少带来一些负面影响。

方法2--使用IO 头文件方式
IAR 除了提供目前我们经常使用的mspx43xxx.h 头文件外,其实,也定义了可以进行位操作的寄存器结构定义。还是以P1 口的BIT0,BIT1 为例。这个头文件就是io 头文件,根据不同的器件,命名为io430xxx.h,在这些头文件中,将每个寄存器封装到一个联合结构中,因此,我们既可以象方法1 一样,通过自己定义宏,实现自己的位操作,也可以像51 一样,进行位操作。使用方法如下:
......
P1OUT_bit.POUT_0=1; //输出P1.0 为高
if(P1IN_bit.PIN_1) P1OUT_bit.POUT_0=0; //如果P1.1 输入高,则输出P1.0 低
......
IO 方法,表述方法没有方法1 好。但是比较直接,当然,为了更好的可读性,可以再次重新定义宏。如下:
#define P1BIT0_OUT_HIGH P1OUT_bit.POUT_0=1
#define P1BIT0_OUT_LOW P1OUT_bit.POUT_0=0
#define P1BIT1_IN P1IN_bit.PIN_1
如此定义后,可直接使用方法1 编制的源代码,唯一的,需要修改方法1 所定义的宏了。

总结
      两种方法产生的汇编代码,是相同的,仅仅是对同一个对象的不同表述而已。建议用户采用io 定义方法,因为,io 定义几乎包含了mspx430xxx.h 的所有定义,一般而言,可以直接替换。此外,用这两种编程时,建议中断和低功耗采用如下函数,他们包括在头文件intrinsics.h 中。

中断:
__disable_interrupt();
__enable_interrupt();

SR 寄存器:
__bis_SR_register(设置参数);
__bic_SR_register(设置参数);

功耗模式:
__low_power_mode_0();
__low_power_mode_1();
__low_power_mode_2();
__low_power_mode_3();
__low_power_mode_4();
__low_power_mode_off_on_exit();

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复