|
第三篇 MSP-EXP430F5529LP的通用GPIO操作
[复制链接]
一、 通用I/O的简单操作 参见MSP430X5XX datasheet.pdf
1.1 I/O的简介
特点:
l 多种复用和设置(即可控制是否输入、是否输出、是否接上拉电阻、是否接下拉电阻、是否可接受中断);
l 独立的可编程的单独的I / o
l 输入或输出的任意组合
l 单独配置P1和P2中断。一些设备可能包括额外的端口中断。
l 独立的输入和输出数据寄存器
1.2 I/O的简单配置
MSP430的I/O的配置是用软件来实现的,是通过相应的配置寄存器来实现的。(用到某个I/O时,一定要先配置好该I/O,否则易出错)
1.2.1 I/O方向设定寄存器PXDIR
如设定P1.1和P1.2为输出状态操作为:P1DIR |=(BIT1+BIT2),拉高设定为输出,拉低设定为输入(默认)。
1.2.2 I/O输入设定寄存器PXIN
如设定P1.1和P1.2的输入为低电平操作为:P1IN &=~(BIT1+BIT2)。
1.2.3 I/O输出设定寄存器PXOUT
l 当只用为简单的输出时:
如设定P1.1和P1.2输出高电平操作为:P1OUT |=(BIT1+BIT2)。
l 如果该引脚为正常
I/O功能,且当前已设定为输入方向,且上拉/下拉电阻寄存器是有效地。那么PXOUT可以用来配置上拉和下拉电阻:低电平为下拉电阻;高电平为上拉电阻;
1.2.4 上拉下拉电阻使能寄存器PXREN
l 低电平该寄存器为无效状态;
l 高电平该寄存器为有效状态;
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的闪烁*/
//****************************************************************************/
// MSP430F5529LP
// ----------------------
// | |
// | |
// -- |RST P4.7|-->LED2
// | |
// | P1.0|-->LED1
// 2014-7-7
// IAR Embedded Workbench Version: 5.60
//****************************************************************************/
#include //该头文件内部包含430各个寄存器的配置情况
int main(void)
{
unsigned int i;
WDTCTL = WDTPW+WDTHOLD; // 关闭看门狗
P1DIR |= BIT0; // P1.0设置为输出
P4DIR |= BIT7; // P4.7设置为输出
while(1)
{
P1OUT ^= BIT0; // 异或 P1.0
for(i=50000;i>0;i--); // 延时
P4OUT ^= BIT7; // 异或 P4.7
for(i=50000;i>0;i--); // 延时
}
}
/*实现按键的控制*/
//*****************************************************************************/
// Description: Button1-->P2.1 Button2-->P1.1
//
// MSP430F5529LP
// -----------------
// /|\| XIN|-
// | | |
// --|RST XOUT|-
// /|\ | |
// --o--|P2.1 P1.0|-->LED1
// \|/ | |
// --o--|P1.1 P4.7|-->LED2
// 2014-7-7
// IAR Embedded Workbench Version: 5.60
//****************************************************************************/
#include
int main(void)
{
inti;
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
P1DIR |= BIT0; // 设置P1.0为输出
P4DIR |= BIT7; // 设置P4.7为输出
P1DIR |=~BIT1; // 设置P1.1为输入
P2DIR |=~BIT1; // 设置P2.1为输入
while (1)
{
if (P1IN & BIT1) //判断P1.1是否为高,
{
for(i=0;i<1000;i++);
if (P1IN & BIT1)
P1OUT |= BIT0;
}
else
P1OUT &= ~BIT0;
}
}
|
|