GPIO都需要两个寄存器位一个用于方向的选择输入/输出,一个用于数据位(读入数据/输出数据)
GPIO相关的寄存器均为八位,为什么呢,八位每一位都控制一个引脚。官方寄存器文档地址
1.有关寄存器的简单介绍
输入输出方向寄存器
输入数据寄存器
输出数据寄存器
如果I/O设置为输出模式,那bit的设置就是输出高或输出低
如果I/O设置为输入模式且使能上拉上拉或下拉电阻,那Bit=1设置就是设置上拉电阻反之设置下拉电阻
上拉或下拉电阻使能寄存器
功能选择寄存器
每个引脚除了I/O外还有别的功能也就是开启I/O复用
还有控制输出驱动强度的寄存器等等我就不再说了可以在官方文档里都有介绍
2.如何使用这些寄存器
2.1初始化I/O
例如P6.5受P6IN,P6DIR,P6OUT,P6SEL等寄存器的第五位控制
比如设置P6.5引脚为上拉输入模式
P6SEL &= ~BIT5 //设置为I/O模式
P6DIR &= ~BIT5 //设置方向为输入
P6REN |= BIT5 //使能上下拉电阻
P6OUT |= BIT5 //设置为上拉电阻
为啥设置需要运算搞这么麻烦直接等于BIT5不行吗?答:不行
一个方向寄存器就要控制PX所有引脚的方向,如果输出高电平P6DIR = BIT5这样写那是不是就影响了之前引脚的配置呢?
观察结果,设置为输入与不设置是相同的结果,那不设置可以吗?答不行。为了稳定我们最好还是加上。
2.2如何改变I/O的输出状态
P6OUT ^= BIT5
3.官方库函数使用
除此之外的配置方式外,官方提供了GPIO的驱动库我们只需要调用官方的一个库函数就可以达到我们上面的效果 。
设置某个引脚为输出模式
extern void GPIO_setAsOutputPin(uint8_t selectedPort,uint16_t selectedPins);
//selectedPort选择那个引脚PX
//selectedPins选择PX的那一个引脚
例如:
GPIO_setAsOutputPin(GPIO_PORT_P1,GPIO_PIN0)//设置P1.0为输出模式
参数说明:参数官方里函数说明很清楚我在这就不多说了。
设置某个引脚为输入模式
extern void GPIO_setAsInputPin(uint8_t selectedPort,uint16_t selectedPins);
设置引脚输出高电平
extern void GPIO_setOutputHighOnPin(uint8_t selectedPort, uint16_t selectedPins);
切换引脚输出
extern void GPIO_toggleOutputOnPin(uint8_t selectedPort,uint16_t selectedPins);
将引脚设置为下拉输入模式
extern void GPIO_setAsInputPinWithPullDownResistor(uint8_t selectedPort,uint16_t selectedPins);
获取引脚上的输入值
extern uint8_t GPIO_getInputPinValue(uint8_t selectedPort,uint16_t selectedPins);
其实只要掌握了寄存器的使用库函数的使用就是玩!
4.LED点灯程序
4.1寄存器操作
#include <driverlib.h>
//当前使用系统默认的时钟大约1M
void my_delay_ms(int ms)
{
for(;ms>0;ms--)
_delay_cycles(1000);//系统延时函数,延时时长由系统时钟决定
}
/**
* main.c
*/
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
P1SEL &= ~BIT0; //设置为I/O模式
P1DIR |= BIT0; //设置方向为输出
while(1)
{
my_delay_ms(1000);//一秒钟电平翻转一次
P1OUT ^= BIT0;
}
return 0;
}
5.存在的问题
1.为什么让程序执行循环进行的延时不能使用?
GPIO的使用先到这里下次再见。