应用实战精解系列(四):RVB2601开发板控制台解读与自定义命令

简介: 应用实战精解系列(四):RVB2601开发板控制台解读与自定义命令

编辑语:

芯片开放社区(OCC)面向广大开发者推出应用实战系列内容,通过分享开发者实战开发案例,总结应用开发经验,梳理开发中的常见问题及解决方案,为后续参与的开发者提供更多参考与借鉴。


基于RVB2601开发板的应用实战,我们已经分别为大家介绍了基础环境搭建LVGL移植设备连接上云。为了帮助大家实现更多对RVB2601的控制,本期内容我们将解析控制台、自定义命令、PWM呼吸灯等相关内容。


01 控制台解读与自定义命令

在HelloWorld中我发现可以通过在串口助手输入help可以获取可以键入的命令:

image.png


包括了系统命令和用户命令。


但是在做LED实验时输入help却没有反应,但是这个控制台确实是比较方便调试,还有系统的状态查看,所以我对比了两个工程的异同。


在进入main函数后先进行yoc初始化,这里面初始化了RX,TX引脚和功能,然后进行波特率的设置,设置LOG打印等级,最后就是关键的cli初始化,这个就是控制台的初始化,在cli初始化里面,aos_cli_init就是前面看到的系统Commands,cli_reg_cmd_ps、cli_reg_cmd_free()就是User Commands。


image.pngimage.pngimage.png


添加完这些代码之后再编译烧录就可以使用控制台命令了!!


那我们可不可以自己定义自己的命令呢?


照着ps和free的命令,ps命令初始化函数如下:

image.png


cli_command是命令的结构体,有三个成员变量,分别为名字还有命令的具体描述信息还有回调函数。

image.png


我们可以自定义一个命令,取名test:然后编写回调函数:(这里argc是输入参数的个数,我们将输入的参数全部打印出来作为测试用),最后调用注册命令函数传入自定义命令结构体:

image.png


编译烧录控制台键入help可以看到test出现在了用户命令中了:

image.png


然后输入带参数的test命令,可以看到与预期的结果一致(注意这里是得到字符串,我们可以用strcmp或用atoi将数字字符串转为int形进一步去判断然后实现自己想要的业务逻辑功能):

image.png


02 点RGB灯

从原理图看出LED低电平亮:我们可以用通用IO口点亮还可以将GPIO复用为PWM来实现呼吸灯的效果。

image.png


① GPIO方式:(以PA7为例)  

设置引脚模式为通用IO口:

csi_pin_set_mux(PA7, PIN_FUNC_GPIO);


引脚初始化:

csi_gpio_pin_init(&r, PA7);


设置引脚输出方向:

csi_gpio_pin_dir(&r, GPIO_DIRECTION_OUTPUT);


设置引脚电平:

csi_gpio_pin_write(&r, GPIO_PIN_LOW);


了解完主要的API后我们在主函数创建一个led任务,在任务中初始化,接着每1000ms调用led样式刷新函数(也就是一秒切换一个led颜色):

int main(void)
 {
     board_yoc_init();
      aos_task_new("demo", demo_task, NULL, 10 * 1024);
      aos_task_new("led_task", led_task, NULL, 1 * 1024);
     return 0;
 /*****************************************************************/
 static void led_task(void *arg)
 {
     led_pinmux_init();
     while (1)
     {
     aos_msleep(1000);
         led_refresh();    
     }
 }
 /*********************************************************/
 void led_refresh()
 {
     g_ctr++;
     if (g_ctr  == 3)g_ctr=0;
     if (g_ctr  == 0)
     {
         csi_gpio_pin_write(&r, GPIO_PIN_HIGH);
         csi_gpio_pin_write(&g, GPIO_PIN_HIGH);
         csi_gpio_pin_write(&b, GPIO_PIN_LOW);
     }
     else if (g_ctr == 1)
     {
         csi_gpio_pin_write(&r, GPIO_PIN_LOW);
         csi_gpio_pin_write(&g, GPIO_PIN_HIGH);
         csi_gpio_pin_write(&b, GPIO_PIN_HIGH);
     }
     else
     {
         csi_gpio_pin_write(&r, GPIO_PIN_HIGH);
         csi_gpio_pin_write(&g, GPIO_PIN_LOW);
         csi_gpio_pin_write(&b, GPIO_PIN_HIGH);
     }
 }

② PWM方式:

设置引脚功能复用为PWM模式:

csi_pin_set_mux(PA7, PA7_PWM_CH7);


初始化PWM:

csi_pwm_init(&r, 0);


配置PWM周期、有效电平时间和有效电平极性:

csi_pwm_out_config(&r, 7 / 2, 300, 100, PWM_POLARITY_HIGH);


使能PWM

csi_pwm_out_start(&r, 7 / 2);


用逻辑分析仪测出来占空比差不多为100/300即33.3%

image.png


然后我们在main函数依然创建一个led任务,led刷新函数里每5ms对g_ctr++或--,取决于dir值,dir就要用到刚刚的控制台用户自定义命令了,在控制台对dir值修改可以改变呼吸灯的变亮或变暗。

 static void led_task(void *arg)
 {
     led_pinmux_init();
     while (1)
     {
     aos_msleep(5);
         led_refresh();
     }
 }
 /************************************************/
 void led_pinmux_init()
 {
     // 7
     csi_error_t ret;
     csi_pin_set_mux(PA7, PA7_PWM_CH7);
     csi_pin_set_mux(PA25, PA25_PWM_CH2);
     csi_pin_set_mux(PA4, PA4_PWM_CH4);
     ret = csi_pwm_init(&r, 0);
     if(ret != CSI_OK)
     {
         printf("===%s, %d\n", __FUNCTION__, __LINE__);
         return;
     }
     ret = csi_pwm_out_config(&r, 7 / 2, 300, 100, PWM_POLARITY_HIGH);
     if(ret != CSI_OK)
     {
         printf("===%s, %d\n", __FUNCTION__, __LINE__);
         return;
     }
     ret = csi_pwm_out_start(&r, 7 / 2);
     if(ret != CSI_OK)
     {
         printf("===%s, %d\n", __FUNCTION__, __LINE__);
         return;
     }
     // 25
     ret = csi_pwm_out_config(&r, 2 / 2, 300, 100, PWM_POLARITY_HIGH);
     if(ret != CSI_OK)
     {
         printf("===%s, %d\n", __FUNCTION__, __LINE__);
         return;
     }
     ret = csi_pwm_out_start(&r, 2 / 2);
     if(ret != CSI_OK)
     {
         printf("===%s, %d\n", __FUNCTION__, __LINE__);
         return;
     }
     // 4
     ret = csi_pwm_out_config(&r, 4 / 2, 300, 100, PWM_POLARITY_HIGH);
     if(ret != CSI_OK)
     {
         printf("===%s, %d\n", __FUNCTION__, __LINE__);
         return;
     }
     ret = csi_pwm_out_start(&r, 4 / 2);
     if(ret != CSI_OK)
     {
         printf("===%s, %d\n", __FUNCTION__, __LINE__);
         return;
     }
       csi_pwm_out_stop(&r, 2 / 2);
      csi_pwm_out_stop(&r, 7/ 2);
 }
 /**********************************************************/
 void led_refresh()
 {
     switch(dir)
     {
     case 0:
         g_ctr++;
         if(g_ctr == 300)
     {
         g_ctr = 0;
     }
         csi_pwm_out_config(&r,1, 300, g_ctr, PWM_POLARITY_HIGH);
         break;
     case 1:
         g_ctr--;
         if(g_ctr == 0)
     {
         g_ctr = 300;
     }
         csi_pwm_out_config(&r,1, 300, g_ctr, PWM_POLARITY_HIGH);
         break;
     default:
         g_ctr++;
         if(g_ctr == 300)
     {
         g_ctr = 0;
     }
         csi_pwm_out_config(&r, 1, 300, g_ctr, PWM_POLARITY_HIGH);
         break;
     }
 }
 /**************************************************/
 void mycmd_func(char *wbuf, int wbuf_len, int argc, char **argv)
 {
     extern uint dir;
      dir=atoi(argv[1]);
 }

image.png


03 舵机

csi_pwm_out_config(&r, 2, 300, g_ctr, PWM_POLARITY_HIGH);

image.png

04 下期预告

以上即为本期全部内容,下期我们将为大家推荐关于RVB2601的以太网通讯测试,欢迎大家持续关注应用实战系列内容。

相关文章
|
6月前
|
存储 运维 Serverless
Serverless 应用引擎产品使用之阿里函数计算中返回函数计算2.0控制台如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
6月前
|
Linux Shell PHP
linux(十五)文件和目录相关命令-控制台输出命令echo和重定向
linux(十五)文件和目录相关命令-控制台输出命令echo和重定向
125 0
phpstorm插件应用:Test RESTful WEB Service 控制台接口调试工具
phpstorm插件应用:Test RESTful WEB Service 控制台接口调试工具
198 0
|
6月前
IntelliJ IDEA 自定义控制台输出多颜色格式功能 --- 安装Grep Console插件
IntelliJ IDEA 自定义控制台输出多颜色格式功能 --- 安装Grep Console插件
1210 0
|
10天前
|
弹性计算 开发工具 git
2分钟在阿里云ECS控制台部署个人应用(图文示例)
作为一名程序员,我在部署托管于Github/Gitee的代码到阿里云ECS服务器时,经常遇到繁琐的手动配置问题。近期,阿里云ECS控制台推出了一键构建部署功能,简化了这一过程,支持Gitee和GitHub仓库,自动处理git、docker等安装配置,无需手动登录服务器执行命令,大大提升了部署效率。本文将详细介绍该功能的使用方法和适用场景。
2分钟在阿里云ECS控制台部署个人应用(图文示例)
|
3月前
|
Windows
基本的Dos命令 在控制台如何进入某一个文件或者进入不同的盘符
这篇文章介绍了如何在Windows DOS命令行环境中进入不同盘符和文件夹,包括使用Win+R快捷键打开运行窗口、通过输入盘符加冒号(如"D:")切换到指定盘符、使用"cd"命令进入文件夹,以及一些基本的文件操作命令如"dir"查看文件和"del"删除文件等。
基本的Dos命令 在控制台如何进入某一个文件或者进入不同的盘符
|
3月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之配置Logback以在控制台输出日志的问题如何解决
Java应用结构规范问题之配置Logback以在控制台输出日志的问题如何解决
|
3月前
|
Unix Linux C#
增强用户体验:2个功能强大的.NET控制台应用帮助库
增强用户体验:2个功能强大的.NET控制台应用帮助库
|
6月前
|
网络安全 数据库 Windows
Metasploit6.0系列教程 -- MSF控制台命令
Metasploit6.0系列教程 -- MSF控制台命令
60 1
|
6月前
|
编解码 Linux Shell
【Shell 命令集合 系统设置 】Linux 设置Linux系统的控制台参数和属性setconsole命令 使用指南
【Shell 命令集合 系统设置 】Linux 设置Linux系统的控制台参数和属性setconsole命令 使用指南
100 0