(一)GPIO

一、MSP430单片机端口概述

(1)端口P1和P2
P1和P2端口具有中断能力。从P1和P2端口的各个I/O引脚引入的中断可以独立地被使能,并且被设置为上升沿或者下降沿触发中断。所有P1端口的I/O引脚的中断都来源于同一个中断向量PORT1_VECTOR。同理,P2端口的中断源都来源于另一个中断向量PORT2_VECTOR
可以对每个独立的端口进行字节访问,或者将两个结合起来进行字访问。端口组合P1和P2、P3和P4、P5和P6、P7和P8可结合起来称为PA、PB、PC和PD端口。当进行字操作写入PA口时,所有的16位数据都被写入这个端口;利用字节操作写入PA端口低字节时,高字节保持不变;利用字节指令写入PA端口的高字节时,低字节保持不变。其他端口也是一样。当写入的数据长度小于端口的最大长度时,那些没有用到的位保持不变。应用这个规则来访问所有端口,除了中断向量寄存器P1IV和P2IV,它们只能进行字节操作。

(2)其他端口

这些端口没有外部中断能力,其余功能与P1、P2端口一样,能实现输入/输出功能和外围模块功能。每个端口有6个寄存器供用户使用,用户可通过这6个寄存器对它们进行访问和控制。每个端口的6个寄存器分别为:输入寄存器(PxIN)、输出寄存器(PxOUT)、方向选择寄存器(PxDIR)、输出驱动能力调节寄存器(PxDS)、上拉/下拉电阻使能寄存器(PxREN)和功能选择寄存器(PxSEL)。具体用法同P1和P2端口。

二、GPIO的API

(1)配置IO口模式的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*输入输出*/
GPIO_setAsOutputPin(uint8_t selectedPort, uint16_t selectedPins);
GPIO_setAsInputPin(uint8_t selectedPort, uint16_t selectedPins);

/* 上拉下拉 */
GPIO_setAsInputPinWithPullDownResistor(uint8_t selectedPort, uint16_t selectedPins);
GPIO_setAsInputPinWithPullUpResistor(uint8_t selectedPort, uint16_t selectedPin
s);

GPIO_setDriveStrength(uint8_t selectedPort, uint16_t selectedPins, uint8_t
driveStrength);

/* 外设输入/输出 */
GPIO_setAsPeripheralModuleFunctionOutputPin(uint8_t selectedPort, uint16_t
selectedPins);
GPIO_setAsPeripheralModuleFunctionInputPin(uint8_t selectedPort, uint16_t
selectedPins);

(2)外部中断相关函数

1
2
3
4
5
6
GPIO_enableInterrupt(uint8_t selectedPort, uint16_t selectedPins);
GPIO_disableInterrupt(uint8_t selectedPort, uint16_t selectedPins);
GPIO_clearInterrupt(uint8_t selectedPort, uint16_t selectedPins);
GPIO_getInterruptStatus(uint8_t selectedPort, uint16_t selectedPins);
GPIO_selectInterruptEdge(uint8_t selectedPort, uint16_t selectedPins, uint8_t
edgeSelect);

edgeSelect包括

1
2
3
//specifies what transition sets the interrupt flag Valid values are:
GPIO_HIGH_TO_LOW_TRANSITION //下降沿
GPIO_LOW_TO_HIGH_TRANSITION //上升沿

(3)控制GPIO输出/读取输入

1
2
3
4
GPIO_setOutputHighOnPin(uint8_t selectedPort, uint16_t selectedPins);
GPIO_setOutputLowOnPin(uint8_t selectedPort, uint16_t selectedPins);
GPIO_toggleOutputOnPin(uint8_t selectedPort, uint16_t selectedPins);
GPIO_getInputPinValue(uint8_t selectedPort, uint16_t selectedPins);