我是靠谱客的博主 年轻老鼠,最近开发中收集的这篇文章主要介绍MSP430系列嵌入式实验教程---GPIOMSP430的GPIO寄存器MSP430的位操作,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
MSP430GPIO
- MSP430的GPIO寄存器
- 端口控制寄存器
- MSP430的位操作
- RISC精简指令集
- 写位操作
- 读位操作
MSP430的GPIO寄存器
MSP430通用IO有以下特性:
- 可独立编程单个IO
- 输入输出任意组合
- P1和P2可配置中断(不同系列有所差异,具体查阅手册)
- 独立的输入输出寄存器
- 某些端口可配置上下拉电阻
端口控制寄存器
端口P1具有输入/输出、中断和外部模块功能,这些功能可通过7个控制寄存器的设置来实现。下面介绍
各控制寄存器特点及其使用:
- PxDIR 输入/输出方向寄存器
相互独立的8位分别定义了Px 口的8位的输入输出方向。
使用输入/输出功能时,应先定义端口方向。作为输入时,只能读;作为输出时,可读可写。
PxDIR.x:端口输入输出方向控制
0:输入模式
1:输出模式
操作:
P1DIR |=0x10; // P1.4作输出,其余各位端口方向不变。
P1DIR &=0x7f; // P1.7作输入,其余各位端口方向不变。
- PxIN 输入寄存器
该寄存器是只读寄存器。只能通过读取该寄存器内容才能知道Px 口的输入信号的状态。
读出此寄存器的内容中,只有Px口设为输入的数据位有效。
对于 Px口设为输出的那些位,一般来说,PxIN.x = PxOUT.x
PxIN.x:端口输入的电平
0:端口输入低电平
1:端口输入高电平
操作:
unsigned char Temp;
P1DIR &=0x77 ; // P1.3和P1.7输入
Temp = P1IN; // Temp为在已定义的一变量,Temp 中只要第7位和第四位有效。
- PxOUT 输出寄存器
该寄存器可读可写,读取时,其内容与Px 口引脚定义无关。改变方向寄存器的内容,此寄存器内容不受
影响。
PxOUT.x:端口输出的电平
0:端口输出低电平
1:端口输出高电平
注意:
P1OUT.0 = 1(P1.0输出高),但是P1DIR.0 = 0(该引脚为输入模式),则此时P1.0为输入;
如果将P1DIR.0 = 1(该引脚为输出模式),则此时P1.0为输出,并且输出为高电平。
操作:
P1DIR |=0x88; // P1.3和P1.7输出
P1OUT |=0x88; // P1.3和P1.7输出高电平
MSP430的位操作
RISC精简指令集
MSP430属于RISC型处理器,与普通51类型的复杂指令集的区别在于RISC型处理器不能进行位操作,也就上内存寻址只能到字节不能到位。举个例子来说,一栋楼只有一个邮政编码,快递员送东西只送到楼,显然比送到户要快,但至于包裹具体是哪户人家的就得再想点办法了。
写位操作
对某个字节直接使用“=”进行写操作时,所有的位的值都将改变。如果先将原字节的值读出来,使用位操作对原字节进行赋值,就可以“等效”实现对单个位的写操作。
/* 设定P1OUT原始值为b'0101 1010 */
P1OUT |= 0x01; /* P1OUT = P1OUT | b'0000 0001
b'0101 1010 //P1OUT:0x5A
| b'0000 0001 //0x01
_________________
b'0101 1011 //P1OUT:0x5B
或操作可以实现对特定位置1 */
P1OUT &= ~0x10; /* P1OUT = P1OUT & b'1110 1111
b'0101 1011 //P1OUT:0x5B
& b'1110 1111 //0xEF
_________________
b'0100 1011 //P1OUT:0x4B
与操作可以实现对特定位置0 */
P1OUT ^= 0x02; /* P1OUT = P1OUT ^ b'0000 0010
b'0100 1011 //P1OUT:0x4B
& b'0000 0010 //0x02
_________________
b'0100 1001 //P1OUT:0x49
异或操作可以实现对特定位取反*/
这样可以实现只对特定位进行操作而不影响其他位的值。
另外为了方便操作在”msp430xxx.h"里还包含了各种宏定义来辅助位操作。
#define BIT0 (0x0001u)
#define BIT1 (0x0002u)
#define BIT2 (0x0004u)
#define BIT3 (0x0008u)
#define BIT4 (0x0010u)
#define BIT5 (0x0020u)
#define BIT6 (0x0040u)
#define BIT7 (0x0080u)
#define BIT8 (0x0100u)
#define BIT9 (0x0200u)
#define BITA (0x0400u)
#define BITB (0x0800u)
#define BITC (0x1000u)
#define BITD (0x2000u)
#define BITE (0x4000u)
#define BITF (0x8000u)
有了BIT0-BITF后,可以方便地对寄存器的各位进行设置,不用再一个一个去数二进制的位数了。上述代码可以改写为:
P1OUT |= BIT0; //P1.0 输出高电平
P1OUT &= ~BIT4 //P1.4 输出低电平
P1OUT ^= BIT1; //P1.1 电平取反
另外也可以多个位一起操作:
P1OUT | = BIT3 + BIT5 +BIT6; //P1.3 P1.5 P1.5 输出高电平
P2OUT & = ~BIT2 + ~BIT4 + ~BIT7; //P2.2 P2.4 P2.7 输出低电平
读位操作
if((P1IN&BIT6) == BIT6) //如果P1.6输入高电平 b'0100 1010 & b'0100 0000 = b'0100 0000
// b'0000 1010 & b'0100 0000 = b'0000 0000
P2OUT |= BIT0; //P2.0输出高电平
else
P2OUT &= ~BIT0; //P2.0输出低电平
其他功能寄存器后请查阅后续教程
最后
以上就是年轻老鼠为你收集整理的MSP430系列嵌入式实验教程---GPIOMSP430的GPIO寄存器MSP430的位操作的全部内容,希望文章能够帮你解决MSP430系列嵌入式实验教程---GPIOMSP430的GPIO寄存器MSP430的位操作所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复