一、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使用 代码