MSP430系列嵌入式实验教程---GPIO

MSP430GPIO

  • MSP430的GPIO寄存器
    • 端口控制寄存器
  • MSP430的位操作
    • RISC精简指令集
    • 写位操作
    • 读位操作

MSP430的GPIO寄存器

MSP430通用IO有以下特性:

  • 可独立编程单个IO
  • 输入输出任意组合
  • P1和P2可配置中断(不同系列有所差异,具体查阅手册)
  • 独立的输入输出寄存器
  • 某些端口可配置上下拉电阻

端口控制寄存器

端口P1具有输入/输出、中断和外部模块功能,这些功能可通过7个控制寄存器的设置来实现。下面介绍
各控制寄存器特点及其使用:

  1. PxDIR 输入/输出方向寄存器
    输入/输出方向寄存器
    相互独立的8位分别定义了Px 口的8位的输入输出方向。
    使用输入/输出功能时,应先定义端口方向。作为输入时,只能读;作为输出时,可读可写。
    PxDIR.x:端口输入输出方向控制
    0:输入模式
    1:输出模式
    操作:
    P1DIR |=0x10; // P1.4作输出,其余各位端口方向不变。
    P1DIR &=0x7f; // P1.7作输入,其余各位端口方向不变。
  1. PxIN 输入寄存器
    l输入寄存器
    该寄存器是只读寄存器。只能通过读取该寄存器内容才能知道Px 口的输入信号的状态。
    读出此寄存器的内容中,只有Px口设为输入的数据位有效。
    对于 Px口设为输出的那些位,一般来说,PxIN.x = PxOUT.x
    PxIN.x:端口输入的电平
    0:端口输入低电平
    1:端口输入高电平
    操作:
    unsigned char Temp;
    P1DIR &=0x77 ; // P1.3和P1.7输入
    Temp = P1IN; // Temp为在已定义的一变量,Temp 中只要第7位和第四位有效。
  1. PxOUT 输出寄存器
    输出寄存器
    该寄存器可读可写,读取时,其内容与Px 口引脚定义无关。改变方向寄存器的内容,此寄存器内容不受
    影响。
    PxOUT.x:端口输出的电平
    0:端口输出低电平
    1:端口输出高电平
    注意:
    P1OUT.0 = 1(P1.0输出高),但是P1DIR.0 = 0(该引脚为输入模式),则此时P1.0为输入;
    如果将P1DIR.0 = 1(该引脚为输出模式),则此时P1.0为输出,并且输出为高电平。

    操作:
    P1DIR |=0x88; // P1.3和P1.7输出
    P1OUT |=0x88; // P1.3和P1.7输出高电平

MSP430的位操作

RISC精简指令集

MSP430属于RISC型处理器,与普通51类型的复杂指令集的区别在于RISC型处理器不能进行位操作,也就上内存寻址只能到字节不能到位。举个例子来说,一栋楼只有一个邮政编码,快递员送东西只送到楼,显然比送到户要快,但至于包裹具体是哪户人家的就得再想点办法了。

写位操作

对某个字节直接使用“=”进行写操作时,所有的位的值都将改变。如果先将原字节的值读出来,使用位操作对原字节进行赋值,就可以“等效”实现对单个位的写操作。

	/* 设定P1OUT原始值为b'0101 1010 */
    P1OUT |= 0x01;          /* P1OUT = P1OUT | b'0000 0001
                                           b'0101 1010      //P1OUT:0x5A
                                        |  b'0000 0001      //0x01
                                       _________________
                                           b'0101 1011      //P1OUT:0x5B
                             或操作可以实现对特定位置1  */

    P1OUT &= ~0x10;         /* P1OUT = P1OUT & b'1110 1111
                                             b'0101 1011      //P1OUT:0x5B
                                          &  b'1110 1111      //0xEF
                                       _________________
                                              b'0100 1011     //P1OUT:0x4B
                             与操作可以实现对特定位置0  */

    P1OUT ^= 0x02;          /* P1OUT = P1OUT ^ b'0000 0010
                                             b'0100 1011      //P1OUT:0x4B
                                          &  b'0000 0010      //0x02
                                       _________________
                                              b'0100 1001     //P1OUT:0x49
                             异或操作可以实现对特定位取反*/

这样可以实现只对特定位进行操作而不影响其他位的值。
另外为了方便操作在”msp430xxx.h"里还包含了各种宏定义来辅助位操作。

	#define BIT0                (0x0001u)
	#define BIT1                (0x0002u)
	#define BIT2                (0x0004u)
	#define BIT3                (0x0008u)
	#define BIT4                (0x0010u)
	#define BIT5                (0x0020u)
	#define BIT6                (0x0040u)
	#define BIT7                (0x0080u)
	#define BIT8                (0x0100u)
	#define BIT9                (0x0200u)
	#define BITA                (0x0400u)
	#define BITB                (0x0800u)
	#define BITC                (0x1000u)
	#define BITD                (0x2000u)
	#define BITE                (0x4000u)
	#define BITF                (0x8000u)

有了BIT0-BITF后,可以方便地对寄存器的各位进行设置,不用再一个一个去数二进制的位数了。上述代码可以改写为:

P1OUT |= BIT0;	//P1.0 输出高电平
P1OUT &= ~BIT4	//P1.4 输出低电平
P1OUT ^= BIT1;	//P1.1 电平取反

另外也可以多个位一起操作:

P1OUT | = BIT3 + BIT5 +BIT6; 	   //P1.3 P1.5 P1.5 输出高电平
P2OUT & = ~BIT2 + ~BIT4 + ~BIT7;   //P2.2 P2.4 P2.7 输出低电平

读位操作

if((P1IN&BIT6) == BIT6)     //如果P1.6输入高电平    b'0100 1010 & b'0100 0000 = b'0100 0000
                            //                     b'0000 1010 & b'0100 0000 = b'0000 0000
	P2OUT |= BIT0;			//P2.0输出高电平
else 						
	P2OUT &= ~BIT0;			//P2.0输出低电平
	

其他功能寄存器后请查阅后续教程

你可能感兴趣的:(MSP430系列嵌入式实验教程---GPIO)