GPIO配置
GPIO 模式
// bflb_gpio.h
#define GPIO_MODE_SHIFT (5) /* Bits 5-6: 端口模式(Port Mode) */
#define GPIO_MODE_MASK (3 << GPIO_MODE_SHIFT)
#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) */
GPIO上下拉
// bflb_gpio.h
#define GPIO_PUPD_SHIFT (7) /* Bits 7-8: Pull-up/down */
#define GPIO_PUPD_MASK (3 << GPIO_PUPD_SHIFT)
#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 */
GPIO滤波
// bflb_gpio.h
#define GPIO_SMT_SHIFT (9) /* Bits 9: SMT Enable */
#define GPIO_SMT_MASK (1 << GPIO_SMT_SHIFT)
#define GPIO_SMT_DIS (0 << GPIO_SMT_SHIFT) /* 关闭滤波 */
#define GPIO_SMT_EN (1 << GPIO_SMT_SHIFT) /* 开启滤波 */
GPIO 输出能力
// bflb_gpio.h
#define GPIO_DRV_SHIFT (10) /* Bits 10-11: 输出能力Drive */
#define GPIO_DRV_MASK (3 << GPIO_DRV_SHIFT)
#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)
GPIO函数
bflb_gpio_init 初始化
gpio 的初始化函数
/**bflb_gpio.h
* @brief 初始化 gpio 引脚。(Initialize gpio pin)
*
* @param [in] dev 设备句柄
* @param [in] pin gpio pin, use @ref GPIO_PIN
* @param [in] cfgset gpio 配置项,见GPIO配置:多个配置需要使用"或"连接
*/
void bflb_gpio_init(struct bflb_device_s *dev, uint8_t pin, uint32_t cfgset);
bflb_gpio_deinit 反初始化
反初始化 gpio,默认为输入浮空状态
/**bflb_gpio.h
* @brief 使用输入浮空取消初始化 gpio 引脚。
*
* @param [in] dev 设备句柄
* @param [in] pin gpio pin, use @ref GPIO_PIN
*/
void bflb_gpio_deinit(struct bflb_device_s *dev, uint8_t pin);
bflb_gpio_set 输出高电平
gpio 输出高电平
/**bflb_gpio.h
* @brief 用高电平写入 gpio 引脚。
*
* @param [in] dev 设备句柄
* @param [in] pin gpio pin, use @ref GPIO_PIN
*/
void bflb_gpio_set(struct bflb_device_s *dev, uint8_t pin);
bflb_gpio_reset 输出低电平
gpio 输出低电平
/**bflb_gpio.h
* @brief 用低电平写入 gpio 引脚。
*
* @param [in] dev 设备句柄
* @param [in] pin gpio pin, use @ref GPIO_PIN
*/
void bflb_gpio_reset(struct bflb_device_s *dev, uint8_t pin);
bflb_gpio_read 读取 gpio 电平
读取 gpio 电平
/**bflb_gpio.h
* @brief 从 gpio 引脚读取电平.
*
* @param [in] dev 设备句柄
* @param [in] pin gpio pin, use @ref GPIO_PIN
* @return true 表示高电平,false 表示低电平
*/
bool bflb_gpio_read(struct bflb_device_s *dev, uint8_t pin);
示例
#include "bflb_mtimer.h"
#include "board.h"
#include "bflb_gpio.h" //gpio头文件
#define DBG_TAG "MAIN"
struct bflb_device_s *gpio; //初始化一个结构体指针作为外设句柄命名为gpio,
int main(void)
{
board_init();
int i = 0;
gpio = bflb_device_get_by_name("gpio"); //给前面的gpio句柄赋值对外设进行操作,这里的名字
//可使用的外设全部命名在bl616_device_table这个结构体数组里,我们所有使用的外设命名与上面列表中支持的外设列表
//也可以在函数定义里查看所有可支持的外设名称,命名一定要匹配。
//gpio初始化,第一个参数为句柄,第二个参数为pin,第三个为GPIO的配置,这里配置为输出、驱动等级0
bflb_gpio_init(gpio, GPIO_PIN_27, GPIO_OUTPUT | GPIO_DRV_0);
//gpio初始化,第一个参数为句柄,第二个参数为pin,第三个为GPIO的配置,这里配置为输出、驱动等级3
bflb_gpio_init(gpio, GPIO_PIN_29, GPIO_OUTPUT | GPIO_DRV_3);
//gpio初始化,第一个参数为句柄,第二个参数为pin,第三个为GPIO的配置,这里配置为输入、开启滤波、驱动等级3
// bflb_gpio_init(gpio, GPIO_PIN_2, GPIO_INPUT | GPIO_SMT_EN | GPIO_DRV_3);
bflb_gpio_init(gpio, GPIO_PIN_2, GPIO_INPUT | GPIO_DRV_3);
bflb_gpio_set(gpio, GPIO_PIN_27); //将pin27设置为高电平
bflb_gpio_set(gpio, GPIO_PIN_29); //将pin29设置为高电平
while (1) {
if(bflb_gpio_read(gpio, GPIO_PIN_2)) // 按下是高电平
{
while(bflb_gpio_read(gpio, GPIO_PIN_2));
i++;
printf("-----------%d\r\n", i);
}
// bflb_mtimer_delay_ms(1000);
}
}
白色更亮
IO输出这边 我没上拉,结果白色更亮,显然GPIO_DRV_3 输出能力更强