介绍:
最近在学习小安派,手里也收到了来自于安信可的小安派S1,但是由于S1上并没有GPIO引出,因此为了验证芯片功能,我还同时购买了AIPI-Eyes-DU。此系列将GPIO口全部引出。非常方便学习和验证。
本章节将学习使用如何操作和使用GPIO。
首先要使用GPIO需要引入对应的GPIO头文件,文件位于 aithinker_Ai-M6X_SDK\drivers\lhal\include\bflb_gpio.h (当然也可以不引入,这样的话需要手动的根据BL616芯片手册结合原理图操作寄存器)。我这里为了方便学习使用,自己并且结合Chatgpt对bflb_gpio.h 做了注释的汉化,更方便大家的理解。
同时,我每使用一个外设资源便会将对应的外设资源汉化,并且上传到Github,非专业翻译,请大家以官方手册为准。如果有不准确的地方欢迎提Issue,我好加以修复。
汉化如下所示:
- /**
- * @brief 初始化GPIO引脚。
- *
- * @param [in] dev 设备句柄
- * @param [in] pin GPIO引脚,使用 @ref GPIO_PIN
- * @param [in] cfgset GPIO配置掩码
- */
- void bflb_gpio_init(struct bflb_device_s *dev, uint8_t pin, uint32_t cfgset);
- /**
- * @brief 使能GPIO引脚并设置为输入浮空状态。
- *
- * @param [in] dev 设备句柄
- * @param [in] pin GPIO引脚,使用 @ref GPIO_PIN
- */
- void bflb_gpio_deinit(struct bflb_device_s *dev, uint8_t pin);
- /**
- * @brief 设置GPIO引脚为高电平。
- *
- * @param [in] dev 设备句柄
- * @param [in] pin GPIO引脚,使用 @ref GPIO_PIN
- */
- void bflb_gpio_set(struct bflb_device_s *dev, uint8_t pin);
- /**
- * @brief 设置GPIO引脚为低电平。
- *
- * @param [in] dev 设备句柄
- * @param [in] pin GPIO引脚,使用 @ref GPIO_PIN
- */
- void bflb_gpio_reset(struct bflb_device_s *dev, uint8_t pin);
- /**
- * @brief 从GPIO引脚读取电平状态。
- *
- * @param [in] dev 设备句柄
- * @param [in] pin GPIO引脚,使用 @ref GPIO_PIN
- * @return true表示高电平,否则为低电平
- */
- bool bflb_gpio_read(struct bflb_device_s *dev, uint8_t pin);
- /**
- * @brief 写入0~31号GPIO引脚。
- *
- * @param [in] dev 设备句柄
- * @param [in] val 0~31号GPIO引脚的值
- */
- void bflb_gpio_pin0_31_write(struct bflb_device_s *dev, uint32_t val);
- /**
- * @brief 写入32~63号GPIO引脚。
- *
- * @param [in] dev 设备句柄
- * @param [in] val 32~63号GPIO引脚的值
- */
- void bflb_gpio_pin32_63_write(struct bflb_device_s *dev, uint32_t val);
- /**
- * @brief 从0~31号GPIO引脚读取电平。
- *
- * @param [in] dev 设备句柄
- * @return 0~31号GPIO引脚的电平
- */
- uint32_t bflb_gpio_pin0_31_read(struct bflb_device_s *dev);
- /**
- * @brief 从32~63号GPIO引脚读取电平。
- *
- * @param [in] dev 设备句柄
- * @return 32~63号GPIO引脚的电平
- */
- uint32_t bflb_gpio_pin32_63_read(struct bflb_device_s *dev);
- /**
- * @brief 配置GPIO引脚中断。
- *
- * @param [in] dev 设备句柄
- * @param [in] pin GPIO引脚,使用 @ref GPIO_PIN
- * @param [in] trig_mode 触发中断的模式
- */
- void bflb_gpio_int_init(struct bflb_device_s *dev, uint8_t pin, uint8_t trig_mode);
- /**
- * @brief 使能或禁用GPIO引脚中断。
- *
- * @param [in] dev 设备句柄
- * @param [in] pin GPIO引脚,使用 @ref GPIO_PIN
- * @param [in] mask true表示禁用,false表示使能
- */
- void bflb_gpio_int_mask(struct bflb_device_s *dev, uint8_t pin, bool mask);
- /**
- * @brief 获取GPIO引脚中断状态。
- *
- * @param [in] dev 设备句柄
- * @param [in] pin GPIO引脚,使用 @ref GPIO_PIN
- * @return true表示有中断,false表示无中断
- */
- bool bflb_gpio_get_intstatus(struct bflb_device_s *dev, uint8_t pin);
- /**
- * @brief 清除GPIO引脚中断状态。
- *
- * @param [in] dev 设备句柄
- * @param [in] pin GPIO引脚,使用 @ref GPIO_PIN
- */
- void bflb_gpio_int_clear(struct bflb_device_s *dev, uint8_t pin);
- /**
- * @brief 配置GPIO引脚为UART功能。
- *
- * @param [in] dev 设备句柄
- * @param [in] pin GPIO引脚,使用 @ref GPIO_PIN
- * @param [in] uart_func UART功能,使用 @ref GPIO_UART_FUNC
- */
- void bflb_gpio_uart_init(struct bflb_device_s *dev, uint8_t pin, uint8_t uart_func);
- /**
- * @brief 控制GPIO功能。
- *
- * @param [in] dev 设备句柄
- * @param [in] cmd 功能命令,使用 @ref GPIO_CMD
- * @param [in] arg 用户数据
- * @return 失败时返回负数的错误值。
- */
- int bflb_gpio_feature_control(struct bflb_device_s *dev, int cmd, size_t arg);
复制代码 点亮RGB led灯,AiPi-Eyes-DU 默认出厂烧录了PWM RGB灯闪烁的代码,既然我们要学习肯定要自己去点亮一个小灯泡。
代码如下所示:
- #include "bflb_gpio.h"
- #include "board.h"
- struct bflb_device_s *gpio;
- int main(void)
- {
- board_init();
-
- /**
- * @brief 从系统库函数中获取支持的外设,支持获取的外设资源如下
- adc dac ef_ctrl gpio uart0 uart1 spi0 pwm0 dma0_ch0
- dma0_ch1 dma0_ch2 dma0_ch3 dma0_ch4 dma0_ch5 dma0_ch6
- dma0_ch7 i2c0 timer0 timer1 rtc aes sha trng pka
- watchdog irtx irrx sdio2
- */
- gpio = bflb_device_get_by_name("gpio");
-
- //初始化GPIO端口,并且指定当前的端口模式
- bflb_gpio_init(gpio, GPIO_PIN_14,GPIO_OUTPUT |GPIO_PULLUP);
- bflb_gpio_init(gpio, GPIO_PIN_15,GPIO_OUTPUT |GPIO_PULLUP);
- bflb_gpio_init(gpio, GPIO_PIN_12,GPIO_OUTPUT |GPIO_PULLUP);
- //Enable GPIO 即高电平
- bflb_gpio_set(gpio,GPIO_PIN_14);
- bflb_gpio_set(gpio,GPIO_PIN_12);
- bflb_gpio_set(gpio,GPIO_PIN_15);
- while(1){};
- }
复制代码 实验现象如下:
GitHub仓库: https://github.com/mz1874/bl616-chinese-header-files.git
|