Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
risc-v_RISCV
RDC开发者大会
【相约2022RDC】 初遇RISC-V
发布于 2021-12-19 17:24:01 浏览:1645
订阅该版
[tocm] 首先感谢RT-Thread、沁恒微电子! 周末参加了RT-Thread在深圳举办的开发者大会,遇见了很多大神,也看到了很多行业内的新产品,尤为关心800M的MCU啥时候可以抽波奖。 不过点赞一波沁恒微的预判,直接送板子,送串口转换器!全套!WTF!不抽了送! ![送的板子.jpg](https://oss-club.rt-thread.org/uploads/20211219/eb5be03ae9e059cc089503e83e16aa9a.jpg.webp) 话不多说,直接开干! ## 沁恒微电子赤菟V307开发板初使用 使用沁恒微电子提供的V307开发板主要内容如下: - 开发板资源介绍 - BSP 快速上手 - TCP-SERV 实验 CH32V307V-R0 是 南京沁恒微电子(WCH) 推出的一款基于 RISC-V 内核的开发板,最高主频为 120Mhz,该开发板芯片为 CH32V307-R0。 该开发板常用 **板载资源** 如下: ![赤菟V307.png](https://oss-club.rt-thread.org/uploads/20211219/dfda626341ffbfeb1bc095f020acb49b.png.webp) - MCU:CH32V307VCT6,主频 144MHz,FLASH和RAM四种配置 288KB FLASH ,32KB RAM 256KB FLASH ,64KB RAM 224KB FLASH ,96KB RAM 192KB FLASH ,128KB RAM - 常用外设 - LED:2个用户 LEDs, LED1(blue),LED2(red)。 - LED:power LED, D1。 - 按键,3个,Reset, User 和 Download。 - USB,2个,Tpye-C; 2个, USB-A - 网口,1个,内置 10M PHY 开发板更多详细信息请参考 WCH 官方[开发板介绍][CH32V307评估板说明书.pdf](https://oss-club.rt-thread.org/uploads/20211219/071d579b5c8b04b7f141224b9f9a7008.pdf) ## 外设支持 在stdio中已有BSP 目前对外设的支持情况如下: | **片上外设** | **支持情况** | **备注**| | GPIO | 支持 | PA PB PC PD PE| | UART | 支持 | UART0/1/2/3/4/5/6/7/8| | ADC | 支持 | 10bit ADC1/2| | DAC | 支持 | 10bit DAC channel 1/2| | ETH | 支持 | 10M | ## 串口服务器使用说明 利用BSP中10METH和1路UART组成串口服务器 使用2~8路UART,需在drv_usart.c中进行配置 #### 实验前准备 安装RT-Thread Studio、CH32V307V-R0 BSP包、RISC-GCC-WCH工具、WCH-LINK_Debugger、WCHISPTool工具 ![工具链.png](https://oss-club.rt-thread.org/uploads/20211220/cd705f7e8dd1c779305211c1633e1f07.png.webp) ![V307BSP.png](https://oss-club.rt-thread.org/uploads/20211220/c5c4e310206c16aabea3200076b151c5.png.webp) 新建基于CH32V307开发板BSP的RT-Thread 项目,正确编译,生成用户程序.bin文件。 **验证上电、调试前准备** - 将开发板BOOT0调VCC,利用USB连接开发板P7口,开发板电源灯PWR+、D3红灯、D1l绿灯亮起 - 使用WCHIPSTOL工具修改RAMX 96KB + ROM 244KB - 启用读保护取消 - 点击解除读保护 - 获取用户程序.bin文件,点击下载。 ![WCHISPTool配置.png](https://oss-club.rt-thread.org/uploads/20211219/7300e5670b757cb915d83bf8bb5b3471.png) - 将开发板BOOT 0 调回GND、可利用RT-Tread中集成的wch-link进行程序下载。 ![WCH-LINK.png](https://oss-club.rt-thread.org/uploads/20211219/8427eb22213824682fd9e860719da7d0.png.webp) **驱动配置** BSP包中集成了ETH以及UART驱动,只需要勾选相应的选项,即可完成ETH和UART的初始化 - 选中RT-Thread setting - 硬件配置 - enable UAST1~8 - enable ETH - 组件配置 - 使能网络接口设备 - 使能IWIP堆栈 - 取消使能DHCP分配IP地址,保存静态IP:192.168.1.30 ![驱动配置.png](https://oss-club.rt-thread.org/uploads/20211219/6834a9b3112b153da3da8077a2beb522.png.webp) **控制台查看** BSP中默认将uart1作为MSH指向 可利用list_device、ping等命令查看配置情况, ![ping消息.png](https://oss-club.rt-thread.org/uploads/20211219/619f66422a5ac6a7583e20ee0773f7d2.png) **利用协议栈封好的套接字进行网络通讯** 利用stdio中API的标准TCP例程可进行服务端、客户端实验 **备注** 此处主机地址不同于192.168.1.30,是因本人电脑无网口,通过路由器连接开启DHCP造成IP变化。 ``` /* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * */ /* * 程序清单:tcp 服务端 * * 这是一个 tcp 服务端的例程 * 导出 tcpserv 命令到控制终端 * 命令调用格式:tcpserv * 无参数 * 程序功能:作为一个服务端,接收并显示客户端发来的数据 ,接收到 exit 退出程序 */ #include
#include
/* 使用BSD socket,需要包含socket.h头文件 */ #include
#include
#include
#define BUFSZ (1024) static const char send_data[] = "This is TCP Server from RT-Thread."; /* 发送用到的数据 */ static void tcpserv(int argc, char **argv) { char *recv_data; /* 用于接收的指针,后面会做一次动态分配以请求可用内存 */ socklen_t sin_size; int sock, connected, bytes_received; struct sockaddr_in server_addr, client_addr; rt_bool_t stop = RT_FALSE; /* 停止标志 */ int ret; recv_data = rt_malloc(BUFSZ + 1); /* 分配接收用的数据缓冲 */ if (recv_data == RT_NULL) { rt_kprintf("No memory\n"); return; } /* 一个socket在使用前,需要预先创建出来,指定SOCK_STREAM为TCP的socket */ if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { /* 创建失败的错误处理 */ rt_kprintf("Socket error\n"); /* 释放已分配的接收缓冲 */ rt_free(recv_data); return; } /* 初始化服务端地址 */ server_addr.sin_family = AF_INET; server_addr.sin_port = htons(5000); /* 服务端工作的端口 */ server_addr.sin_addr.s_addr = INADDR_ANY; rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero)); /* 绑定socket到服务端地址 */ if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) { /* 绑定失败 */ rt_kprintf("Unable to bind\n"); /* 释放已分配的接收缓冲 */ rt_free(recv_data); return; } /* 在socket上进行监听 */ if (listen(sock, 5) == -1) { rt_kprintf("Listen error\n"); /* release recv buffer */ rt_free(recv_data); return; } rt_kprintf("\nTCPServer Waiting for client on port 5000...\n"); while (stop != RT_TRUE) { sin_size = sizeof(struct sockaddr_in); /* 接受一个客户端连接socket的请求,这个函数调用是阻塞式的 */ connected = accept(sock, (struct sockaddr *)&client_addr, &sin_size); /* 返回的是连接成功的socket */ if (connected < 0) { rt_kprintf("accept connection failed! errno = %d\n", errno); continue; } /* 接受返回的client_addr指向了客户端的地址信息 */ rt_kprintf("I got a connection from (%s , %d)\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); /* 客户端连接的处理 */ while (1) { /* 发送数据到connected socket */ ret = send(connected, send_data, strlen(send_data), 0); if (ret < 0) { /* 发送失败,关闭这个连接 */ closesocket(connected); rt_kprintf("\nsend error,close the socket.\r\n"); break; } else if (ret == 0) { /* 打印send函数返回值为0的警告信息 */ rt_kprintf("\n Send warning,send function return 0.\r\n"); } /* 从connected socket中接收数据,接收buffer是1024大小,但并不一定能够收到1024大小的数据 */ bytes_received = recv(connected, recv_data, BUFSZ, 0); if (bytes_received < 0) { /* 接收失败,关闭这个connected socket */ closesocket(connected); break; } else if (bytes_received == 0) { /* 打印recv函数返回值为0的警告信息 */ rt_kprintf("\nReceived warning,recv function return 0.\r\n"); closesocket(connected); break; } /* 有接收到数据,把末端清零 */ recv_data[bytes_received] = '\0'; if (strcmp(recv_data, "q") == 0 || strcmp(recv_data, "Q") == 0) { /* 如果是首字母是q或Q,关闭这个连接 */ closesocket(connected); break; } else if (strcmp(recv_data, "exit") == 0) { /* 如果接收的是exit,则关闭整个服务端 */ closesocket(connected); stop = RT_TRUE; break; } else { /* 在控制终端显示收到的数据 */ rt_kprintf("RECEIVED DATA = %s \n", recv_data); } } } /* 退出服务 */ closesocket(sock); /* 释放接收缓冲 */ rt_free(recv_data); return ; } MSH_CMD_EXPORT(tcpserv, a tcp server sample); ``` ![TCP-Serv.png](https://oss-club.rt-thread.org/uploads/20211219/c5f9033cc4d51983ea3d510a969db842.png.webp)
4
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
daoHeng
这家伙很懒,什么也没写!
文章
1
回答
2
被采纳
0
关注TA
发私信
相关文章
1
studio能否支持risc-v的工程,包括调试。
2
移植rt-nano至risc-v时,无法在main函数创建用户线程
3
risc-v移植rtthread,程序莫名跳转到异常Exception
4
GD32VF103出现to free a bad data block:错误
5
rtt os riscv Store address misaligned异常
6
仅实现机器模式的芯片是否可以移植RT-THREAD系统
7
nano版本移植finsh(基于risc-v)
8
C++在多核下cout打印引起崩溃
9
RT-SMART求助
10
RT-Thread在RISC-V架构的芯片上有成熟的市场项目吗?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
YZRD
2
篇文章
4
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部