ML307R OpenCPU GPIO使用

2024-05-27 06:04
文章标签 使用 gpio opencpu ml307r

本文主要是介绍ML307R OpenCPU GPIO使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

这篇关于ML307R OpenCPU GPIO使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1006663

相关文章

Java中的ConcurrentBitSet使用小结

《Java中的ConcurrentBitSet使用小结》本文主要介绍了Java中的ConcurrentBitSet使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、核心澄清:Java标准库无内置ConcurrentBitSet二、推荐方案:Eclipse

Go语言结构体标签(Tag)的使用小结

《Go语言结构体标签(Tag)的使用小结》结构体标签Tag是Go语言中附加在结构体字段后的元数据字符串,用于提供额外的属性信息,这些信息可以通过反射在运行时读取和解析,下面就来详细的介绍一下Tag的使... 目录什么是结构体标签?基本语法常见的标签用途1.jsON 序列化/反序列化(最常用)2.数据库操作(

Java中ScopeValue的使用小结

《Java中ScopeValue的使用小结》Java21引入的ScopedValue是一种作用域内共享不可变数据的预览API,本文就来详细介绍一下Java中ScopeValue的使用小结,感兴趣的可以... 目录一、Java ScopedValue(作用域值)详解1. 定义与背景2. 核心特性3. 使用方法

spring中Interceptor的使用小结

《spring中Interceptor的使用小结》SpringInterceptor是SpringMVC提供的一种机制,用于在请求处理的不同阶段插入自定义逻辑,通过实现HandlerIntercept... 目录一、Interceptor 的核心概念二、Interceptor 的创建与配置三、拦截器的执行顺

C#中checked关键字的使用小结

《C#中checked关键字的使用小结》本文主要介绍了C#中checked关键字的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录✅ 为什么需要checked? 问题:整数溢出是“静默China编程”的(默认)checked的三种用

C#中预处理器指令的使用小结

《C#中预处理器指令的使用小结》本文主要介绍了C#中预处理器指令的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 第 1 名:#if/#else/#elif/#endif✅用途:条件编译(绝对最常用!) 典型场景: 示例

Mysql中RelayLog中继日志的使用

《Mysql中RelayLog中继日志的使用》MySQLRelayLog中继日志是主从复制架构中的核心组件,负责将从主库获取的Binlog事件暂存并应用到从库,本文就来详细的介绍一下RelayLog中... 目录一、什么是 Relay Log(中继日志)二、Relay Log 的工作流程三、Relay Lo

使用Redis实现会话管理的示例代码

《使用Redis实现会话管理的示例代码》文章介绍了如何使用Redis实现会话管理,包括会话的创建、读取、更新和删除操作,通过设置会话超时时间并重置,可以确保会话在用户持续活动期间不会过期,此外,展示了... 目录1. 会话管理的基本概念2. 使用Redis实现会话管理2.1 引入依赖2.2 会话管理基本操作

Springboot请求和响应相关注解及使用场景分析

《Springboot请求和响应相关注解及使用场景分析》本文介绍了SpringBoot中用于处理HTTP请求和构建HTTP响应的常用注解,包括@RequestMapping、@RequestParam... 目录1. 请求处理注解@RequestMapping@GetMapping, @PostMappin

springboot3.x使用@NacosValue无法获取配置信息的解决过程

《springboot3.x使用@NacosValue无法获取配置信息的解决过程》在SpringBoot3.x中升级Nacos依赖后,使用@NacosValue无法动态获取配置,通过引入SpringC... 目录一、python问题描述二、解决方案总结一、问题描述springboot从2android.x