完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、控制台解读与自定义命令:
在HelloWorld中我发现可以通过在串口助手输入help可以获取可以键入的命令: 包括了系统命令和用户命令。 但是在做LED实验时输入help却没有反应,但是这个控制台确实是比较方便调试,还有系统的状态查看,所以我对比了两个工程的异同。 在进入main函数后先进行yoc初始化,这里面初始化了RX,TX引脚和功能,然后进行波特率的设置,设置LOG打印等级,最后就是关键的cli初始化,这个就是控制台的初始化,在cli初始化里面,aos_cli_init就是前面看到的系统Commands,cli_reg_cmd_ps、cli_reg_cmd_free()就是User Commands。 /* 添加完这些代码之后再编译烧录就可以使用控制台命令了!! 那我们可不可以自己定义自己的命令呢? 照着ps和free的命令,ps命令初始化函数如下: /* cli_command是命令的结构体,有三个成员变量,分别为名字还有命令的具体描述信息还有回调函数。 /* 我们可以自定义一个命令,取名test:然后编写回调函数:(这里argc是输入参数的个数,我们将输入的参数全部打印出来作为测试用),最后调用注册命令函数传入自定义命令结构体: /* 编译烧录控制台键入help可以看到test出现在了用户命令中了: /* 然后输入带参数的test命令,可以看到与预期的结果一致(注意这里是得到字符串,我们可以用strcmp活用atoi将数字字符串转为int形进一步去判断然后实现自己想要的业务逻辑功能): /* 二、点RGB灯 从原理图看出LED低电平亮:我们可以用通用IO口点亮还可以将GPIO复用为PWM来实现呼吸灯的效果。 /* ①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模式:
/* 然后我们在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, %dn", __FUNCTION__, __LINE__); ☐ return; ☐ } ☐ ☐ ret = csi_pwm_out_config(&r, 7 / 2, 300, 100, PWM_POLARITY_HIGH); ☐ if(ret != CSI_OK) ☐ { ☐ printf("===%s, %dn", __FUNCTION__, __LINE__); ☐ return; ☐ } ☐ ret = csi_pwm_out_start(&r, 7 / 2); ☐ if(ret != CSI_OK) ☐ { ☐ printf("===%s, %dn", __FUNCTION__, __LINE__); ☐ return; ☐ } ☐ // 25 ☐ ret = csi_pwm_out_config(&r, 2 / 2, 300, 100, PWM_POLARITY_HIGH); ☐ if(ret != CSI_OK) ☐ { ☐ printf("===%s, %dn", __FUNCTION__, __LINE__); ☐ return; ☐ } ☐ ret = csi_pwm_out_start(&r, 2 / 2); ☐ if(ret != CSI_OK) ☐ { ☐ printf("===%s, %dn", __FUNCTION__, __LINE__); ☐ return; ☐ } ☐ // 4 ☐ ret = csi_pwm_out_config(&r, 4 / 2, 300, 100, PWM_POLARITY_HIGH); ☐ if(ret != CSI_OK) ☐ { ☐ printf("===%s, %dn", __FUNCTION__, __LINE__); ☐ return; ☐ } ☐ ret = csi_pwm_out_start(&r, 4 / 2); ☐ if(ret != CSI_OK) ☐ { ☐ printf("===%s, %dn", __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]); ☐ } ☐ 三、舵机: csi_pwm_out_config(&r, 2, 300, g_ctr, PWM_POLARITY_HIGH); 四、关于PWM几点疑惑 在设置PWM的配置时用的是: /* 其中4/2的4是通道4,但是不知道为什么要/2,这么说的话,4/2和5/2效果应该是一样的(结果都是整形2),也就是说通道5如果配置为PWM输出的话,那这两个引脚就是一模一样的了,查看手册发现有4个引脚为CH4,5:我们全部配置为PWM 模式: /* 接上逻辑分析仪: 结果真的一模一样,周期占空比都是一样的,哎就很奇怪,不知道哪的问题。。。 文章转载自:平头哥芯片开放社区 作者:溪悦哦 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
【平头哥Sipeed LicheeRV 86开发板试用体验】Waft初体验
15706 浏览 1 评论
13761 浏览 4 评论
【平头哥Sipeed LicheeRV 86开发板试用体验】四、烧写waft系统&搭建waft测试环境
19682 浏览 2 评论
59126 浏览 19 评论
【限时福利】加入芯片开发社区,领100G电子工程师资料大礼包
88185 浏览 121 评论
邀请函 | 3月2日 来上海参加平头哥“玄铁RISC-V生态大会”
787浏览 0评论
读书分享会 | 玄铁RISC-V处理器入门与实战电子书免费下载!
684浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 19:07 , Processed in 0.604903 second(s), Total 66, Slave 50 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号