初学MSP430F5529有关的 通用I/O口的设置之一
[复制链接]
本帖最后由 fish001 于 2017-9-17 21:50 编辑
第一章,先学习I/O。I/O的操作是最基本的,而且这些寄存器也都要牢牢掌握。MSP430难就难在它有大量的寄存器需要设置,虽然不是每个都必须掌握,但I/O控制寄存器我觉得肯定还要记住的。这个太基础了啊啊-_' 大家手里要常备一份原理图(PCB图),方便查线和配置引脚 一、通用I/O的简单操作(设置) 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的闪烁*/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); //清零 /*P1SEL=0X00; PXDS=0X00;默认*/ 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--); //延时 } }
|