MSP-EXP430G2ETGPIO口的学习
一,大致介绍一下GPIO口
在写之前,小编要先给大家道歉,由于我个人的失误,在上一篇中有一处设置出现了错误,就是芯片选择的时候,应该选择MSP430G2553,虽然2335也能用,但是板子上带的还是2553,所以对此我以深深的反省,保证以后不再犯这种小错误。好了接下来大家跟我一起学习GPIO口吧!
1.什么是GPIO口?
GPIO口是指通用输入/输出接口(General Purpose Input/Output,简称 GPIO)是单片机通过引脚来控制或者采集外部电路的接口,是单片机最基础的功能之一。
2.IO口有什么用?
1)可以独立编程的上拉/下拉电阻的引脚
2)可以提供输入,输出与中断的任意组合
3)所有的寻址指令可对端口寄存器进行读/写访问
3. MSP-EXP430G2ETGPIO口的外设认识
首先让大家先看看这个开发板上的IO口和部分介绍。
MSP430的io口跟51,32单片机的设置有所不同, MSP430的io口是直接将8个io口直接分到一组,分成了P1和P2,而它们的每一个位又给它划分为每一个io口,然后通过十六进制来表示每一个io口,也就成了下图的样子,比如:P1.0的十六进制表示就成了0x01;P1.7的十六进制表示就成了0x80.
4.GPIO口中的寄存器介绍
在上一篇中也提到了,开发板上用到的三个重要的寄存器,接下来给大家详细介绍一下吧!
1)方向寄存器:表达式为PxDIR。每一个IO口都可以被单独配置成输入或者输出状态,而方向寄存器就是决定它是输入还是输出的,其中方向寄存器0表示输入,1表示输出。怎么说呢,它就是相当于皇帝,他想要有人进皇宫或者出皇宫,就指着谁进皇宫,让谁出皇宫,谁就被提名了,然后那个被提名的就准备东西。比如:要用P1口输入,那就直接设置P1DIR=0x00;要用P1.0输出,那么可以设置为P1DIR=0x01;要是P1.0和P1.7同时输出的话,那就成了P1DIR=0x81;还有一种方法就是用头文件已有的宏定义如下图,那么P1DIR=0x01就可以写成了P1DIR=BIT0;那么P1DIR=0x81也就可以直接写成P1DIR=BIT0+BIT7;
2)输出寄存器:表达式为PxOUT。方向寄存器选择输出状态后,输出寄存器就开始对端口进行赋值了。其实它就相当于方向寄存器的禁卫军,皇帝说让那个位置的人逐出皇宫,禁卫军才出动,然后找到那个人,给他打个标签。
比如:要将P1.0设置成高电平,那就可以直接写为P1OUT=0x01;或者写成P1OUT=BIT0.
3)输入寄存器:表达式为PxIN。当引脚作为输入状态时,引脚上的电平就会被缓存到输入寄存器中。读取PxIN的值就可以得知当前引脚的状态了。输入寄存器这点很麻烦,它还涉及到了原理图中引脚的初始状态,就比如说最常见的输入的引脚——按键;如果按键它没有被外部电路赋值的时候它是什么电平?经过我多方查找资料,有人说是高电平,也有人说是低电平,但是实际上按键处于一种叫浮动的状态———也就是有可能是高电平,也有可能是低电平。这种状态是我们最不想看到的状态,因为它很有可能影响到程序的逻辑,也会出现各种bug,还会在电平装换时消耗不必要的能量。因此一般我们在引脚作为输入时通过一个电阻将该引脚接电源或者接地,就形成了弱上拉或者下拉的状态,而此时的电阻就成了上拉电阻或者下拉电阻,接了上/下拉电阻以后,引脚的电平就不会乱跑了,而当外部电路的高/低电平接到引脚上时,该引脚又可以根据外部电平改变状态。为了使用方便,MSP430单片机内部的上/下拉电阻。通过配置PxREN寄存器可以使能上拉/下拉电阻,然后配置PxOUT寄存器就可以选择上拉还是下拉。那么MSP430上的按键就可以这样设置,让P1.3输入,同时使能内部上拉电阻。
P1DIR &=~BIT3;
P1OUT |=BIT3;
P1REN |=BIT3;
4)中断标志寄存器:表达式为PxIFG。0表示没有中断请求,1表示有中断请求。该寄存器有8个标示位,对应相应的引脚是否有待处理的中断请求,这8个中断标志共有一个中断向量,中断标志不会自动复位,必须软件复位。
5)中断触发沿选择寄存器:表达式为PxIES。0上升沿中断,1下降沿中断。
6)功能选择寄存器:表达式PxSEL。0表示选择引脚为io口端,1表示为选择引脚为外围模块功能。
7)上拉/下拉电阻的使能寄存器:表达式PxREN。0表示禁止,1表示使能。
5.GPIO引脚的复用
现在的单片机集成的功能越来越多,例如串口、定时器、 ADC 等,这些外设都需要引脚,但如果为每个外设都留下单独的引脚,单片机的引脚数量将会巨大,这既不经济也不实用。另外这些外设并一定会同时使用,因此单片机提供了引脚复用的功能,将 GPIO 和其他外设放在一个引脚上,使用的时候通过寄存器来选择用哪一个功能。复用的引脚可以通过 PxSEL 寄存器来选择功能。鉴于有些引脚的功能多于 2 个, 1 位寄存器不够用,所以 MSP430G2553 有 PxSEL 和 PxSEL2 两个功能选择寄存器,它们两个再加上PxDIR 寄存器配合起来可以选择多个引脚功能 。每个 MSP430 单片机的引脚功能具体定义在芯片 datasheet 中,查找“Port Schematics”部分可以看到每个引脚有什么功能,以及如何配置寄存器来启用这些功能。
在 User’s Guide 中,也会介绍 PxSEL 寄存器,但不会具体介绍针对每个芯片的具体引脚定义。一般来说引脚复用功能可以分为 Primary function 和 Secondary function,对照 datasheet 和User’s Guide 可以发现二者是可以对应的。 例如我们要将 P1.0 端口配置成 TA0.TACLK 功能(在这里先不关心这个功能具体有什么用),查阅 datasheet 可以找到该功能对应的 3 个寄存器的值,因此将寄存器对应赋值即可启用这个功能。
P1DIR &= ~BIT0;
P1SEL |= BIT0;
P1SEL2 &= ~BIT0;
二,用GPIO口进行试验。
下面是我写的一个实验,实现内容是首先点亮绿色的LED,也就是输出状态,然后就是用开发板上的按键输入来改变红色的LED亮灭。
#include "io430.h" int main(void) { WDTCTL = WDTPW + WDTHOLD; //停止看门狗定时器 //初始化设置 P1DIR &= ~0X08; P1OUT |= 0x08; P1REN |= 0x08; P1DIR |= 0X41; while(1) { volatile unsigned int i; P1OUT ^= 0X01;//点亮绿色的led if((P1IN&0X08)==0X00) { i=2000; while(i--);//消除抖动 if((P1IN&0X08)==0X00) { P1OUT ^= 0X40; } while(!(P1IN&0X08));//检测按键是否松开 } } }
实验很简单,但是它涵盖了输入输出设置,小编也是正处于学习MSP430,如果有那点写的不好,还望大家能在下面回帖指出来,然后能一起学习,一起讨论,希望这篇帖子能帮助到大家!