医疗电子技术网|技术阅读
登录|注册

您现在的位置是:医疗电子技术网 > 技术阅读 > MSP430输入输出I/O口详解

MSP430输入输出I/O口详解

广告

IO 口是处理器系统对外沟通的最基本部件,从基本的键盘、LED 到复杂的外设芯片等,都是通过IO 口的输入、输出操作来进行读取或控制的。

 

MSP430系列中,不同单片机的IO 口数量不同。体积最小的MSP430F20xx系列只有10 个IO,适合在超小型设备中应用;功能最丰富的MSP430FG46xx系列多达80 个IO 口,足够应付外部设备繁多的复杂应用。在MSP430FE425 单片机中,共有14 个IO 口,属于IO 口较少的系列。但由于需要大量引脚的设备,如LCD、多通道模拟量输入等都有专用引脚,不占用IO 口。因此在大部分设计中IO 数量还是够用的。

l IO 口寄存器

和大部分单片机类似,MSP430 单片机也将8 个IO 口编为一组。例如P1.0~P1.7都属于P1 口。每组IO 口都有4 个控制寄存器,其中P1 和P2 口还额外具有3 个中断寄存器。

 

表2.1.1 IO 口寄存器列表。

寄存器名 寄存器功能 读写类型 复位初始值

PxIN Px 口输入寄存器 只读 无

PxOUT Px 口输出寄存器 可读可写 保持不变

PxDIR Px 口方向寄存器 可读可写 0(全部输入)

PxSEL Px 口第二功能选择 可读可写 0(全部为IO 口)

PxIE Px口中断允许 可读可写 0(全部不允许中断)

PxIES Px口中断沿选择 可读可写 保持不变

PxIFG Px口中断标志位 可读可写 0(全部未发生中断)

 

这是本书第一次出现寄存器列表,有必要说明一下MSP430单片机的寄存器以及标志位全部是大写的。若出现的小写的“x”,表示该设备不止一个,因此寄存器也不止一个。为了缩短列表长度,不用全部列出,用字母x 表示序号。例如对于表中的PxOUT,当x取1、2、3 时,就变成了P1OUT、P2OUT、P3OUT。

 

n PxDIR寄存器用于设置每一位IO口方向: 0=输入 1=输出MSP430 单片机的IO 口属于双向IO 口,因此在使用IO 口时首先要用方向选择寄存器来设置每个IO 口的方向。例如P1.5、P1.6、P1.7 接有按键,P1.1、P1.3、P1.4接有LED,那么P1.5、P1.6、P1.7 要设为输入,P1.1、P1.3、P1.4 要设为输出:

 

P1DIR|=BIT1+BIT3+BIT4; // P1.1、P1.3、P1.4设为输出

 

P1DIR &=~ (BIT5+BIT6+BIT7); // P1.5、P1.6、P1.7设为输入(可省略)

 

由于PxDIR 寄存器在复位过程中会被清0,没有被设置的IO 口方向均为输入状态,因此第二句可以被省略。

 

对于所有已经设成输出状态的IO口,可以通过PxOUT寄存器设置其输出电平;对于所有已经被设成输入状态的IO 口,可以通过PxIN 寄存器读回其输入电平。例如读回P1.5口上的开关状态,并判断若处于按下状态(低电平)则从P1.1 口输出高电平点亮LED:

 

if((P1IN & BIT5)==0) P1OUT|=BIT1; //若P1.5为低电平则P1.1输出高电平

 

n PxSEL寄存器用于设置每一位IO的功能: 0=普通IO口 1=第二功能

在MSP430单片机中,很多内部功能模块也需要和外界进行数据交流,为了不增加芯片引脚数量,大部分都和IO 口复用管脚。因此大多数IO 引脚都具有第二功能。通过寄存器PxSEL 可以指定某些IO 引脚作为第二功能使用。例如从附录中管脚排布图中查到MSP430x42x 系列单片机的P2.4、P2.5 口和串口的TXD、RXD 公用引脚。若需要将这两个引脚配置为串口收发脚,则须将P2SEL的4、5位置高:

 

P2SEL |= BIT4 + BIT5; // P2.4,5 设为串口收发引脚

l IO 口中断

在MSP430 所有的单片机中,P1 口、P2 口总共16 个IO 口均能作引发中断。在MSP430x42x系列中,14 个IO 均属于P1 或P2 口,因此每个IO 都能作为中断源使用。通过下列2 个寄存器配置IO 口作为中断使用:

 

n PxIE寄存器用于设置每一位IO的中断允许: 0=不允许 1=允许

 

n PxIES寄存器用于选择每一位IO的中断触发沿: 0=上升沿 1=下降沿

 

在使用IO 口中断之前,需要先将IO 口设为输入状态,并允许该位IO 的中断,再通过PxIES寄存器选择触发方式为上升沿触发或者下降沿触发。例如将P1.5、P1.6、P1.7 口设为中断源,下降沿触发:

 

P1DIR &=~(BIT5 + BIT6 + BIT7); // P1.5、P1.6、P1.7设为输入(可省略)

 

P1IES |= BIT5 + BIT6 + BIT7; // P1.5、P1.6、P1.7设为下降沿中断

 

P1IE |= BIT5 + BIT6 + BIT7; // 允许P1.5、P1.6、P1.7中断

 

EINT(); // 总中断允许

 

n PxIFG寄存器是IO中断标志寄存器:0=中断条件不成立 1=中断条件曾经成立过无论中断是否被允许,也不论是否正在执行中断服务程序,只要对应IO 满足了中断条件(例如一个下降沿的到来),PxIFG 中的相应位都会立即置1 并保持,只能通过软件人工清除。这种机制的目的在于最大可能的保证不会漏掉每一次中断。在MSP430系列单片机中,P1 口的8个中断和P2 口8个中断各公用了一个中断入口,因此该寄存器另一重要作用在于中断服务程序中用于判断哪一位IO 产生的中断。下面的中断服务程序示范P1.5、P1.6、P1.7 发生中断后执行不同的代码:

#pragma vector = PORT1_VECTOR //P1口中断源

__interrupt void P1_ISR(void) //声明一个中断服务程序,名为P1_ISR()

{

if(P1IFG & BIT5) //判断P1中断标志第5位(P1.5)

{

... ... //在这里写P1.5中断处理程序

}

if(P1IFG & BIT6) //判断P1中断标志第6位(P1.6)

{

... ... //在这里写P1.6中断处理程序

}

if(P1IFG & BIT7) //判断P1中断标志第7位(P1.7)

{

... ... //在这里写P1.7中断处理程序

}

P1IFG=0; //清除P1所有中断标志位

}

 

注意在退出中断前一定要人工清除中断标志,否则该中断会不停发生。类似的原理,即使IO 口没有出现中断条件,人工向写PxIFG 寄存器相应位写“1”,也会引发中断。更改中断沿选择寄存器也相当于跳变,也会引发中断。所以更改PxIES寄存器应该在关闭中断后进行,并在打开中断之前及时清除中断标志。MSP430单片机大量的IO 中断非常适合做键盘输入用,但要注意键盘存在机械结构,在闭合或松开的过程中,机械结构的碰撞和反弹会造成信号上数毫秒的“毛刺”。

广告

关于立创商城

立创商城(WWW.SZLCSC.COM)是嘉立创集团旗下一家品种齐全、自营库存、质量有保障的电子元器件垂直商城,自建6000多平米现代化元器件仓库,现货库存超35000种。立创商城所有元器件均由原厂或代理商正规渠道采购,保证原装正品。

采购元器件推荐上立创商城,注册后可领取15元无门槛使用优惠券,如需业务编号请填写“N”,或直接点击阅读原文注册