【沁恒WCH CH32V307V-R1与Arduino的串口通讯】

news2024/11/29 4:37:42

【沁恒WCH CH32V307V-R1的单线半双工模式串口通讯】

  • 1. 前言
  • 2. 软件配置
    • 2.1 安装MounRiver Studio
  • 3. UASRT项目测试
    • 3.1 打开UASRT工程
    • 3.2 CH307串口发送数据到Arduino实验
    • 3.3 CH307串口接收数据Arduino实验
  • 5. 小结

在这里插入图片描述

1. 前言

本例演示了采用CH307串口3与Arduino软串口收发通信,熟悉STM32和Arduino开发用易上手配置。✨✨✨

  • 比赛详情官网:https://www.wch.cn/RISC-V-MCU-competition/#/?indexFromSubmit=0

这是使用MounRiver Studio开发的项目,支持在RISC-V核心基础硬件CH32V307评估板上使用带有msh Shell的RTOS快速原型。

MCU:CH32V307VCT6,主频 144MHz,FLASH和RAM可配置
l 全双工或半双工的同步或异步通信
l NRZ 数据格式
l 分数波特率发生器,最高 9Mbps
l 可编程数据长度
l 可配置的停止位
l 支持 LIN,IrDA 编码器,智能卡
l 支持 DMA
l 多种中断源

在这里插入图片描述

首先,应安装 CH32V307 评估板的驱动程序,打开设备管理器查看USB 端口外部接口已准备就绪。
在这里插入图片描述

2. 软件配置

2.1 安装MounRiver Studio

环境搭建教程:https://blog.csdn.net/VOR234/article/details/128932474

在这里插入图片描述

3. UASRT项目测试

3.1 打开UASRT工程

评估板说明及参考例程:https://www.wch.cn/downloads/CH32V307EVT_ZIP.html
在这里插入图片描述

进入EXAM目录,就有对应的外设教程
在这里插入图片描述
进入USART_HalfDuplex文件下,双击USART_HalfDuplex.wvproj,

在这里插入图片描述

打开项目工程如下,main.cuser文件夹下
在这里插入图片描述

3.2 CH307串口发送数据到Arduino实验

修改CH307的main.c,杜邦线连接PB10(TX)--D2(RX);PB11(RX)--D3(TX)

/********************************** (C) COPYRIGHT *******************************
* File Name          : main.c
* Author             : WCH
* Version            : V1.0.0
* Date               : 2021/06/06
* Description        : Main program body.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for 
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/

/*
 *@Note:采用CH307串口3与Arduino软串口收发通信
Hardware connection:PB10(TX)--D2(RX);PB11(RX)--D3(TX)

*/

#include "debug.h"

/* Global typedef */
typedef enum
{
    FAILED = 0,
    PASSED = !FAILED
} TestStatus;

/* Global define */
//#define RxSize1    (size(RxBuffer1))
#define TxSize1    (size(TxBuffer1))
#define RxSize1    256
#define size(a)    (sizeof(a) / sizeof(*(a)))

/* Global Variable */
u8 TxBuffer1[] = "abcd"; /* Send by UART3 */
u8 RxBuffer1[RxSize1] = {0};                                                   /* USART3 Using  */

u8 TxCnt1 = 0, RxCnt1 = 0;




/*********************************************************************
 * @fn      USARTx_CFG
 *
 * @brief   Initializes the USART3 peripheral.
 *
 * @return  none
 */
void USARTx_CFG(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure = {0};
    USART_InitTypeDef USART_InitStructure = {0};
//    NVIC_InitTypeDef NVIC_InitStructure = { 0 };
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

    /* USART3 TX-->B.10  RX-->B.11 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; /* Only Configure TX Pin */
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; /* Only Configure TX Pin */
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;


    USART_Init(USART3, &USART_InitStructure);
    USART_Cmd(USART3, ENABLE);
//    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
//    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
//    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
//    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//    NVIC_Init(&NVIC_InitStructure);
//
//    USART_Cmd(USART3, ENABLE);
}

/*********************************************************************
 * @fn      main
 *
 * @brief   Main program.
 *
 * @return  none
 */
int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    SystemCoreClockUpdate();
    Delay_Init();
    USART_Printf_Init(115200);	
    printf("SystemClk:%d\r\n", SystemCoreClock);
    printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
    printf("USART3 Arduino TEST\r\n");
    USARTx_CFG(); /* USART3 INIT */
    printf("USART3 INIT\r\n");



    while(1)
    {
/*
CH307发送数据到Arduino
*/
        while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET){
            }
        for ( int var = 0;  var < TxSize1-1; ++ var) {
            USART_SendData(USART3, TxBuffer1[var]);
            Delay_Ms(1);
        }
        printf("TxBuffer1:%s\r\n", TxBuffer1);
        Delay_Ms(1000);


    }
}



Arduino UNO 采用mixly编程
在这里插入图片描述
代码如下


#include <SoftwareSerial.h>

SoftwareSerial mySerial(2,3);
String item;
volatile int number;

void setup(){
  mySerial.begin(9600);
  Serial.begin(9600);
  item = "hello123456";
  number = 0;
  Serial.println(item);
  mySerial.println(item);
}

void loop(){
  if (mySerial.available() > 0) {
    item = mySerial.readString();
    Serial.println(String("item:") + String(item) + String("; number:") + String(number));
    number++;

  }
  delay(1);

}

实验效果
在这里插入图片描述
在这里插入图片描述

3.3 CH307串口接收数据Arduino实验

接线保持不变
修改CH307的main.c,杜邦线连接PB10(TX)--D2(RX);PB11(RX)--D3(TX)

/********************************** (C) COPYRIGHT *******************************
* File Name          : main.c
* Author             : WCH
* Version            : V1.0.0
* Date               : 2021/06/06
* Description        : Main program body.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for 
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/

/*
 *@Note:采用CH307串口3与Arduino软串口收发通信
Hardware connection:PB10(TX)--D2(RX);PB11(RX)--D3(TX)

*/

#include "debug.h"

/* Global typedef */
typedef enum
{
    FAILED = 0,
    PASSED = !FAILED
} TestStatus;

/* Global define */
//#define RxSize1    (size(RxBuffer1))
#define TxSize1    (size(TxBuffer1))
#define RxSize1    256
#define size(a)    (sizeof(a) / sizeof(*(a)))

/* Global Variable */
u8 TxBuffer1[] = "abcd"; /* Send by UART3 */
u8 RxBuffer1[RxSize1] = {0};                                                   /* USART3 Using  */

u8 TxCnt1 = 0, RxCnt1 = 0;




/*********************************************************************
 * @fn      USARTx_CFG
 *
 * @brief   Initializes the USART3 peripheral.
 *
 * @return  none
 */
void USARTx_CFG(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure = {0};
    USART_InitTypeDef USART_InitStructure = {0};
//    NVIC_InitTypeDef NVIC_InitStructure = { 0 };
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

    /* USART3 TX-->B.10  RX-->B.11 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; /* Only Configure TX Pin */
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; /* Only Configure TX Pin */
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;


    USART_Init(USART3, &USART_InitStructure);
    USART_Cmd(USART3, ENABLE);
//    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
//    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
//    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
//    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//    NVIC_Init(&NVIC_InitStructure);
//
//    USART_Cmd(USART3, ENABLE);
}

/*********************************************************************
 * @fn      main
 *
 * @brief   Main program.
 *
 * @return  none
 */
int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    SystemCoreClockUpdate();
    Delay_Init();
    USART_Printf_Init(115200);	
    printf("SystemClk:%d\r\n", SystemCoreClock);
    printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
    printf("USART3 Arduino TEST\r\n");
    USARTx_CFG(); /* USART3 INIT */
    printf("USART3 INIT\r\n");



    while(1)
    {
/*
CH307发送数据到Arduino
*/
//        while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET){
//            }
//        for ( int var = 0;  var < TxSize1-1; ++ var) {
//            USART_SendData(USART3, TxBuffer1[var]);
//            Delay_Ms(1);
//        }
//        printf("TxBuffer1:%s\r\n", TxBuffer1);
//        Delay_Ms(1000);

/*
从Arduino接收数据到CH307
 */
        RxBuffer1[RxCnt1++] = USART_ReceiveData(USART3);
        while(RxBuffer1[RxCnt1-1] == 'i'|| RxCnt1-1 != 0)
        {
            while(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET){
            }
            RxBuffer1[RxCnt1++] = USART_ReceiveData(USART3);
            if (RxBuffer1[RxCnt1-1] == '\t') {
                printf("RxBuffer1:%s\r\n", RxBuffer1);
                break;
            }
        }
        RxCnt1 = 0;
        for (int var = 0; var < RxSize1; ++var) {
            RxBuffer1[var] = 0;
        }
        Delay_Ms(1);
    }
}


Arduino UNO 采用mixly编程
在这里插入图片描述

代码如下



#include <SoftwareSerial.h>

SoftwareSerial mySerial(2,3);
String item;
volatile int number;

void setup(){
  mySerial.begin(9600);
  Serial.begin(9600);
  item = "hello123456";
  number = 0;
  Serial.println(item);
  mySerial.println(item);
}

void loop(){
  mySerial.print(String("item:") + String(item) + String("; number:") + String(number) + String("; number:") + String(number) + String("\t"));
  number++;
  delay(1);

}

实验效果
在这里插入图片描述

5. 小结

🥳🥳🥳通过对这篇文章我们掌握了沁恒WCH CH32V307V-R1与Arduino的串口通讯,尝试与Arduino通讯做更加好玩的实验,进而丰富我们的生活。🛹🛹🛹从而实现对外部世界进行感知,充分认识这个有机与无机的环境,🥳🥳🥳科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。🤣🤣🤣

参考文献:

  • CH32V307数据手册:https://www.wch.cn/downloads/CH32V20x_30xDS0_PDF.html
  • CH32V307参考手册:https://www.wch.cn/downloads/CH32FV2x_V3xRM_PDF.html
  • 评估板说明及参考例程:https://www.wch.cn/downloads/CH32V307EVT_ZIP.html
  • CH343SER.ZIP串口地址:https://www.wch.cn/downloads/CH343SER_ZIP.html
  • MRS最新V1.51版本安装包:www.mounriver.com
  • 环境搭建教程:https://blog.csdn.net/VOR234/article/details/128932474
  • 【沁恒WCH CH32V307V-R1开发板两路ADC读取实验】:https://blog.csdn.net/VOR234/article/details/128941074
  • 【沁恒WCH CH32V307V-R1开发板读取板载温度实验】:https://blog.csdn.net/VOR234/article/details/128941832
  • 【沁恒WCH CH32V307V-R1开发板输出DAC实验】:https://blog.csdn.net/VOR234/article/details/128942550
  • 【沁恒WCH CH32V307V-R1的单线半双工模式串口通讯】:
    https://blog.csdn.net/VOR234/article/details/128943395

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/344865.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python的深、浅拷贝到底是怎么回事?一篇解决问题

嗨害大家好鸭&#xff01;我是小熊猫~ 一、赋值 Python中&#xff0c; 对象的赋值都是进行对象引用&#xff08;内存地址&#xff09;传递, 赋值&#xff08;&#xff09;&#xff0c; 就是创建了对象的一个新的引用&#xff0c; 修改其中任意一个变量都会影响到另一个 will …

第七届蓝桥杯省赛——5分小组

题目&#xff1a;9名运动员参加比赛&#xff0c;需要分3组进行预赛。有哪些分组的方案呢&#xff1f;我们标记运动员为 A,B,C,... I下面的程序列出了所有的分组方法。该程序的正常输出为&#xff1a;ABC DEF GHIABC DEG FHIABC DEH FGIABC DEI FGHABC DFG EHIABC DFH EGIABC DF…

VFIO软件依赖——VFIO协议

文章目录背景PCI设备模拟PCI设备抽象VFIO协议实验Q&A背景 在虚拟化应用场景中&#xff0c;虚拟机想要在访问PCI设备时达到IO性能最优&#xff0c;最直接的方法就是将物理设备暴露给虚拟机&#xff0c;虚拟机对设备的访问不经过任何中间层的转换&#xff0c;没有虚拟化的损…

2023年小鹏新能源汽车核心部件解密

小鹏主要硬件清单(G9车型) 感知层 从硬件上看,G9搭载两颗NVIDIA DRIVE Orin 智能辅助驾驶芯片,算力达到 508 TOPS。此外,全车周边31 个感知元器件,(800万双目、4个300万侧前侧后、4个130万环视、1个170万后视、1个100万DMS)、12个超声波雷达、5个毫米波雷达、2个速…

TeamFiltration:一款针对O365 AAD账号安全的测试框架

关于TeamFiltration TeamFiltration是一款针对O365 AAD账号安全的跨平台安全测试框架&#xff0c;在该工具的帮助下&#xff0c;广大研究人员可以轻松对O365 AAD账号进行枚举、喷射、过滤和后门植入等操作。TeamFiltering与CrackMapExec非常相似&#xff0c;它可以创建并维护一…

四大垃圾回收算法七大垃圾回收器

JVM的运行时内存也叫做JVM堆&#xff0c;从GC的角度可以将JVM分为新生代、老年代和永久代。其中新生代默认占1/3堆内存空间&#xff0c;老年代默认占2/3堆内存空间&#xff0c;永久代占非常少的对内存空间。新生代又分为Eden区、SurvivorFrom区和SurvivorTo区&#xff0c; Eden…

Python基础知识复习以及第三方库openxel的初步使用

目录文件python文件打开函数Python中的split函数详细解释List对象list添加元素的三种方法删除元素反转Python第三方库openxel的初步使用excel文件对象open操作excel入门文件 python文件打开函数 语法&#xff1a;open&#xff08;file, mode ‘r’, buffering-1, encodingNon…

【高性价比】初学者入门吉他值得推荐购买的民谣单板吉他品牌—VEAZEN费森吉他

“在未知的世界里&#xff0c;我们是一群不疲不倦的行者&#xff0c;执念于真善美&#xff0c;热衷于事物的极致。我们抽丝剥茧&#xff0c;不断地打败自己&#xff0c;超越自己&#xff0c;我们无所畏惧终将成为巨人。”这是VEAZEN吉他官网首页上很明显的一段话&#xff0c;也…

Learning C++ No.9【STL No.1】

引言&#xff1a; 北京时间&#xff1a;2023/2/13/18:29&#xff0c;开学正式上课第一天&#xff0c;直接上午一节思想政治&#xff0c;下午一节思想政治&#xff0c;生怕我们……&#xff0c;但&#xff0c;我深知该课的无聊&#xff0c;所以充分利用时间&#xff0c;把我的小…

MongoDB 索引

MongoDB 索引 索引通常能够极大的提高查询的效率&#xff0c;如果没有索引&#xff0c;MongoDB在读取数据时必须全集合扫描选取符合查询条件的记录。这种扫描全集合的查询效率是非常低的&#xff0c;特别在处理大量的数据时&#xff0c;查询可以要花费几十秒甚至几分钟&#x…

2023年城投债投资研究报告

第一章 概况 城投债又称“准市政债”&#xff0c;是地方投融资平台作为发行主体&#xff0c;公开发行企业债和中期票据&#xff0c;其主业多为地方基础设施建设或公益性项目。从承销商到投资者&#xff0c;参与债券发行环节的人&#xff0c;都将其视为是当地政府发债。伴随“打…

高压放大器在超声导波钢轨传播中的应用

实验名称&#xff1a;高压放大器在超声导波钢轨传播中的应用研究方向&#xff1a;无损检测测试目的&#xff1a;超声导波具有传播距离远、检测距离长的特点&#xff0c;在钢轨无损检测领域受到越来越多的关注。本文使用有限元仿真方法和现场实验方法&#xff0c;对钢轨各模态超…

四类(七种)排序算法总结

一、插入排序 基本思想&#xff1a; 每次将一个待排序的对象&#xff0c;按其关键码大小&#xff0c;插入到前面已经排好序的一组对象的适当位置上&#xff0c;直到对象全部插入为止。即边插入边排序&#xff0c;保证子序列中随时都是排好序的。 基本操作——有序插入&#xff…

搭建pclpy环境与读取pandaset数据并转换为pkl格式为pcd格式

1.搭建pclpy环境 问题&#xff1a;需要处理pcd文件&#xff0c;于是开始摸索搭建环境&#xff0c;有python-pcl&#xff0c;但是安装过程频频出现问题&#xff0c;于是转向pclpy。 参考链接&#xff1a;GitHub - davidcaron/pclpy: Python bindings for the Point Cloud Libr…

通达信量化接口怎么开发的?

通达信量化接口从广义上看&#xff0c;其实是面对股市有利的系统开发&#xff0c;通过智能化或者说程序化的交易体系直接构建了持仓下单的简单运作方式&#xff0c;对此&#xff0c;通达信量化接口又是如何开发出来的呢&#xff1f;一、函数的调用&#xff1a;相关函数调用结果…

Python语言零基础入门教程(十七)

Python 文件I/O 本章只讲述所有基本的 I/O 函数&#xff0c;更多函数请参考Python标准文档。 #### 打印到屏幕 最简单的输出方法是用print语句&#xff0c;你可以给它传递零个或多个用逗号隔开的表达式。此函数把你传递的表达式转换成一个字符串表达式&#xff0c;并将结果写…

企业分布式网络监控

IT 基础架构已成为提供基本业务服务的基石&#xff0c;无论是内部管理操作还是为客户托管的应用程序服务。监控IT基础设施至关重要&#xff0c;并且已经建立。SMB IT 基础架构需要简单的网络监控工具来监控性能和报告问题。通常&#xff0c;几个 IT 管理员配置网络设备、防火墙…

private static final Long serialVersionUID= 1L详解

我们知道在对数据进行传输时&#xff0c;需要将其进行序列化&#xff0c;在Java中实现序列化的方式也很简单&#xff0c;可以直接通过实现Serializable接口。但是我们经常也会看到下面接这一行代码&#xff0c;private static final Long serialVersionUID 1L&#xff1b;这段代…

实施工程师需要知道的常见linux命令

做为现场实施人员&#xff0c;操作linux服务器几乎是每天的必备工作&#xff0c;那么有哪些命令是工作中需要掌握的&#xff0c;下面会总结出来。 一、磁盘管理 1.1 查看当前目录 使用pwd命令&#xff0c;如下图所示&#xff0c;可以看到当前所处的目录是/root这个目录 1.2 进…

thymeleaf模板注入学习与研究--查找与防御

一、日常编码中常见的两种漏洞场景 1.1 模板参数外部可控 RequestMapping("/path")public String path(RequestParam String lang) {return lang ;}实际开发过程中 依靠我丰富的想象力只能想出 换主题 这种场景下可能会出现 大佬们自行脑补吧。 1.2 使用GetMappin…