【M61笔记】GPIO I/O操作

[复制链接]
查看378 | 回复10 | 2024-6-12 19:58:07 | 显示全部楼层 |阅读模式

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 输出能力更强

1718193231146.jpg

回复

使用道具 举报

iiv | 2024-6-12 20:08:48 | 显示全部楼层
很棒,但是图裂了
回复 支持 反对

使用道具 举报

jkernet | 2024-6-12 21:16:34 | 显示全部楼层
感谢分享
回复

使用道具 举报

bzhou830 | 2024-6-13 06:47:46 | 显示全部楼层
选择去发光,而不是被照亮
回复

使用道具 举报

1084504793 | 2024-6-13 08:02:46 | 显示全部楼层
回复

使用道具 举报

爱笑 | 2024-6-13 08:44:07 | 显示全部楼层
用心做好保姆工作
回复

使用道具 举报

WT_0213 | 2024-6-13 08:46:48 | 显示全部楼层
回复

使用道具 举报

wxlinus | 2024-6-13 09:07:31 | 显示全部楼层
很好,期望能看到更多的bl sdk的api介绍
回复 支持 反对

使用道具 举报

lovzx | 2024-6-13 16:30:59 | 显示全部楼层

学习

回复 支持 反对

使用道具 举报

lazy | 2024-6-14 11:23:46 | 显示全部楼层
学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则