MSP430F249的IO端口文档格式.docx
《MSP430F249的IO端口文档格式.docx》由会员分享,可在线阅读,更多相关《MSP430F249的IO端口文档格式.docx(58页珍藏版)》请在冰豆网上搜索。
为了减少芯片引脚的数量以降低芯片的成本,又提供更多功能的I/O口,现在许多单片机都采用了I/O口复用技术,即端口可作为通用的I/O口使用,也可作为某个特殊功能的端口使用,用户可根据系统的实际需要来定义使用。
这样就为设计开发提供了方便,简化了单片机系统的硬件设计工作。
在MSP430系列中,不同单片机拥有的I/O口数目不同,引脚最少的MSP430F20XX只有10个可用I/O口,而功能更丰富的MSP430FG46XX拥有多达80个I/O口。
MSP430F249单片机有6组I/O口:
P1~P6。
每组I/O口都有8个可以独立编程的引脚,例如P1口有8个可编程引脚,为P1.0~P1.7。
所有这些I/O口都是双功能(有的为3功能)复用的。
其中第一功能均作为数字通用I/O接口使用,而复用功能则分别用于中断、时钟/计数器、USCI、比较器等应用。
这些I/O口同外围电路构成单片机系统的人机接口和数据通信接口。
MSP430F249单片机的I/O口主要有以下特征:
(1)每个I/O口可以独立编程设置。
(2)输入、输出功能可以任意结合使用。
(3)P1和P2口具有中断功能,可以单独设置成上升沿或下降沿触发中断。
(4)有独立的输入/输出寄存器。
3.1通用I/O接口
MSP430F249单片机的每组I/O口都有4个控制寄存器,分别为方向控制寄存器PxDIR、输入寄存器PxIN、输出寄存器PxOUT和功能选择寄存器PxSEL,此处,小写字母“x”表示6组I/O口的数字序号,x=1~6,即P1口的方向控制寄存器为P1DIR,P6口的方向控制寄存器为P6DIR。
另外,P1和P2口还具有3个中断寄存器,分别为中断允许寄存器PxIE、中断沿选择寄存器PxIES和中断标志寄存器PxIFG,此处,x=1~2。
1、方向控制寄存器PxDIR
该寄存器控制Px口的各个引脚的方向。
设置相应的比特位(bit)为1时,相对应的引脚为输出;
设置相应的bit为0时,则对应的引脚为输入。
PxDIR寄存器复位时初始值全部输入为0。
PxDIR寄存器的比特分配如下所示:
PxDIR.7
PxDIR.6
PxDIR.5
PxDIR.4
PxDIR.3
PxDIR.2
PxDIR.1
PxDIR.0
可以看出,Px口的每个引脚都可以单独配置成输入或者输出方向的控制。
需要注意的是:
MSP430系列单片机端口输出电流最大为6mA,当需要驱动比较大的负载的时候,需要利用三极管或者缓冲器来提高端口的驱动能力。
MSP430单片机的I/O口为双向I/O口,因此在使用I/O口前首先要用方向选择寄存器来设置每个I/O口的方向,在程序运行中还可以动态改变I/O口的方向。
例如P1.0、P1.1、P1.2接有按键,P1.4、P1.5、P1.6接有LED,通用I/O接口应用示例如图3.1所示。
图3.1通用I/O接口应用示例图
其中按键为输入设备,按键未按下时,电阻R4、R5、R6将端口P1.0、P1.1、P1.2上拉到高电平,按键按下时,按键将对应的端口短路到地。
P1.0、P1.1、P1.2要设为输入,P1.4、P1.5、P1.6外接发光二极管,要设置为输出。
程序如下:
#defineBIT0(0x0001)
#defineBIT1(0x0002)
#defineBIT2(0x0004)
#defineBIT3(0x0008)
#defineBIT4(0x0010)
#defineBIT5(0x0020)
#defineBIT6(0x0040)
#defineBIT7(0x0080)
P1DIR|=BIT4+BIT5+BIT6;
//P1.4、P1.5、P1.6设为输出
P1DIR&
=~(BIT0+BIT1+BIT2);
//P1.0、P1.1、P1.2设为输入(可省略)
其中BIT0~BIT7为宏定义,P1DIR|=BIT4+BIT5+BIT6是将P1DIR寄存器的第4、5、6比特位置1,即配置为输出;
=~(BIT0+BIT1+BIT2)是将P1DIR寄存器的第0、1、2比特位置0,即配置为输入。
由于PxDIR寄存器在复位过程中会被清0,没有被设置的I/O口方向均为输入状态,因此第二句可以被省略。
对于所有已经设成输出状态的I/O口,可以通过PxOUT寄存器设置其输出电平。
2、输入寄存器PxIN
在输入的模式下,读取该寄存器的相应比特来获得相应引脚上的数据。
在输入模式下,当I/O口相应输入高电平时,该寄存器相应的比特为1;
当I/O口相应输入低电平时,该寄存器相应的比特则为0。
PxIN寄存器的比特分配如下所示:
PxIN.7
PxIN.6
PxIN.5
PxIN.4
PxIN.3
PxIN.2
PxIN.1
PxIN.0
该寄存器为只读寄存器,写无效。
其每个比特可以单独读取,从而获得相应引脚上的输入数据或者引脚的状态。
3、输出寄存器PxOUT
在输出模式下,如果该寄存器的相应比特设置为1时,相应的引脚输出为高电平;
如果设置该寄存器的相应比特为0时,则相应的引脚输出低电平。
PxOUT寄存器的比特分配如下所示:
PxOUT.7
PxOUT.6
PxOUT.5
PxOUT.4
PxOUT.3
PxOUT.2
PxOUT.1
PxOUT.0
值得注意的是:
PxOUT复位时其值不确定,在使用过程中应该先使PxOUT的值确定以后才设置方向控制寄存器。
对于所有已经被设成输入状态的I/O口,可以通过PxIN寄存器读回其输入电平。
例如读回P1.0口上所接按键的开关状态,若处于按下状态(低电平),则从P1.4口输出低电平点亮LED,程序如下:
P1OUT=BIT4+BIT5+BIT6;
//P1.4~P1.6输出高电平
//二极管阳极接高电平,二极管不发光
if((P1IN&
BIT0)==0)P1OUT|=BIT4;
//P1.4输出低电平点亮LED
4、功能选择寄存器PxSEL
用于设置Px口的每一个引脚作为一般I/O口使用还是作为外围模块的功能使用。
当该寄存器的相应比特设置为1时,其对应的引脚为外围模块的功能,即第二功能,具体每个端口的第二功能请参考芯片手册。
当该寄存器的相应比特设置为0时,其对应的引脚为一般I/O口。
PxSEL寄存器的比特分配如下所示。
其复位值全为0,默认为I/O口功能。
PxSEL.7
PxSEL.6
PxSEL.5
PxSEL.4
PxSEL.3
PxSEL.2
PxSEL.1
PxSEL.0
在MSP430F249单片机中,很多内部功能模块也需要和外界进行数据交换,为了不增加芯片引脚数量,大部分都和I/O口复用引脚,导致MSP430F249单片机的所有I/O口都具有第二功能。
通过寄存器PxSEL可以设置某些I/O口作为第二功能使用。
例如从MSP430F249芯片手册中可以查到,MSP430x249系列单片机的P3.4、P3.5口的第二功能为串行口的TXD、RXD。
若需要将这两个引脚配置为串口收发引脚,则须将P3SEL的第4、5比特位置高,程序如下:
P3SEL|=BIT4+BIT5;
//P3.4,、P3.5设为串口收发引脚
5、中断允许寄存器PxIE
该寄存器控制P1、P2口的中断允许。
设置相应的比特为1,则对应的引脚允许中断功能;
如果设置相应的比特为0,则对应的引脚不允许中断功能。
寄存器的比特分配如下所示。
其复位值全为0,默认为不允许中断。
PxIE.7
PxIE.6
PxIE.5
PxIE.4
PxIE.3
PxIE.2
PxIE.1
PxIE.0
6、中断沿选择寄存器PxIES
控制P1、P2口的中断触发沿选择。
如果设置相应的比特为1,则其对应的引脚选择下降沿触发中断方式;
如果设置相应的比特为0,则其对应的引脚选择上升沿触发中断方式。
PxIES寄存器的比特分配如下所示。
其复位值全为0,默认为上升沿触发中断。
PxIES.7
PxIES.6
PxIES.5
PxIES.4
PxIES.3
PxIES.2
PxIES.1
PxIES.0
在使用I/O口中断之前,需要先将I/O口设置为输入状态,并允许该比特位的中断,再通过PxIES寄存器选择触发沿方式为上升沿触发或者下降沿触发。
例如将P1.0、P1.1、P1.2口设为外部中断源,P1.0为上升沿触发,P1.1、P1.2下降沿触发,程序设计如下:
=~(BIT0+BIT1+BIT2);
//P1.0、P1.1、P1.2设为输入
P1IES|=BIT1+BIT2;
//P1.0为上升沿触发、P1.1、P1.2设为下降沿中断
P1IE|=BIT0+BIT1+BIT2;
//允许P1.5、P1.6、P1.7中断
_EINT();
//总中断允许
7、中断标志寄存器PxIFG
如果P1、P2口相应的比特为1,则该位对应的引脚有外部中断产生;
若相应的比特为0,则其对应的引脚没有外部中断产生。
PxIFG寄存器的比特分配如下所示。
其复位值全为0,默认为未发生中断。
PxIFG.7
PxIFG.6
PxIFG.5
PxIFG.4
PxIFG.3
PxIFG.2
PxIFG.1
PxIFG.0
无论中断是否被允许,也无论是否正在执行中断程序,只要对应的I/O口满足中断条件(如一个下降沿触发),PxIFG中的相应比特都会立即置1并保持,必须通过软件复位将其清零,最大可能的保证不会漏掉每一次中断。
在MSP430系列单片机中,P1口的8个中断和P2口的8个中断各公用了一个中断入口,当引脚中断功能打开后,外部输入的变化会使得PxIFG对应的比特位置1。
当有多个引脚产生中断时,可以通过查询该寄存器在中断服务程序中用于判断哪一位I/O口产生的中断。
下面的中断服务程序示范P1.0、P1.1、P1.2发生中断后将P1.4、P1.5、P1.6的LED点亮。
#pragmavector=PORT1_VECTOR//P1口中断源
__interruptvoidPORT1_ISR(void)//声明一个中断服务程序,名为PORT1_I