(七)零基础开发小安派-Eyes-S1【外设篇】——GPIO输入输出

[复制链接]
查看6466 | 回复37 | 2023-9-12 15:22:58 | 显示全部楼层 |阅读模式

本帖最后由 Ai-Thinker小泽 于 2023-9-12 15:21 编辑

零基础开发小安派-Eyes-S1【外设篇】——GPIO输入输出

博流系列的芯片驱动分为两类,LHAL和SOC,使用LHAL库驱动外设十分方便,因为其对通用外设进行了统一的封装,在使用博流的不同芯片时他们的接口一致,方便使用和移植。而SOC则是作为特殊部分使用,如GLB、HBN、PDS、AON等等。

一、了解LHAL库和小安派-Eyes-S1外设

LHAL库配备了一个结构体作为通用外设的配置工具——struct bflb_device_s

struct bflb_device_s {
  const char *name;uint32_t reg_base;
  uint8_t irq_num;
  uint8_t idx;
  uint8_t sub_idx;
  uint8_t dev_type;
  void *user_data;
};
parameter description
name 外设名称
reg_base 外设寄存器基地址
irq_num 外设中断号
idx 外设 id
idx 外设 id,例如 UART0、UART1
sub_idx 外设子 id,例如 DMA0_CH0、DMA0_CH1
dev_type 外设类型
user_data 用户变量
name 外设名称
name 外设名称

我们知道,我们对芯片的所有操作其实都是基于对寄存器的配置,所以该结构体的成员中较为重要的为reg_base 和 irq_num ,有了这两个,我们才能操作外设寄存器和外设中断。

在配置之前,我们也得先初始化结构体获得它的句柄,有两种方式

1.bflb_device_get_by_name 通过 name 获取

2.bflb_device_get_by_id 通过 dev_type 和 idx 获取

获得的句柄会在一个table表中,详情可以看lhal/config/xxx/device_table.c 文件。

小安派-Eyes-S1所支持的外设LHAL库API有如下: √表示已支持,×表示未支持,-表示没有该外设

parameter BL616/BL618
ADC
CAM ×
CKS
DAC
DMA
EFUSE
EMAC
FLASH
GPIO
I2C
IR
MJPEG
PWM_v1 -
PWM_v2
RTC
SEC_AES
SEC_SHA
SEC_TRNG
SEC_PKA
SPI
TIMER
UART
USB_v1 -
USB_v2
WDG

二、GPIO配置简介

1.头文件bflb_gpio.h

2.gpio mode

gpio的模式可以设置为四种,分别是输入、输出、模拟、复用

#define GPIO_INPUT      (0 << GPIO_MODE_SHIFT) /* Input Enable */
#define GPIO_OUTPUT     (1 << GPIO_MODE_SHIFT) /* Output Enable */
#define GPIO_ANALOG     (2 << GPIO_MODE_SHIFT) /* Analog Enable */
#define GPIO_ALTERNATE  (3 << GPIO_MODE_SHIFT) /* Alternate Enable */

3.gpio pupd

gpio可以选择上拉、下拉、浮空

#define GPIO_FLOAT      (0 << GPIO_PUPD_SHIFT) /* No pull-up, pull-down */
#define GPIO_PULLUP     (1 << GPIO_PUPD_SHIFT) /* Pull-up */
#define GPIO_PULLDOWN   (2 << GPIO_PUPD_SHIFT) /* Pull-down */

4.gpio smt

gpio滤波开关

#define GPIO_SMT_DIS   (0 << GPIO_SMT_SHIFT)
#define GPIO_SMT_EN    (1 << GPIO_SMT_SHIFT)

5.gpio drive

gpio输出能力选择

#define GPIO_DRV_0     (0 << GPIO_DRV_SHIFT)
#define GPIO_DRV_1     (1 << GPIO_DRV_SHIFT)
#define GPIO_DRV_2     (2 << GPIO_DRV_SHIFT)
#define GPIO_DRV_3     (3 << GPIO_DRV_SHIFT)

6.gpio init trig mode

gpio外部中断的触发模式

#define GPIO_INT_TRIG_MODE_SYNC_FALLING_EDGE 0
#define GPIO_INT_TRIG_MODE_SYNC_RISING_EDGE  1
#define GPIO_INT_TRIG_MODE_SYNC_LOW_LEVEL    2
#define GPIO_INT_TRIG_MODE_SYNC_HIGH_LEVEL   3
#if defined(BL702)
#define GPIO_INT_TRIG_MODE_ASYNC_FALLING_EDGE 4
#define GPIO_INT_TRIG_MODE_ASYNC_RISING_EDGE  5
#define GPIO_INT_TRIG_MODE_ASYNC_LOW_LEVEL    6
#define GPIO_INT_TRIG_MODE_ASYNC_HIGH_LEVEL   7
#else
#define GPIO_INT_TRIG_MODE_SYNC_FALLING_RISING_EDGE 4
#define GPIO_INT_TRIG_MODE_ASYNC_FALLING_EDGE       8
#define GPIO_INT_TRIG_MODE_ASYNC_RISING_EDGE        9
#define GPIO_INT_TRIG_MODE_ASYNC_LOW_LEVEL          10
#define GPIO_INT_TRIG_MODE_ASYNC_HIGH_LEVEL         11
#endif

7.gpio uart function

每个gpio都可以选择到Uart的任意一个功能,当然区别是在初始化时的选择

#define GPIO_UART_FUNC_UART0_RTS 0
#define GPIO_UART_FUNC_UART0_CTS 1
#define GPIO_UART_FUNC_UART0_TX  2
#define GPIO_UART_FUNC_UART0_RX  3
#define GPIO_UART_FUNC_UART1_RTS 4
#define GPIO_UART_FUNC_UART1_CTS 5
#define GPIO_UART_FUNC_UART1_TX  6
#define GPIO_UART_FUNC_UART1_RX  7
#if defined(BL808) || defined(BL606P)
#define GPIO_UART_FUNC_UART2_RTS 8
#define GPIO_UART_FUNC_UART2_CTS 9
#define GPIO_UART_FUNC_UART2_TX  10
#define GPIO_UART_FUNC_UART2_RX  11
#endif

三、gpio的初始化及使用

1.bflb_gpio_init

说明: gpio的初始化函数

void bflb_gpio_init(struct bflb_device_s *dev, uint8_t pin, uint32_t cfgset);
parameter description
dev 设备句柄
pin gpio pin
cfgset gpio 配置项:gpio mode、gpio function、gpio pupd、gpio smt、gpio drive,多个配置需要使用"与"连接

2.bflb_gpio_deinit

说明: 反初始化 gpio,默认为输入浮空状态

void bflb_gpio_deinit(struct bflb_device_s *dev, uint8_t pin);
parameter description
dev 设备句柄
pin gpio pin

3.bflb_gpio_set

说明: gpio 输出高电平

void bflb_gpio_set(struct bflb_device_s *dev, uint8_t pin);
parameter description
dev 设备句柄
pin gpio pin

4.bflb_gpio_reset

说明: gpio 输出低电平

void bflb_gpio_reset(struct bflb_device_s *dev, uint8_t pin);
parameter description
dev 设备句柄
pin gpio pin

5.bflb_gpio_read

说明: 读取 gpio 电平

bool bflb_gpio_read(struct bflb_device_s *dev, uint8_t pin);
parameter description
dev 设备句柄
pin gpio pin
return true 为 高电平,false 为低电平

四、示例——GPIO输出点亮LED灯、GPIO输入采集电平并打印

我直接用SDK里的GPIO示例稍作修改。并逐步解释代码实现。

查看原理图,这里我已经标注了预留的接口,需要飞线(幸好我找到一个合适的座子) I2C.png

接口图.png

1.main

#include "bflb_gpio.h"       //gpio头文件
#include "bflb_mtimer.h"  //mtimer定时器头文件,可使用里面的延时函数
#include "board.h"            //开发板头文件,包含LHAL库等


struct bflb_device_s *gpio;  //初始化一个结构体指针作为外设句柄命名为gpio,

int main(void)
{
    board_init();                  //开发板初始化

    gpio = bflb_device_get_by_name("gpio");       //给前面的gpio句柄赋值对外设进行操作,这里的名字
//可使用的外设全部命名在bl616_device_table这个结构体数组里,我们所有使用的外设命名与上面列表中支持的外设列表
//也可以在函数定义里查看所有可支持的外设名称,命名一定要匹配。

    printf("gpio output\r\n");       //printf函数已经重定义为输出在串口0上,我们作为LOG查看

    bflb_gpio_init(gpio, GPIO_PIN_0, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_0);
 //gpio初始化,第一个参数为句柄,第二个参数为pin,第三个为GPIO的配置,这里配置为输出、浮空、滤波打开、驱动等级0

    bflb_gpio_init(gpio, GPIO_PIN_1, GPIO_INPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_0);
 //gpio初始化,第一个参数为句柄,第二个参数为pin,第三个为GPIO的配置,这里配置为输入、浮空、滤波打开、驱动等级0

        while (1) {
        bflb_gpio_set(gpio, GPIO_PIN_0);//将pin0设置为高电平
        printf("\033[0;34m GPIO_PIN_1=%x\033[0m \r\n", bflb_gpio_read(gpio, GPIO_PIN_1));
        //这里的\033[0;34m为函数的打印字体、前景色、后景色的设置,只是将打印的信息赋予颜色,感兴趣的同学可以百度
        //bflb_gpio_read读取pin1的电平,返回true为高电平,false为低电平
        bflb_mtimer_delay_ms(2000);//延迟2000毫秒,也就是2秒

        bflb_gpio_reset(gpio, GPIO_PIN_0);
        printf("\033[0;35;40m GPIO_PIN_1=%x\033[0m \r\n", bflb_gpio_read(gpio, GPIO_PIN_1));
        bflb_mtimer_delay_ms(2000);
    }
}

2.实现效果,GPIO0每两秒循环亮灭一次,每两秒打印GPIO1的电平

LED01.gif

屏幕截图2023-09-12144504.png

本帖被以下淘专辑推荐:

回复

使用道具 举报

翁vjk | 2023-9-12 15:23:31 | 显示全部楼层
沙发
回复

使用道具 举报

爱笑 | 2023-9-12 15:25:47 | 显示全部楼层
板凳!
用心做好保姆工作
回复

使用道具 举报

Ject | 2023-9-12 15:37:10 来自手机 | 显示全部楼层
三楼
回复

使用道具 举报

粉色小风扇 | 2023-9-12 15:39:35 | 显示全部楼层
泽哥排版越来越好看了
回复 支持 反对

使用道具 举报

ai_mcu | 2023-9-12 16:07:15 | 显示全部楼层
跟着泽哥学点灯
明天总会更好
回复 支持 反对

使用道具 举报

WYG | 2023-9-12 16:24:55 | 显示全部楼层
打卡学习
回复

使用道具 举报

妖猊 | 2023-9-12 17:45:41 | 显示全部楼层
这太重要了
回复 支持 反对

使用道具 举报

iiv | 2023-9-12 17:58:53 | 显示全部楼层
支持泽哥!
回复

使用道具 举报

molun | 2023-9-12 18:36:13 | 显示全部楼层
又涨知识了
等风,等雨,也等你!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则