【平头哥RVB2601创意应用开发】用于单片机调试的有线和无线串口屏
[复制链接]
本帖最后由 serialworld 于 2022-5-20 18:21 编辑
作品名称
用于单片机调试的有线和无线串口屏
作者:serialworld
单片调试时经常需要串口显示相关的信息,一般串口需要电脑屏幕的显示。单片机需要连接电脑来显示串口的信息。有时候使用电脑的屏幕显示不方便,如果直接使用一块可以显示串口信息的屏幕,开发调试时就比较方便。如果开发板和电脑距离比较远,使用无线串口功能就比较方便了。也可以通过无线串口连接开发板,方便调试和信息显示。也可以把RVB2601开发板作为其他开发板的无线信息显示屏。
CH2601 是基于玄铁 E906 的 RISC-V 生态芯片,最高主频 220MHz,支持 AliOS Things
物联网操作系统、平头哥 YoC 软件平台及平头哥剑池开发工具(CDK)。
RVB2601是基于平头哥生态芯片CH2601的开发板,板载JTAG调试器,WiFi&BLE芯片 W800,
音频 ADC-ES7210,音频 DAC-ES8156,128x64 OLED 屏幕,RGB 三色指示灯,用
户按键,及兼容 Arduino 的扩展接口。
本项目是利用RVB2601屏幕和串口及无线功能可以设计一个有线或是无线的串口信息显示屏,方便
显示单片机的调试信息。
UART0可以接收其他单机系统的串口输出,OLED显示输出结果。使用下面标记的引脚可以接收其他单片机的串口输出的信息。
程序主要由3个任务分别是gui_lvgl_task 显示数据,led_task负责led闪烁,ch_input_task负责串口数据的输入。程序的基本功能是接收串口的输入并通过调用lvgl GUI库在开发板自带的OLED屏上显示串口的输入内容。
aos_task_new("gui", gui_lvgl_task, NULL, 10 * 1024);
aos_task_new("led", led_task, NULL, 10 * 1024);
aos_task_new("getchar", ch_input_task, NULL, 10 * 1024);
五、作品源码
/* Copyright (C) 2015-2017 Alibaba Group Holding Limited
*/
/*********************
* INCLUDES
*********************/
#define _DEFAULT_SOURCE /* needed for usleep() */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <aos/aos.h>
#include "aos/cli.h"
#include "app_init.h"
#include "lvgl.h"
#include "lv_label.h"
#include "oled.h"
#include "myled.h"
#include "console_uart.h"
/*********************
* DEFINES
*********************/
#define TAG "app"
/**********************
* TYPEDEFS
**********************/
/**********************
* STATIC PROTOTYPES
**********************/
// GUI
//static void gui_lvgl_task(void *arg);
//
/**********************
* STATIC VARIABLES
**********************/
/**********************
* MACROS
**********************/
/**********************
* GLOBAL FUNCTIONS
**********************/
#define N 16
volatile uint32_t g_debug = 0;
volatile uint32_t g_debug_v = 0;
volatile char c;
char myinput[N];
char line1[N]={'\0'};
char line2[N]={'\0'};
char line3[N]={'\0'};
char line4[N]={'\0'};
int current_line=1;
int update =0;
aos_mutex_t input_mutex;
static lv_obj_t *p;
static void gui_lvgl_task(void *arg);
static void led_task(void *arg);
static void ch_input_task(void *arg);
void get_input(char *str);
#include "csi_core.h"
/**
* main
*/
int main(void)
{
board_yoc_init();
myled_init();
int ret = -1;
/* 创建一个mutex */
ret = aos_mutex_new(&input_mutex);
if (ret != 0) {
return 1;
}
aos_task_new("gui", gui_lvgl_task, NULL, 10 * 1024);
aos_task_new("led", led_task, NULL, 10 * 1024);
aos_task_new("getchar", ch_input_task, NULL, 10 * 1024);
return 0;
}
static void gui_label_create(void)
{
p = lv_label_create(lv_scr_act(), NULL);
lv_label_set_long_mode(p, LV_LABEL_LONG_BREAK);
lv_label_set_align(p, LV_LABEL_ALIGN_LEFT);
lv_obj_set_pos(p, 0, 0);
lv_obj_set_size(p, 128, 64);
lv_label_set_text(p, "EE world");
aos_msleep(2000);
// lv_label_set_long_mode(p, LV_LABEL_LONG_SROLL_CIRC);
}
static void gui_lvgl_task(void *arg)
{
lv_init();
/*Initialize for LittlevGL*/
oled_init();
/*Select display 1*/
// demo_create();
gui_label_create();
// extern static lv_obj_t *p;
while (1) {
/* Periodically call the lv_task handler.
* It could be done in a timer interrupt or an OS task too.*/
lv_task_handler();
// LOGD(TAG, "hello world!");
if(1 == aos_mutex_is_valid(&input_mutex)) {
aos_mutex_lock(&input_mutex, AOS_WAIT_FOREVER);
if(update){
lv_label_set_text_fmt(p,"%s%s%s%s",line1, line2, line3, line4);
}
update = 0;
aos_mutex_unlock(&input_mutex);
}
aos_msleep(10);
lv_tick_inc(1);
}
}
static void led_task(void *arg){
while(1){
myled_test();
}
}
static void ch_input_task(void *arg){
while(1){
for(int k = 0;k<N;k++)
{
myinput[k] ='\0';
}
get_input(myinput);
printf("%s",myinput);
aos_msleep(5);
if(1 == aos_mutex_is_valid(&input_mutex)) {
aos_mutex_lock(&input_mutex, AOS_WAIT_FOREVER);
update = 1;
if(current_line<=4){
switch(current_line++){
case 1:
sprintf(line1,"%s",myinput);
break;
case 2:
sprintf(line2,"%s",myinput);
break;
case 3:
sprintf(line3,"%s",myinput);
break;
case 4:
sprintf(line4,"%s",myinput);
break;
default:
break;
}
}
else {
for(int k = 0;k<N;k++)
{
line1[k] ='\0';
}
sprintf(line1,"%s",line2);
for(int k = 0;k<N;k++)
{
line2[k] ='\0';
}
sprintf(line2,"%s",line3);
for(int k = 0;k<N;k++)
{
line3[k] ='\0';
}
sprintf(line3,"%s",line4);
for(int k = 0;k<N;k++)
{
line4[k] ='\0';
}
sprintf(line4,"%s",myinput);
}
aos_mutex_unlock(&input_mutex);
}
}
}
void get_input(char * str){
for (int i=0,ch ='\0'; i<N ;++i){
if(i == N-1){
str = '\0';
break;
}
if(i == N-2){
str = '\r';
continue;
}
ch= uart_getc();
if(ch == '\n'){
str = '\0';
break;
} else {
str =ch;
}
}
}
getc();
if(ch == '\n'){
str = '\0';
break;
} else {
str =ch;
}
}
}
六、视频演示(视频简介+链接)
https://occ.t-head.cn/community/post/detail?id=4044567325822296064
视频演示链接如下:
七、项目总结(项目文字总结+帖子分享链接汇总)
https://bbs.eeworld.com.cn/thread-1197618-1-1.html
https://bbs.eeworld.com.cn/thread-1197779-1-1.html
https://bbs.eeworld.com.cn/thread-1197900-1-1.html
八、其他
因时间和技术能力问题未实现无线串口的功能,需要进一步学习后实现。RVB2601仅仅当做串口屏使用有点大才小用了。
|