目录
1. GPIO 常用寄存器:
如下(以GPIOA为例子):
GPIOAFEN: 设置为0表示作为通用IO(GPIO)使用 //设置为1表示做其它功能性IO,如串口/SPI..
GPIOADE: 数字IO使能: 0为模拟IO, 1 为数字IO, //如作为AUX输入的IO口就需要设置成模拟IO, 减少数字IO对AUX的干扰.
GPIOADIR: 控制IO的方向: 1为输入, 0为输出.
GPIOA : IO方向为输入时,读此寄存器的值即得到引脚的高低状态 //IO为输出时, 写此寄存器的高低即设置对应引脚的高低输出.
GPIOADRV: 0 输出驱动为8mA //1 输出驱动为32 mA //IO方向为输出且是数字IO时有效
//以下寄存器控制上拉或下拉, 注意只有当IO设置为输入时, 上下拉才有效. //IO方向为输出时上下拉自动无效
GPIOAPU //10K上拉使能
GPIOAPD //10K下拉使能
GPIOAPU200K //200K上拉使能
GPIOAPD200K //200K下拉使能
GPIOAPU300 //300欧上拉使能
GPIOAPD300 //300欧下拉使能
2. 常见输入输出示例:
1) PA0输出高低(点LED灯)示例
//正常启动Main函数
int main(void)
{
printf("Hello AB5300\n");
//示例开始
GPIOAFEN &= ~BIT(0); //PA0作为GPIO使用
GPIOADE |= BIT(0); //PA0设置为数字IO
GPIOADIR &= ~BIT(0); //PA0方向设置为输出
WDT_DIS(); //测试代码,关看门狗,防止看门狗复位
while(1) {
GPIOA |= BIT(0); //PA0输出高, 等效于GPIOASET = BIT(0);
delay_ms(100);
GPIOA &= ~BIT(0); //PA0输出低, 等效于GPIOACLR = BIT(0);
delay_ms(100);
}
2) 得到PA0引脚状态(作用输入)示例
int main(void)
{
printf("Hello AB5300\n");
//示例开始
GPIOAFEN &= ~BIT(0); //PA0作为GPIO使用
GPIOADE |= BIT(0); //PA0设置为数字IO
GPIOADIR |= BIT(0); //PA0方向设置为输入
GPIOAPU |= BIT(0); //作为输入,为了有稳定的输入状态(1或0),在外部没上拉或下拉时,需要根据实际情况开内部上拉或下拉
WDT_DIS(); //测试关看门狗,防止看门狗复位
while(1) {
delay_ms(100);
printf("GPIOA0 = 0x%X\n",GPIOA & BIT(0)); //打印读到的PA0状态
}
3. 关于GPIOASET/GPIOACLR:
优化输出使用的特殊寄存器, 它们只对写入为1的位有效, 写入为0的位是不影响它以前的状态
GPIOASET: 把设置为1的位置1. 设置为0的位不影响以前的状态.
GPIOACLR: 把设置为1的位置0. 设置为0的位不影响以前的状态.
使用方法如:
GPIOASET = BIT(0); //PA0输出高, 等效于 GPIOA |= BIT(0);
GPIOACLR = BIT(0); //PA0输出低, 等效于GPIOA &= ~BIT(0);
优化原理: 如程序把IO设置为高, 一般这样写GPIOA |= BIT(0);
这里实际上有三个步骤: 1) 先读出GPIOA. 2) 再把GPIOA | BIT(0); 3) 把或后的结果再写回GPIOA
而使用GPIOASET等效优化后, 直一条指令GPIOASET = BIT(0);即达到 上面三步才能达到的效果.