第一章,先学习I/O。I/O的操作是最基本的,而且这些寄存器也都要牢牢掌握。MSP430难就难在它有大量的寄存器需要设置,虽然不是每个都必须掌握,但I/O控制寄存器我觉得肯定还要记住的。这个太基础了啊啊-_'
大家手里要常备一份原理图(PCB图),方便查线和配置引脚
一、通用I/O的简单操作(设置)
详情可参照TI官方资料 SLAU208 Digital I/O Module
1.1 I/O的简介
特点:①多种复用和设置(即可控制是否输入、是否输出、是否接上拉电阻、是否接下拉电阻、是否可接受中断);
②一般情况下,P1和P2都是具有中断能力的。从P1和P2接口的各个I/O管脚引入的中断可以独立的被使能并且设置为上升沿或者下降沿触发。对应的中断向量表分别为P1IV和P2IV,它们只能进行字操作,并且PAIV这个寄存器根本不存在。
③P1、P2可合为PA,P3、P4可合为PB,…PC、PD。所以P1为8位BCD 0x00,PA为16位BCD 0x0000。当进行字操作写入PA口时,所有的16位都被写入这个端口;当利用字节操作写入PA口的低字节时,高字节保持不变;
④由于430很多I/O和外围电路接线,所以这里常用位操作。如事先定义(接下来也会用到,先在此声明)BIT0=0X01、BIT1=0X02、BIT3=0X04…BIT7=0X80,那么将P1.1、P1.3的输出设为1的时候,就可以这样操作:P1OUT|=(BIT1+BIT3)。这样显得很清楚。
⑤没有用到的I/O,要统一拉低为好。此外,当读入的数据长短小于端口最大长度时,那些没有用到的位会被视零。
1.2 I/O的简单配置
430I/O的配置是用软件来实现的,是通过相应的配置寄存器来实现的。(用到某个I/O时,一定要先配置好该I/O,否则易出错)
1.2.1 I/O方向设定寄存器PXDIR
如设定P1.1和P1.2为输出状态
操作为: P1DIR |=(BIT1+BIT2)等价于PADIR |=(BIT1+BIT2)也等价于PADIR_L|=(BIT1+BIT2。
拉高设定为输出,拉低设定为输入(默认)。
1.2.2 I/O输入设定寄存器PXIN
如设定P1.1和P1.2的输入为低电平
操作为: P1IN &=~(BIT1+BIT2)。
1.2.3 I/O输出设定寄存器PXOUT
①当只用为简单的输出时:
如设定P1.1和P1.2输出高电平
操作为: P1OUT |=(BIT1+BIT2)。
②如果该引脚为正常I/O功能,且当前已设定为输入方向,且上拉/下拉电阻寄存器是有效地。那么PXOUT可以用来配置上拉和下拉电阻:
低电平为下拉电阻;
高电平为上拉电阻;
1.2.4 上拉/下拉电阻使能寄存器PXREN
低电平该寄存器为无效状态;
高电平该寄存器为有效状态;
1.2.5 输出驱动能力设置寄存器PXDS
弱化驱动可以减弱电磁干扰EMI,全力驱动会增强电磁干扰。默认为减弱驱动。
低电平表示减弱的驱动(默认);
高电平表示全力的驱动;
1.2.6 功能选择寄存器PXSEL
用来声明该端口是要应用于外围电路的特殊功能(不决定输入输出方向),默认为低电平。
低电平表示普通的I/O(默认);
高电平表示该引脚将有连接外围电路的特殊用途;
如:开发板初始化函数HAL_Board.c中有这样一句程序:
P5SEL |=(BIT2+BIT3)(=00001100);
这句话的意思就是声明P5.2和P5.3将有特殊用途,实际上这两个I/O接的是外部的高频时钟晶振(之后还要设定为输入状态才可以)。
此外需要注意的是,一旦某个I/O的PXSEL置高了,那么该引脚将不能再被用为中断引脚。
总结,简单的程序应用:
LED位于每个触摸按键下方,具体接口请查询原理图
#include 该头文件内部包含430各个寄存器的配置情况
void main(void)
{
WDTCTL=WDTPW+WDTHOLD; //关闭看门狗
P1DIR|=(BIT0+BIT1+BIT2+BIT3+BIT4+BIT5); //P1.0-P1.5方向为输出,BITX的定义在msp430.h中
P1OUT&=~(BIT0+BIT1+BIT2+BIT3+BIT4+BIT5); //清零
int i=0,j=0;
while(1)
{
if(i>5)
i=0;
else
{
switch(i)
{
case 0:P1OUT=0x01;break;
case 1:P1OUT=0x02;break;
case 2:P1OUT=0x04;break;
case 3:P1OUT=0x08;break;
case 4:P1OUT=0x10;break;
case 5:P1OUT=0x20;break;
}
}
i++;
for(j=20000;j>0;j--); //延时
}
}
这一部分讲外部中断。
看介绍再加弄懂程序才是王道
外部中断是MSP430优先级最低的中断而且是可屏蔽中断。用起来比较简单。
1.2.7 简单的端口中断(外部中断)
P1、P2的所有端口都具有中断能力,可以通过寄存器PxIFG,PxIE和PxIES来配置。其他端口则需参照具体的引脚说明书。所有的P1中断标志是最优先的(相比其它引脚的外部中断),其中P1IFG.0又最优。
PXIV中断向量寄存器:只有P1IV和P2IV。最高优先级使能中断在P1IV寄存器中产生一个序号,这个数字会被程序计数器识别或者加入其中,然后自动的执行合适的中断服务程序。关闭P1口中断不会影响P1IV寄存器中的值。P2口具有相同的功能。PxIV寄存器只能字访问。
PxIFGx 中断标志寄存器:只有相应的中断使能PXIE打开且总中断GIE打开,该寄存器才有效。
低电平表示没有中断请求等待响应;
高电平表示有中断请求等待响应;
注意:使用端口的中断功能期间,如果进行PXIN、PXOUT等操作可能使中断变化。
注意:中断标志需要软件清零。有一种情况例外:两个中断同时发生,先响应优先级高的中断,当该中断服务程序结束后,该位的中断标志会自动清零,然后去响应另外一个中断。
PxIE 中断使能寄存器
低电平表示中断关闭;
高电平表示中断允许;
PXIES 中断触发方式选择寄存器
低电平表示上升沿触发;
高电平表示下降沿触发;
外部中断应用示例:
#include
int s=0; //s用来表示按键次数
int num =0; //num表示LED值
void main(void){
WDTCTL=WDTPW+WDTHOLD; //关闭看门狗
P1DIR=0xff; //P1全部接输出
P1OUT=0x00; //接LED初始化故全拉低,这样开始灯是灭的
P2DIR=0x00; //P2全部设为输入。因为要接受外部中断
P2IFG=0x00; //清除P2口的中断标志
P2IE=BIT2; //P2.2开启中断
P2IES=0xff; //P2为下降沿触发
P2IN=BIT2; //P2.2输入拉高,因此开关闭合时会拉低产生下降沿(即中断)
P2OUT=0xff;
P2REN=0xff; //作为输入的时候一定要配置上拉电阻(很重要,容易忘记,我就在这错了-_’)
__enable_interrupt(); //开总中断
while(1)
{
num=s%5;
switch(num){
case 0:P1OUT=BIT1;break;
case 1:P1OUT=BIT2;break;
case 2:P1OUT=BIT3;break;
case 3:P1OUT=BIT4;break;
case 4:P1OUT=BIT5;break;}}}
#pragma vector=PORT2_VECTOR //固定格式,声明中断向量地址
__interrupt void Port2_ISR(void) {//中断子程序
unsigned int temp; //局部变量
int i;
for(i=0;i<12000;i++); // 延时消抖
if((P2IN&0xff)!=0xff){ //如果有键按下
temp=P2IFG; //读取中断标志
P2IFG=0x00; //标志位清零
if(temp==0x04) //如果P2.2产生中断
s++;}} //这一部分其实有几句话很多余,主要是为了体现每个端口中断的知识
备注中断子程序调用格式:
#pragma vector=中断向量地址
__interrupt void 中断服务程序名(void)
{
//中断处理程序
}
1.2.8 未使用的I/O
未使用的I/O管脚最好被设置为普通I/O功能、输出方向并且在PCB板上不连接这些管脚,以防止浮动的输入和降低功耗。因为这些管脚没有被连接,所以它们的输出值没有必要在意。或者可以通过设置未使用管脚的PxREN寄存器来使能置高/置低寄存器以避免浮动输入的干
本文转自网络,版权归原作者,如果您觉得不好,请联系我们删除!
广告
关于立创商城
立创商城(WWW.SZLCSC.COM)成立于2011年,致力于为客户提供一站式电子元器件线上采购服务,成交量全国领先。拥有10000多平方米现代化元器件仓库,现货库存超100000种,集团电子全产业链自营服务涵盖:在线EDA(LCEDA)+行业领先的PCB打样/中小批量+元器件商城+钢网制造+SMT贴片+电子设计教育及方案。作为一家品种齐全、自营库存、质量有保障的电子元器件垂直商城,立创商城所有元器件均从原厂或代理商正规渠道采购,保证原装正品,为您提供专业的一站式元器件采购服务。