炬芯(Actions)BLE ATB110X GPIO驱动程序

  • GPIO 总线

GPIO 是 MCU 常用的接口,用户可以单独控制以一个 IO 的输入和输出功能。可用于 控制一个 LED 灯的亮灭、输入一个按键的状态等功能。

 

  • GPIO 控制器

ATB110X 共有 30 个 GPIO,具有下列可配置功能。
• PAD 功能可配置
• 内置 15K 上下拉电阻和 1KB 下拉电阻
• 4 档驱动能力调节
• 可选支持施密特触发器
• 中断输入功能,支持电平和沿触发
• 支持系统唤醒



 驱动接口说明
下面介绍一下 GPIO 的具体接口和参数说明

Public APIs for GPIO drivers.

 Defines
GPIO_DIR_IN
        GPIO pin to be input.
GPIO_DIR_OUT
        GPIO pin to be output.
GPIO_INT
        GPIO pin to trigger interrupt.
GPIO_INT_ACTIVE_LOW
        GPIO pin trigger on level low or falling edge.
GPIO_INT_ACTIVE_HIGH
        GPIO pin trigger on level high or rising edge.
GPIO_INT_CLOCK_SYNC
       GPIO pin trigger to be synchronized to clock pulses.
GPIO_INT_DEBOUNCE
        Enable GPIO pin debounce.
GPIO_INT_LEVEL
          Do Level trigger.
GPIO_INT_EDGE
          Do Edge trigger.
GPIO_INT_DOUBLE_EDGE
         Interrupt triggers on both rising and falling edge.
GPIO_POL_NORMAL
        GPIO pin polarity is normal.
GPIO_POL_INV
        GPIO pin polarity is inverted.
GPIO_PUD_NORMAL
           GPIO pin to have no pull-up or pull-down.
 GPIO_PUD_PULL_UP
           Enable GPIO pin pull-up.
GPIO_PUD_PULL_DOWN
          Enable GPIO pin pull-down.
GPIO_PIN_ENABLE
          Enable GPIO pin. 
    ......

驱动使用示例
下面以一个示例介绍一下 GPIO 接口的使用。


示例中使用 GPIO4 来控制一个 LED 灯 的闪烁,以及通过中断检测 GPIO2 的高电平中断

#include
#define GPIO_OUT_PIN 4
#define GPIO_INT_PIN 2
#define GPIO_NAME "GPIO_"
#define GPIO_DRV_NAME "GPIO_0"
void gpio_callback(struct device *port, struct gpio_callback *cb, u32_t pins)
{
printk(GPIO_NAME "%d triggered\n", GPIO_INT_PIN);
}
static struct gpio_callback gpio_cb;
void main(void)
{
struct device *gpio_dev;
int ret;
int toggle = 1;
gpio_dev = device_get_binding(GPIO_DRV_NAME);
if (!gpio_dev)
{
printk("Cannot find %s!\n", GPIO_DRV_NAME);
return;
} /* Setup GPIO output */
ret = gpio_pin_configure(gpio_dev, GPIO_OUT_PIN, (GPIO_ ,→DIR_OUT));
if (ret)
{
printk("Error configuring " GPIO_NAME "%d!\n", ,→GPIO_OUT_PIN);
} /* Setup GPIO input, and triggers on rising edge. */
ret = gpio_pin_configure(gpio_dev, GPIO_INT_PIN, (GPIO_DIR_IN | GPIO_INT | GPIO_INT_EDGE | GPIO_INT_ ,→ACTIVE_HIGH | GPIO_INT_DEBOUNCE));
if (ret)
{
printk("Error configuring " GPIO_NAME "%d!\n", ,→GPIO_INT_PIN);
}
gpio_init_callback(&gpio_cb, gpio_callback, BIT(GPIO_INT_ ,→PIN));
ret = gpio_add_callback(gpio_dev, &gpio_cb);
if (ret)
{
printk("Cannot setup callback!\n");
}
ret = gpio_pin_enable_callback(gpio_dev, GPIO_INT_PIN);
if (ret)
{
printk("Error enabling callback!\n");
}

while (1)
{
printk("Toggling " GPIO_NAME "%d\n", GPIO_OUT_ ,→PIN);
ret = gpio_pin_write(gpio_dev, GPIO_OUT_PIN, ,→toggle);
if (ret)
{
printk("Error set " GPIO_NAME "%d!\n", ,→GPIO_OUT_PIN);
}
if (toggle)
{
toggle = 0;
}
else
{
toggle = 1;
}
k_sleep(MSEC_PER_SEC);
}
}


 

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论