本帖最后由 st780206 于 2025-12-8 09:00 编辑
根据 零基础开发小安派-Eyes-S1【外设篇】——GPIO输入输出 https://bbs.ai-thinker.com/forum ... ead&tid=524&ctid=19
开发gpio输出
了解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,例如 UART0、UART1
sub_idx 外设子 id,例如 DMA0_CH0、DMA0_CH1
dev_type 外设类型
user_data 用户变量
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
|