一、GPIO使用流程图
二、函数介绍
三、GPIO 点亮LED
四、代码下载地址
一、GPIO使用流程图

这个图是官网找到的,ML307R GPIO引脚电平默认为1.8V,需注意和外部电路的电平匹配,具体可参考《ML307R_硬件设计手册_OpenCPU版本适用.pdf》中的描述。
二、函数介绍
SDK中有一个GPIO常规使用方法的demo程序,GPIO demo提供了GPIO参数设置、输入输出设置、电平设置和中断设置等功能示例程序,可在cm_demo_gpio.c文件中查看
2.1 cm_gpio_cfg_t结构体说明
typedef struct{
    cm_gpio_mode_e mode;/*!< 不支持*/
    cm_gpio_direction_e direction;
    cm_gpio_pull_e pull;
} cm_gpio_cfg_t; 
这个主要是看 cm_gpio_direction_e direction;和cm_gpio_pull_e pull
cm_gpio_direction_e direction 是设置GPIO是输入还是输出
/** I/O方向 */
typedef enum{
    CM_GPIO_DIRECTION_INPUT = 0,
    CM_GPIO_DIRECTION_OUTPUT,
}cm_gpio_direction_e; 
cm_gpio_pull_e pull 是设置上下拉
/** 上/下拉 */
typedef enum{
    CM_GPIO_PULL_NONE,
    CM_GPIO_PULL_DOWN,
    CM_GPIO_PULL_UP,
}cm_gpio_pull_e; 
比如我是要控制lED 闪烁,那么可以配置如下
    cm_gpio_cfg_t cfg = {0};
    cfg.direction = CM_GPIO_DIRECTION_OUTPUT;  //配置成输出
    cfg.pull = CM_GPIO_PULL_UP;               //上拉 
2.2 cm_iomux_set_pin_func 函数介绍
 * @brief IOMUX 设置引脚复用功能
 *
 * @param [in] pin PIN 定义号
 * @param [in] fun FUN 定义号
 *
 *  @return  
 *    = 0  - 成功 \n
 *    = -1 - 失败
 */
int32_t cm_iomux_set_pin_func(cm_iomux_pin_e pin, cm_iomux_func_e fun); 
此函数第一个参数 cm_iomux_pin_e 是一个枚举,代表的是那个管脚,这个要和GPIO功能的管脚区分,比如我这里使用GPIO4 控制LED灯,可以查看 “ML307R_OpenCPU资源综述”手册 ,LED对应的引脚号是16,所以我们选择CM_IOMUX_PIN_16,而不是对应的GPIO4,这里需要注意。
第二个参数是复用功能 ,从下图可以看到GPIO4 是OpenCPU复用功能1,既选择CM_IOMUX_FUNC_FUNCTION1

2.3 cm_gpio_init介绍
/**
 *  @brief 初始化GPIO
 *  
 *  @param [in] gpio_num GPIO号
 *  @param [in] cfg 配置
 *  
 *  @return 
 *    = 0 - 成功 \n
 *    < 0 - 失败, 返回值为错误码
 *  
 *  @details 初始化之前一定要先设置引脚复用
 */
int32_t cm_gpio_init(cm_gpio_num_e gpio_num, cm_gpio_cfg_t *cfg); 
第一个参数是cm_gpio_num_e 是指对应的GPIO,LED控制是使用了 GPIO4,既选择CM_GPIO_NUM_4
第二个参数 cm_gpio_cfg_t,就是上面配置的方向和上下拉
2.4 cm_gpio_set_level函数介绍
/**
 *  @brief 设置输出电平
 *  
 *  @param [in] gpio_num GPIO号
 *  @param [in] level 输出电平
 *  
 *  @return 
 *    = 0 - 成功 \n
 *    < 0 - 失败, 返回值为错误码
 *  
 *  @details More details
 */
int32_t cm_gpio_set_level(cm_gpio_num_e gpio_num, cm_gpio_level_e level); 
这个函数设置对应GPIO 输出高低电平
第一个参数 cm_gpio_num_e 对应的GPIO
第二个参数cm_gpio_level_e 对应的是设置的电平
/** 高低电平 */
typedef enum{
    CM_GPIO_LEVEL_LOW,
    CM_GPIO_LEVEL_HIGH,
}cm_gpio_level_e;
 
2.5 cm_gpio_get_level函数介绍
/**
 *  @brief 读取输入电平
 *  
 *  @param [in] gpio_num GPIO号
 *  @param [out] level 输入电平
 *  
 *  @return 
 *    = 0 - 成功 \n
 *    < 0 - 失败, 返回值为错误码
 *  
 *  @details More details
 */
int32_t cm_gpio_get_level(cm_gpio_num_e gpio_num, cm_gpio_level_e *level); 
这个函数是读对应的GPIO 电平
第一个参数 cm_gpio_num_e 对应的GPIO
第二个参数cm_gpio_level_e 对应的是读的电平
三、GPIO 点亮LED
osTimerId_t gpio_timer_id = NULL;
// LED定时器回调函数
void gpio_TimerCallback(void *argument) {
    static unsigned char i = 0;
    if(i == 0)
    {
        cm_gpio_set_level(CM_GPIO_NUM_4, CM_GPIO_LEVEL_LOW);
        i = 1;
    }else
    {
        cm_gpio_set_level(CM_GPIO_NUM_4, CM_GPIO_LEVEL_HIGH);
        i = 0;
    }
}
void gpio_create_timer(void)
{
osTimerAttr_t timer_attr = {
    .name = "Gpio_Timer",
};
    gpio_timer_id = osTimerNew(gpio_TimerCallback, osTimerPeriodic, NULL, &timer_attr);
    osTimerStart(gpio_timer_id, 200);
}
void gpio_set_output(void)
{
    cm_gpio_cfg_t cfg = {0};
    cfg.direction = CM_GPIO_DIRECTION_OUTPUT;
    cfg.pull = CM_GPIO_PULL_UP;
    cm_iomux_set_pin_func(CM_IOMUX_PIN_16, CM_IOMUX_FUNC_FUNCTION1);//初始化之前一定要先设置引脚复用
    cm_gpio_init(CM_GPIO_NUM_4, &cfg);
    gpio_create_timer();
}
void bsp_gpio_init(void)
{
    gpio_set_output();
} 
以上就是控制LED灯闪烁,在定时器里面实现 ,实际上是1S闪烁一次
四、代码下载地址
ML307R OpenCPU GPIO使用 代码










![[6] CUDA之线程同步](https://img-blog.csdnimg.cn/direct/bd6d3f1547714ea68616e881f66cb55c.png)







