控制GPIO输出 ============ 作者:陈之敏 时间:2020年08月15日 关键字:csdk、RDA8910、二次开发、GPIO输出、LED ## 目录 `点击这里查看所有博文 `__   最近听说有的小伙伴看了我的教程后,有一些问题都跑到官方的gitee上面去问去了。导致官方的人没搞懂问的是啥,小伙伴们也没能知道自己想要的答案。给大家造成了困扰,这里我说声抱歉。   既然出现了这个问题,我这里就声明一下,本系列教程所涉及的内容(demo)不是官方的作品。我个人觉得官方的demo内容太多太全,往往都是把一个模块内所有的东西全部放在一起。这样的话对新手不是很友好,阅读起来也比较费劲。我就把官方的部分demo进行相关的简化,并推出教程这样的话可能会对新手朋友们有一定的帮助。   有时候周末闲暇时间我也会加上一些我觉得好玩的模块在里面,这些可能在官方的demo都没有,比如cJSON、PAHO-MQTT、http-client。   这就是官方的代码仓库。 .. code:: c git clone --recursive https://gitee.com/openLuat/Luat_CSDK_Air724U.git   当然各位小伙伴在看本教程时,我建议还是使用我下面提供的仓库比较好,看完之后在迁移到官方的仓库⇧。 .. code:: c git clone --recursive https://gitee.com/chenxiahuaxu/RDA8910_CSDK.git   再看本教程过程中如果遇到了问题,可以在本人的代码仓库下面评论。也可以在本人的\ `博客 `__\ 下面评论。我要是看到的话,并且这个问题在我的能力范围的话我会尽力解答的(非官方,不要对我要求太多哦,要求太多我可能就不管啦)。 一、前言 --------   拿到CSDK首先搭建好环境,然后就是点灯,点灯才是迈向驱动众多外设的第一步。 |在这里插入图片描述|   有人讲你这真是闲的没事干,拿这个好几百软妹币的模块用来点灯,51它不香吗。小伙子还是年轻,听我一句劝。学习是次要的,最重要是要学会装逼,用51还怎么装逼呢,\ ``too young,too simple``\ 。 |image1|   反正我不管你们说什么我都不听,谁也拦不住我,我就是要点灯,今天这个灯我就点定了。 |image2| ## 二、编写测试程序   首先我们创建两个任务作为对比 .. code:: c //main函数 int appimg_enter(void *param) { //创建一个任务 osiThreadCreate("GPIO0", GPIO0, NULL, OSI_PRIORITY_NORMAL, 1024, 0); //再创建一个任务 osiThreadCreate("GPIO1", GPIO1, NULL, OSI_PRIORITY_NORMAL, 1024, 0); return 0; }   编写GPIO0的输出程序,实现1s为周期的循环闪烁。 .. code:: c static void GPIO0(void *param) { T_AMOPENAT_GPIO_CFG output_cfg = {0}; output_cfg.mode = OPENAT_GPIO_OUTPUT; //配置输出 output_cfg.param.defaultState = 0; // 默认低电平 BOOL err = 0; // gpio0初始化 err = iot_gpio_config(0, &output_cfg); if (!err) return; while (1) { //将GPIO0设置为高电平 iot_gpio_set(0, 1); //设置为高电平 iot_debug_print("GPIO0 :%d", 1); //线程休眠500ms osiThreadSleep(500); //将GPIO0设置为低电平 iot_gpio_set(0, 0); //设置为高电平 iot_debug_print("GPIO0 :%d", 0); //线程休眠500ms osiThreadSleep(500); } osiThreadExit(); }   编写GPIO1的输出程序,实现2s为周期的循环闪烁。 .. code:: c static void GPIO1(void *param) { T_AMOPENAT_GPIO_CFG output_cfg = {0}; output_cfg.mode = OPENAT_GPIO_OUTPUT; //配置输出 output_cfg.param.defaultState = 0; // 默认低电平 BOOL err = 0; // gpio1初始化 err = iot_gpio_config(1, &output_cfg); if (!err) return; while (1) { //将GPIO1设置为高电平 iot_gpio_set(1, 1); //设置为高电平 iot_debug_print("GPIO1 :%d", 1); //线程休眠1000ms osiThreadSleep(1000); //将GPIO1设置为低电平 iot_gpio_set(1, 0); //设置为高电平 iot_debug_print("GPIO1 :%d", 0); //线程休眠1000ms osiThreadSleep(1000); } osiThreadExit(); } |   使用GPIO的驱动需要包含\ ``#include "iot_gpio.h"``\ 头文件,我们这里只用到了两个函数,分别是: >/**初始化gpio *@param port: GPIO编号*\ @param cfg: 配置信息 \*@return TRUE: 成功 |     FALSE: 失败 \**/ - BOOL ``iot_gpio_config``\ (E_AMOPENAT_GPIO_PORT port,T_AMOPENAT_GPIO_CFG \*cfg); .. /**设置gpio *@param port: GPIO编号*\ @param value: 0 or 1 \*@return TRUE: 成功      FALSE: 失败 \**/ - BOOL ``iot_gpio_set``\ (E_AMOPENAT_GPIO_PORT port, UINT8 value); 三、编译并下载程序 ------------------   完整代码在这,自取。 .. code:: c /* * @Author: your name * @Date: 2020-05-19 14:05:32 * @LastEditTime: 2020-05-19 17:34:30 * @LastEditors: Please set LastEditors * @Description: In User Settings Edit * @FilePath: \RDA8910_CSDK\USER\user_main.c */ #include "osi_log.h" #include "osi_api.h" #include "string.h" #include "iot_debug.h" #include "iot_uart.h" #include "iot_os.h" #include "iot_gpio.h" static void GPIO0(void *param) { T_AMOPENAT_GPIO_CFG output_cfg = {0}; output_cfg.mode = OPENAT_GPIO_OUTPUT; //配置输出 output_cfg.param.defaultState = 0; // 默认低电平 BOOL err = 0; // gpio0初始化 err = iot_gpio_config(0, &output_cfg); if (!err) return; while (1) { //将GPIO0设置为高电平 iot_gpio_set(0, 1); //设置为高电平 iot_debug_print("GPIO0 :%d", 1); //线程休眠500ms osiThreadSleep(500); //将GPIO0设置为低电平 iot_gpio_set(0, 0); //设置为高电平 iot_debug_print("GPIO0 :%d", 0); //线程休眠500ms osiThreadSleep(500); } osiThreadExit(); } static void GPIO1(void *param) { T_AMOPENAT_GPIO_CFG output_cfg = {0}; output_cfg.mode = OPENAT_GPIO_OUTPUT; //配置输出 output_cfg.param.defaultState = 0; // 默认低电平 BOOL err = 0; // gpio1初始化 err = iot_gpio_config(1, &output_cfg); if (!err) return; while (1) { //将GPIO1设置为高电平 iot_gpio_set(1, 1); //设置为高电平 iot_debug_print("GPIO1 :%d", 1); //线程休眠1000ms osiThreadSleep(1000); //将GPIO1设置为低电平 iot_gpio_set(1, 0); //设置为高电平 iot_debug_print("GPIO1 :%d", 0); //线程休眠1000ms osiThreadSleep(1000); } osiThreadExit(); } //main函数 int appimg_enter(void *param) { //创建一个任务 osiThreadCreate("GPIO0", GPIO0, NULL, OSI_PRIORITY_NORMAL, 1024, 0); //再创建一个任务 osiThreadCreate("GPIO1", GPIO1, NULL, OSI_PRIORITY_NORMAL, 1024, 0); return 0; } //退出提示 void appimg_exit(void) { OSI_LOGI(0, "application image exit"); }   这是GPIO0以1s为周期翻转 |image3|   这是GPIO1以2s为周期翻转 |image4|   查看输出,分析前六个日志,\ ``GPIO0``\ 的动作是\ ``0->1->0->1``\ ,\ ``GPIO1``\ 的动作是\ ``0->1``\ ,正好GPIO0翻转两次,GPIO1翻转一次,符合设计需求 |image5| 不会下载的\ `点击这里 `__\ ,进去查看我的\ ``RDA8910 CSDK二次开发入门教程``\ 专题第一篇博文\ ``1、RDA8910CSDK二次开发:环境搭建``\ 里面讲了怎么下载 这里只是我的学习笔记,拿出来给大家分享,欢迎大家批评指正,本篇教程到此结束 .. |在这里插入图片描述| image:: https://img-blog.csdnimg.cn/20200519170852461.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU3MDA4Mw==,size_16,color_FFFFFF,t_70 .. |image1| image:: https://img-blog.csdnimg.cn/20200519171652828.gif .. |image2| image:: https://img-blog.csdnimg.cn/20200519172500804.png .. |image3| image:: https://img-blog.csdnimg.cn/20200519175704611.gif .. |image4| image:: https://img-blog.csdnimg.cn/20200519175636354.gif .. |image5| image:: https://img-blog.csdnimg.cn/2020051918013160.png