一、基础介绍
MSP430多达 8个数字 I/O端口 ,P1 - P8 (不同封装引脚也不一样,需看具体型号), 每个端口具有 8 个 I/O 引脚 。每个引脚都可进行单独的配置 。
注意 :只有 端口 1 和 端口 2 具有中断功能。并且其中每个 I/O引脚都可单独启用中断 ,并配置 中断触发信号 。
注意 :所有 P1 I/O线路 都会获得 一个中断向量 。 所有 P2 I/O 线路 都会获得一个 不同的中断向量 。
注意 :未使用的 I/O 引脚 应配置为 I/O功能 、输出方向 、并保持未连接状态 。 或者 集成的上拉/下拉电阻器 可通过 置位未使用的引脚 PxREN位 来启用防止悬空输入。
二、引脚振荡器
某些MSP430器件有一个内置于某些信号内的引脚振荡器功能 ,该功能可用于电容式触控传感应用 ,无需使用外部无源器件 。
电容式传感器可被直接连接至 MSP430引脚 。
引脚大约 0.7V 的稳健 ,典型内置滞后。
当启用引脚振荡器功能时,其他的引脚配置被覆盖 。输出驱动器关闭,而弱上拉/下拉 启用并由引脚本身的电压电平控制 。
I/O上的电压被馈入引脚的施密特触发器 ,然后路由到一个计时器。与计时器的连接时特定于器件的,因此在器件特定数据表中进行了定义 。
施密特触发器输出被反相 ,然后决定是启用上拉还是下拉 。由于反相,一旦选择了引脚振荡器引脚配置,引脚就开始振荡 。 在路由到计时器时钟输入或计时器捕捉通道之前 ,一些引脚振荡器输出通过逻辑或运算进行组合 。 因此 ,一次只能启用一个引脚振荡器 。每个引脚的振荡频率由引脚上的负载和 I/O类型定义 。具有模拟功能的 I/O 通常显示比纯数字I/O 更低的振荡频率 。
无外部负载的引脚显示 1MHz 至 3MHZ 的典型振荡频率
触摸板电容(外部容性负载) 的变化会对引脚振荡器频率产生影响。靠近的指尖会增加触摸板的电容,从而导致由更长充电时间引起的较低自身振荡频率 。可以直接在内置计时器通道中捕捉振荡频率。
三、寄存器资源
1、 端口x 输入寄存器 PxIN寄存器 x = 1 - 8
PxIN : 端口输入 ,每个位对应端口x上的每个通道 0 --- 输入低电平 1 --- 高电平
2、 端口x输出寄存器 PxOUT 寄存器 x = 1 - 8
PxOUT : 端口x输出 ,每个位对应端口x的一条通道 。
当 I/O 被配置为 输出模式时 0 --- 输出低电平 1 --- 输出高电平
当 I/O 被配置为 输入模式并使能上/下拉时 : 0 --- 下拉 1 --- 选择上拉
3、 端口x 方向寄存器 PxDIR 寄存器 x = 1 - 8
PxDIR :端口x的方向 ,每个位对应端口x的一条通道。 0 --- 配置为 输入 1 ---- 配置为输出
4、 端口x 中断标志寄存器 PxIFG寄存器 x = 1/2
PxIFG :端口x中断标志 ,每个位对应端口x的一条通道 。 0 --- 无中断挂起 1 --- 有
注意 :对 P1OUT 、P1DIR 、P2OUT 、P2DIR 进行写入可能会引发设置相应的PxIFG
5、端口x 中断边沿选择寄存器 PxIES寄存器 x = 1/2
PxIES :端口x中断边沿选择 。每个位对应一条通道。 0 --- PxIFG标志 上升沿置1 1 --- 下降沿
注意 :对 PxIES写入时,也可能会引发相应的 中断标志
6、 端口x 中断使能寄存器 PxIE寄存器 x = 1/2
PxIE :端口x中断使能,每个位对应一条通道。 0 --- 中断禁止 1 --- 中断使能
7、 端口x 功能选择寄存器 PxSEL寄存器 PxSEL2 寄存器 x = 1 - 8
PxSEL / PxSEL2 :端口功能选择,每个位对应一条通道。 两者配合使用设置引脚功能
PxSEL2 / PxSEL :
0 0 ---- I/O功能
0 1 --- 主要模块功能
1 0 --- 第二模块功能 ,保留
1 1 --- 第三模块功能
RxSEL :选择 I/O功能 和 其他模块功能
PxSEL2 :选择主模块功能 和 辅模块功能
注意 :当 P1SELx 和 P2SELx 任何位置1 后 ,会禁用相应引脚的中断功能 。
8、端口x 上拉 或 下拉电阻使能寄存器 PxREN寄存器 x = 1 - 8
PxERN :上拉下拉电阻使能 。 每个位对应一条通道 。 当端口 配置为输入时 ,可设置该位。
0 ---- 禁用 上拉 下拉 1 --- 使能 上拉 / 下拉
注意 :不建议在 PxSEL = 1时,使能上拉下拉 ,该组合可能会导致不需要的电流流过内部电阻器
四、各引脚功能选择 配置
1、 P1 端口
2、P2端口
3、P3端口
4、P4端口
5、P5端口
6、P6端口
五、例程
#include <msp430.h>
/*
* 上电初始化时:
* (1)默认GPIO为 通用I/O功能 ,输入方向
*
* 建议未使用的引脚配置为 :I/O通用功能 、输出方向
* 本例程利用查询和中断的两种方式 处理输入信号。
*/
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; //STOP WDT
//初始化配置为 全部I/O功能 ,输出低电平
P1DIR = 0xFF; //全部配置为输出
P1OUT = 0; //输出模式中输出低电平
P2SEL = 0; //P2全员 I/O功能
P2DIR = 0xFF;
P2OUT = 0;
P3DIR = 0xFF;
P3OUT = 0;
P4DIR = 0xFF;
P4OUT = 0;
P5DIR = 0xFF;
P5OUT = 0;
P6DIR = 0xFF;
P6OUT = 0;
/*
* 注意 PA = Port7 + Port8 ,为16bit ,其他用法与GPIO口一样
* 如 :PADIR 、PAOUT等
*/
/* 循环查询方式判断输入
P1DIR |= 0x01; //P1.0 输出方向
P1DIR &= ~0x10; //P1.4输入方向
while(1)
{
if(P1IN & 0x10) //P1.4 默认输入方向
P1OUT |= 0X01;
else
P1OUT &= ~0x01;
}
*/
// 利用中断判断输入
P1DIR |= 0x01; //输出方向
P1DIR &= ~0x10; //P1.4 输入方向
P1IE |= 0x10; //P1.4中断使能
P1IES |= 0x10; //下降沿触发中断
P1IFG &= ~0x10; //清空 P1.4中断标志位
__bis_SR_register(LPM4_bits + GIE); //开启总中断 ,和LMP4低功耗模式
}
#pragma vector = PORT1_VECTOR //P1端口中断
__interrupt void Port_1(void)
{
P1OUT ^= 0x01;
P1IFG &= ~0x10;
}