中科蓝讯蓝牙: 通用IO(GPIO)一般操作

目录

1. GPIO 常用寄存器:

2. 常见输入输出示例:

3. 关于GPIOASET/GPIOACLR:


1. GPIO 常用寄存器:

如下(以GPIOA为例子):

GPIOAFEN: 设置为0表示作为通用IO(GPIO)使用   //设置为1表示做其它功能性IO,如串口/SPI..
GPIOADE: 数字IO使能: 0为模拟IO, 1 为数字IO,    //如作为AUX输入的IO口就需要设置成模拟IO, 减少数字IO对AUX的干扰.
GPIOADIR: 控制IO的方向:  0为输入, 1为输出.
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);即达到 上面三步才能达到的效果.

你可能感兴趣的:(中科蓝讯蓝牙_软件开发总述,蓝讯蓝牙开发,中科蓝讯,GPIO,中科蓝讯蓝牙)