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攝像頭。
從零開始學習小安派:
1、零基礎開發小安派-Eyes-S1【入門篇】——初識小安派-Eyes-S1
2、零基礎開發小安派-Eyes-S1【入門篇】——安裝VMware與Ubuntu
3、入門篇:零基礎開發小安派-Eyes-S1——新建工程并燒錄調試
4、零基礎開發小安派-Eyes-S1入門篇——Win下SSH連接Linux
5、零基礎開發小安派-Eyes-S1【入門篇】——Samba共享文件夾
6、零基礎開發小安派-Eyes-S1【入門篇】——工程文件架構
博流系列的芯片驅動分為兩類,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;
};
對芯片的所有操作其實都是基于對寄存器的配置,所以該結構體的成員中較為重要的為 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 有如下:√ 表示已支持,× 表示未支持,-表示沒有該外設
二、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);
2.bflb_gpio_deinit
說明: 反初始化 gpio,默認為輸入浮空狀態
void bflb_gpio_deinit(struct bflb_device_s *dev, uint8_t 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);
5.bflb_gpio_read
說明: 讀取 gpio 電平
bool bflb_gpio_read(struct bflb_device_s *dev, uint8_t pin);
編輯
四、示例——GPIO 輸出點亮 LED 燈、GPIO 輸入采集電平并打印
直接用 SDK 里的 GPIO 示例稍作修改。并逐步解釋代碼實現。
查看原理圖,這里已經標注了預留的接口,需要飛線(幸好找到一個合適的座子)
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 outputrn"); //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("33[0;34m GPIO_PIN_1=%x33[0m rn", bflb_gpio_read(gpio, GPIO_PIN_1));
//這里的33[0;34m為函數的打印字體、前景色、后景色的設置,只是將打印的信息賦予顏色,感興趣的同學可以百度
//bflb_gpio_read讀取pin1的電平,返回true為高電平,false為低電平
bflb_mtimer_delay_ms(2000);//延遲2000毫秒,也就是2秒
bflb_gpio_reset(gpio, GPIO_PIN_0);
printf("33[0;35;40m GPIO_PIN_1=%x33[0m rn", bflb_gpio_read(gpio, GPIO_PIN_1));
bflb_mtimer_delay_ms(2000);
}
}
2.實現效果,GPIO0 每兩秒循環亮滅一次,每兩秒打印 GPIO1 的電平
審核編輯 黃宇
-
接口
+關注
關注
33文章
8496瀏覽量
150831 -
開發板
+關注
關注
25文章
4943瀏覽量
97188 -
GPIO
+關注
關注
16文章
1196瀏覽量
51909
發布評論請先 登錄
相關推薦
評論