1. I/O端口简介 1.1 I/O端口简介
MSP430最多时有6组I/O端口的,每一组时有8位。也就是P1到P6,8位也就是说,P1.0到P1.7。那么MSP430单片机就有48个通用I/O端口。下面先来看一下总共的特点是MSP430一个好的特点是,给用户提供了一个比较多的外部中断能力,比如说P1口和P2口就有中断能力。
MSP430单片机数字I/O的一些特点:
※完全独立的可编程的数字I/O;
※每一个都可以配置为输入或输出;
※P1和P2端口都是可以独立配置成中断的;
※都具有独立的输入输出寄存器。
1.2端口P1、P2结构
该图是P1、P2的结构图。
通用端口P1和P2各有8个引脚及各自的控制寄存器,每一引脚都可单独控制,并且每一引脚都可用作中断源。
P1和P2各有一个中断向量。P1.0到P1.7产生同一个中断,P2.0到P2.7也产生同一个中断。
它们各有7个寄存器用来控制端口的引脚。
P1和P2经过8位MDB和MAB与处理内核连接,它们必须用字节指令以绝对寻址模式进行访问。
1.3 P1和P2的中断控制功能
端口P1和P2有8个中断标志位、8个中断允许位、8个中断事件触发沿选择位,并各有一个中断向量。
每个中断信号各有3位来配置中断,即:
※中断标志位:P1IFG.0~P1IFG.7和P2IFG.0~P2IFG.7。
※中断允许位:P1IE.0~P1IE.7和P2IE.0~P2IE.7。
※中断触发沿选择位:P1IES.0~P1IES.7和P2IES.0~P2IES.7。
中断标志位P1IFG.0~P1IFG.7产生一个中断,P2IFG.0~P2IFG.7也产生一个中断。当满足两个条件:PnIE.x置位且通用中断允许位GIE置位时,P1.0~P1.7或P2.0~P2.7中的一个或多个中断事件将产生中断请求。中断标志位不会在中断被接收后自动复位。中断服务程序必须进行中断源的检查和将相应的中断标志位复位的处理。
1.4 端口P3、P4、P5和P6
通用端口P3、P4、P5和P6的结构如图所示。每个引脚可以作为I/O端口工作,也能是外围模块的引脚。MSP430这种引脚功能的复合较少了芯片的引脚。
每个端口各有4个控制寄存器。
P3、P4、P5和P6经过8位MDB及MAB与处理机内核连接,他们必须用字节指令以绝对寻址模式来访问。
2. 数字I/O寄存器 2.1 P1、P2的控制寄存器
P1寄存器
P2寄存器
7个寄存器为I/O功能的配置提供了最大的灵活性,即:
※所有I/O位均可独立编程;
※可以有各种输入、输出和中断条件的组合;
※P1和P2的8位全部可用于对外部事件的中断处理。
图中所示的是P1、P2的7个寄存器,这些寄存器都是8位的,必须用字节指令以绝对寻址模式进行访问。
2.2寄存器介绍
输入寄存器P1IN、P2IN
这两个只读寄存器反应I/O引脚上的信号,并且写入时会在写有效期间增加电流消耗。
输出寄存器P1OUT、P2OUT
如果I/O引脚用作输出,则8位的输出寄存器提供相应位的输出缓存信息,输出缓存可用所有含目的操作数的指令修改。在读取时,输出缓存的内容和引脚定义方向无关,改变方向不会改变输出缓存的内容。
方向寄存器P1DIR、P2DIR
每个寄存器含有相互独立的8位,用于定义每个I/O引脚的方向。各位在PUC后复位。
中断标志寄存器P1IFG、P2IFG
每个寄存器有对应于I/O引脚的8个标志位,表示是否由中断挂起。
对每一个中断标志写‘0’使它复位,写‘1’使它置位并产生中断。
每一组中断标志P1IFG.0~P1IFG.7和P2IFG.0~P2IFG.7只用一个中断向量,它们都是多源中断向量。当中断被接受时这些标志位不会自动复位,要由中断服务程序来确定中断源,并将相应的标志复位。
2.3寄存器介绍
中断触发沿选择寄存器P1IES、P2IES
中断触发沿选择寄存器中对应于每一个I/O引脚都有1位选择触发中断标志的电平跳变。
中断允许寄存器P1IE、P2IE
中断允许寄存器中对应每一个I/O引脚都有一相应的允许位,可允许或禁止中断。
功能选择寄存器P1SEL、P2SEL
为了减少MSP430的引脚,P1、P2引脚与外围模块的引脚同用。P1SEL和P2SEL用来选择引脚的I/O端口功能或者外围模块功能。每个寄存器都有相互独立的8位来定义访问I/O引脚的功能为端口功能或者外围模块功能。各位在PUC后复位。
2.4 P1、P2寄存器注意事项
首先我们 对寄存器P1OUT和P1DIR及对P2OUT和P2DIR的操作可能使P1IFG或P2IFG中的相应位置位。
然后就是我们解释一下中断时间宽度,任何外部中断事件必须长于1.5倍MCLK周期,以保证被接受并使响应中断标志位置位。
在P1IES、P2IES中,我们改变P1IES或P2IES中的位可能会引起相应中断标志位置位,与引脚电平无关,具体变化参见第三幅图,再次不再赘述。
然后就是P1、P2的中断触发,只有跳变才能引起中断,静态电平不能。如果在执行RETI指令后中断标志仍然置位,则在RETI指令完成后中断将再次发生。这一点保证了每次跳变都能得到软件响应。
最后是P1SEL、P2SEL的选择功能,如果PnSEL.x置位,泽中断触发沿选择电路被禁止,输入信号将不会产生中断。
2.5P3、P4、P5和P6的控制寄存器
每个端口有4个控制寄存器,为数字I/O功能提供了最大的灵活性。功能有:
※所有I/O位均可独立编程;
※可以有各种输入组合;
※可以任意组合端口功能和模块功能。
如图所示的是每个端口的4个控制寄存器,为字节宽度,必须用字节指令进行访问。
注意:这4组端口不具有中断功能,还有P1和P2具有中断功能。
这四个寄存器的意义以及使用方法,参见P1、P2端口的相应的4个寄存器,P3~P6除了不具有中断能力,其他功能是相似的。
3. 配置数字I/O 3.1软件延时下的LED闪烁
首先我们把代码输进IAR中,代码如图所示,点击IAR中Debug按钮,进入C-SPY环境,点击GO,使得程序全速运行。程序运行的效果为LED指示灯闪烁。IAR为用户提供了方便的头文件,能够大大地简化程序编写。对于MSP430F14x系列微处理器,一般在程序开头包含msp430f14x.h即可。
3.2程序说明
程序的流程图如右图所示,在主体循环中通过软件延时,控制端口的输出状态在0和1之间转换。
根据硬件电路,当P1口的输出控制寄存器第0位为0时,P1.0输出低电平,LED发光;当P1口的输出控制寄存器第0位为1时,P1.0为高电平,LED熄灭。因此P1端口输出控制寄存器第0位的变化反映在实际电路中就是LED在点亮与熄灭状态的相互转换。需要注意,在该电路中电流的流向是:VCC->电阻->LED->I/O,电流经过电阻和发光二极管流入MSP430的P1.0端口,即俗称的灌电流。
3.3按键查询控制的LED发光
按键查询控制的LED发光的程序如图所示。
程序在主体循环中不断检测P2端口输入寄存器的状态,如果有键按下(P2.4)输入为高电平,则寄存器的第四位为1。
因此在主体循环中不断检测P2端口输入寄存器第4位状态,如果该位为1则表明当前用户按下了S2按键,对P1.0复位,LED点亮;否则对P1.0置位,LED熄灭。
3.4总结
通过上面两个程序可以总结出,在日常使用MSP430系列单片机时,在端口使用方面所特别需要注意的问题:
※在使用端口之前必须要设置端口的方向,即端口是处在输入状态还是输出状态:输入状态下,读取端口输入寄存器可以获取当前端口的输入状态;输出状态下,写入端口输出寄存器可以控制端口的输出状态。
※在改变单个端口相关寄存器状态时,一般采用按位的“与”操作或者是“或”操作,以保持其他端口原状态不变。
3.5外部中断控制下的LED闪烁
MSP430F149的P1和P2两组端口具有外部中断能力,通过设置相关的控制寄存器可以允许或者屏蔽其中的某一位或者某几位的中断能力。
我们来看图中所示的程序。程序主函数中首先针对按键使用的P2.4端口和LED使用的P1.0端口初始化,包括按键对应端口的中断功能、LED对应端口的方向和初始化状态,然后设置系统总中断。中断服务程序首先关闭P2.4中断,判断是否是P2.4产生的中断,是则修改LED对应端口输出状态,最后清除中断标志寄存器,打开P2.4中断退出中断服务程序。
在程序中置位了P2IES寄存器的第4位,因此只有在松开按键的瞬间,P1.0端口连接的LED指示灯的状态才会改变(点亮或熄灭,这里暂时忽略掉按键抖动问题)。