AiPi-Eyes-S1是安信可开源团队专门为Ai-M61-32S设计的一款开发板,支持WiFi6、BLE5.3。所搭载的Ai-M61-32S 模组具有丰富的外设接口,具体包括 DVP、MJPEG、Dispaly、AudioCodec、USB2.0、SDU、以太网 (EMAC)、SD/MMC(SDH)、SPI、UART、I2C、I2S、PWM、GPDAC、GPADC、ACOMP 和 GPIO 等。
AiPi-Eyes-S1集成了SPI屏幕接口,DVP摄像头接口,外置ES8388音频编解码芯片以及预留TF卡座,并且引出USB接口,可接入USB摄像头。
从零开始学习小安派:
博流系列的芯片驱动分为两类,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 的模式可以设置为四种,分别是输入、输出、模拟、复用
3.gpio pupd
gpio 可以选择上拉、下拉、浮空
4.gpio smt
gpio 滤波开关
5.gpio drive
gpio 输出能力选择
6.gpio init trig mode
gpio 外部中断的触发模式
7.gpio uart function
每个 gpio 都可以选择到 Uart 的任意一个功能,当然区别是在初始化时的选择
三、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);
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 示例稍作修改。并逐步解释代码实现。
查看原理图,这里已经标注了预留的接口,需要飞线(幸好找到一个合适的座子
)


1.main
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的配置,这里配置为输出、浮空、滤波打开、驱动等级0bflb_gpio_init(gpio, GPIO_PIN_1, GPIO_INPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_0);//gpio初始化,第一个参数为句柄,第二个参数为pin,第三个为GPIO的配置,这里配置为输入、浮空、滤波打开、驱动等级0while (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 的电平


微信改版,容易错过最新资讯和福利?
快将“安信可科技”设为星标⭐
可以第一时间接收小安的推送!
▼

开源硬件新鲜玩:小安派-Eyes-S1/S2多功能开发板
10公里!超远距离传输的LoRa模块上架
安信可更多产品信息可进入以下链接查阅:
●开发资料:https://docs.ai-thinker.com/
●官方教程:https://blog.csdn.net/Boantong_
●安信可官网:www.ai-thinker.com
●安信可社区:https://bbs.ai-thinker.com
●业务咨询请联系:18022036575



