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

news2024/9/20 18:35:47

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

  • 1. 前言
  • 2. 软件配置
    • 2.1 安装MounRiver Studio
  • 3. UASRT项目测试
    • 3.1 打开UASRT工程
    • 3.2 编译项目
  • 4. 下载验证
    • 4.1 接线
    • 4.2 演示效果
  • 5. 小结

在这里插入图片描述

1. 前言

  • 该模块包含 3 个通用同步异步收发器(USART1/2/3)和 5 个通用异步收发器(UART4/5/6/7/8)。
    注:对于 CH32V20x_D6、CH32F20x_D6,串口 4 为同步异步收发器(USART4)。本例演示了UART2和USAT3单线半双工模式数据传输和接收,熟悉STM32开发用易上手配置。✨✨✨
  • 比赛详情官网: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文件夹下
在这里插入图片描述

main.c,杜邦线连接PA2 – PB10


/********************************** (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
 single wire half duplex mode, master/slave mode transceiver routine:
 Master:USART2_Tx(PA2)
 Slave:USART3_Tx(PB10)

 This example demonstrates UART2 and USART3 single-wire half-duplex
 mode data transmission and reception.

     Hardware connection:PA2 -- PB10

*/

#include "debug.h"

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

/* Global define */
#define TxSize1    (size(TxBuffer1))
#define TxSize2    (size(TxBuffer2))
#define size(a)    (sizeof(a) / sizeof(*(a)))

/* Global Variable */
u8 TxBuffer1[] = "*Buffer1 Send from USART2 to USART3 using HalfDuplex Mode!"; /* Send by UART2 */
u8 TxBuffer2[] = "#Buffer2 Send from USART3 to USART2 using HalfDuplex Mode!"; /* Send by UART3 */
u8 RxBuffer1[TxSize1] = {0};                                                   /* USART2 Using */
u8 RxBuffer2[TxSize2] = {0};                                                   /* USART3 Using  */

u8 TxCnt1 = 0, RxCnt1 = 0;
u8 TxCnt2 = 0, RxCnt2 = 0;

TestStatus TransferStatus1 = FAILED;
TestStatus TransferStatus2 = FAILED;

/*********************************************************************
 * @fn      Buffercmp
 *
 * @brief   Compares two buffers
 *
 * @param   Buf1,Buf2 - buffers to be compared
 *          BufferLength - buffer's length
 *
 * @return  PASSED - Buf1 identical to Buf
 *          FAILED - Buf1 differs from Buf2
 */
TestStatus Buffercmp(uint8_t *Buf1, uint8_t *Buf2, uint16_t BufLength)
{
    while(BufLength--)
    {
        if(*Buf1 != *Buf2)
        {
            return FAILED;
        }
        Buf1++;
        Buf2++;
    }
    return PASSED;
}

/*********************************************************************
 * @fn      USARTx_CFG
 *
 * @brief   Initializes the USART2 & USART3 peripheral.
 *
 * @return  none
 */
void USARTx_CFG(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure = {0};
    USART_InitTypeDef USART_InitStructure = {0};

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 | RCC_APB1Periph_USART3, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);

    /* USART2 TX-->A.2 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; /* Only Configure TX Pin */
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* USART3 TX-->B.10 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; /* Only Configure TX Pin */
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    USART_InitStructure.USART_BaudRate = 115200;
    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(USART2, &USART_InitStructure);
    USART_Init(USART3, &USART_InitStructure);
    USART_Cmd(USART2, ENABLE);
    USART_Cmd(USART3, ENABLE);

    USART_HalfDuplexCmd(USART2, ENABLE);
    USART_HalfDuplexCmd(USART3, ENABLE);
}

/*********************************************************************
 * @fn      DMA_INIT
 *
 * @brief   Configures the DMA for USART2 & USART3.
 *
 * @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("USART HalfDuplex TEST\r\n");
    USARTx_CFG(); /* USART2 & USART3 INIT */

    while(TxCnt2 < TxSize2) /* USART3--->USART2 */
    {
        while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET) /* waiting for sending finish */
        {
        }
        USART_SendData(USART3, TxBuffer2[TxCnt2++]);

        while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET)
        {
        }
        RxBuffer1[RxCnt1++] = USART_ReceiveData(USART2);
    }

    while(TxCnt1 < TxSize1) /* USART2--->USART3 */
    {
        while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET) /* waiting for sending finish */
        {
        }
        USART_SendData(USART2, TxBuffer1[TxCnt1++]);

        while(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET)
        {
        }
        RxBuffer2[RxCnt2++] = USART_ReceiveData(USART3);
    }

    TransferStatus1 = Buffercmp(TxBuffer1, RxBuffer2, TxSize1);
    TransferStatus2 = Buffercmp(TxBuffer2, RxBuffer1, TxSize2);

    if(TransferStatus1 && TransferStatus2)
    {
        printf("\r\nSend Success!\r\n");
    }
    else
    {
        printf("\r\nSend Fail!\r\n");
    }
    printf("TxBuffer1---->RxBuffer2     TxBuffer2---->RxBuffer1\r\n");
    printf("TxBuffer1:%s\r\n", TxBuffer1);
    printf("RxBuffer1:%s\r\n", RxBuffer1);
    printf("TxBuffer2:%s\r\n", TxBuffer2);
    printf("RxBuffer2:%s\r\n", RxBuffer2);

    while(1)
    {
    }
}


3.2 编译项目

开发板数据线连接电脑就可以开始连接调试🛹🛹🛹,首先开始编译,编译成功如下

在这里插入图片描述

然后下载,下载成功如下

在这里插入图片描述

4. 下载验证

4.1 接线

根据程序设计调试,可以用杜邦线连接PA2 – PB10,即可输出通讯实验成功

4.2 演示效果

代码下载后验证,点击串口调试器,设置串口参数确认。
在这里插入图片描述
复位运行成功如下打印发送成功。

在这里插入图片描述

SystemClk:96000000
ChipID:30700518
USART HalfDuplex TEST

Send Success!
TxBuffer1---->RxBuffer2     TxBuffer2---->RxBuffer1
TxBuffer1:*Buffer1 Send from USART2 to USART3 using HalfDuplex Mode!
RxBuffer1:#Buffer2 Send from USART3 to USART2 using HalfDuplex Mode!
TxBuffer2:#Buffer2 Send from USART3 to USART2 using HalfDuplex Mode!
RxBuffer2:*Buffer1 Send from USART2 to USART3 using HalfDuplex Mode!



5. 小结

🥳🥳🥳通过对这篇文章我们掌握了UART2和USAT3单线半双工模式数据传输和接收,尝试与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

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

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

相关文章

vivo 自研Jenkins资源调度系统设计与实践

作者&#xff1a;vivo 互联网服务器团队- Wu Qinghua 本文从目前业界实现Jenkins的高可用的实现方案&#xff0c;分析各方案的优缺点&#xff0c;引入vivo目前使用的Jenkins高可用方案&#xff0c;以及目前Jenkins资源的调度方案的设计实践和目前的落地运行效果。 一、前言 现…

微服务实战--高级篇:分布式事务seata

分布式事务 1.分布式事务问题 1.1.本地事务 本地事务&#xff0c;也就是传统的单机事务。在传统数据库事务中&#xff0c;必须要满足四个原则&#xff1a; 1.2.分布式事务 分布式事务&#xff0c;就是指不是在单个服务或单个数据库架构下&#xff0c;产生的事务&#xff0c…

PPP协议

PPP协议PPP协议概述PPP链路建立过程PPP链路接口状态机LCP报文格式LCP协商过程—正常协商&#xff08;链路层协商过程&#xff09;LCP协商过程—参数不匹配&#xff08;链路层协商过程&#xff09;LCP协商过程—参数不识别&#xff08;链路层协商过程&#xff09;PPP认证模式PAP…

vTESTstudio - VT System CAPL Functions - General/Trigger Function

前面文章中我们已经介绍了常用的几种板卡的基本信息&#xff0c;那这些板卡该如何去通过软件调用呢&#xff1f;带着这个问题我们开始新的一块内容 - VT系统相关的自动化控制函数介绍&#xff0c;我会按照不同的板卡来分类&#xff0c;对其可控制的函数进行介绍&#xff0c;方便…

快速理解 JVM 原理 - 【基础概念篇】

快速理解 JVM 原理 - 【基础概念篇】 Java虚拟机 是什么&#xff1f; Java 虚拟机 本质就是一台”虚拟的“计算机 &#xff0c;大家通俗的理解是一款 “软件”安装在电脑上 虚拟机通常分为两类&#xff1a; 系统虚拟机【可运行完整操 作系统的软件平台】程序虚拟机 【为执行…

AA-PEG-AA,Acetic Acid-PEG-Acetic Acid,羧酸-聚乙二醇-羧酸供应

英文名称&#xff1a;Acetic Acid-PEG-Acetic Acid&#xff0c;AA-PEG-AA 中文名称&#xff1a;羧酸-聚乙二醇-羧酸 AA-PEG-AA是一种线性双功能PEG羧酸试剂。PEG和COOH基团之间存在亚甲基&#xff08;CH2&#xff09;键。AA-PEG-AA也称为CM-PEG-CM&#xff0c;CM&#xff1a;…

【GD32F427开发板试用】使用TinyMaix进行手写数字识别

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;xusiwei1236 一、TinyMaix简介 TinyMaix是国内sipeed团队开发一个轻量级AI推理框架&#xff0c;官方介绍如下&#xff1a; TinyMaix 是面向单…

django+mysql实现一个简单的web登录页面

目录 一、使用pyacharm创建一个django项目 二、启动django项目验证 三、配置mysql数据库 1、本地安装mysql数据库 1&#xff09;安装mysql数据库 2&#xff09;自己创建一个数据库 2、安装 pymysql 3、配置mysql数据库 1&#xff09;在项目同名包下的_init_.py里面添加…

OpenGL渲染管线介绍

一、概述 OpenGL是跨平台计算机图形应用程序的应用规范&#xff0c;广泛应用于仿真、游戏、GIS系统等领域&#xff0c;实现二三维图形的渲染。OpenGL渲染过程需要经历CPU、GPU两个阶段&#xff0c;CPU中进行图形计算&#xff0c;完成之后调用OpenGL开发接口在GPU中创建缓存区缓…

前后端一些下载与配置(第二篇 第10天过后)nuxt banner redis

NUXT 应该是不用怎么装&#xff1f; 有现成的 axios 还需要在npm吗 好像已经有现成的了 banner banner 笔记汇总P396 Redis Linux安装redis tar -xzvf redis-6.2.6.tar.gz cd redis-6.2.6 照着他做 然后 cd /usr/local/redis/bin ./redis-server /usr/local/redis…

图数据建模基础

Neo4j 图的组件 节点&#xff08;Nodes&#xff09;标签&#xff08;Labels&#xff09;关系&#xff08;Relationships&#xff09;属性&#xff08;Properties&#xff09;建模过程 了解领域并为应用程序定义特定用例&#xff08;问题&#xff09;。开发初始图形数据模型。 对…

ansible的剧本(playbook)

一、playbooks 概述以及实例操作 1、playbooks 的组成 playbooks 本身由以下各部分组成 &#xff08;1&#xff09;Tasks&#xff1a;任务&#xff0c;即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行 &#xff08;2&#xff09;Variables&#xff1…

多模式支持无线监控技术:主动式定位、被动式定位

物联网空间信息与数字技术发展至今&#xff0c;已经催生了一大批优秀的践行者。在日常与商业应用中&#xff0c;室内外定位领域依托于这一技术的发展&#xff0c;更是在近几年风光无限。但是并不是说室内定位与室外定位都已经相当成熟&#xff0c;相对来说&#xff0c;室内定位…

简单实用的内网穿透实现教程

内网穿透&#xff0c;字面理解就是网络地址穿透&#xff0c;是一种比较常用的将内网地址转换成公网地址的方式。通过内网穿透&#xff0c;可以将本地内网局域网提供给外网公网上访问&#xff0c;在外网也能连接访问内网主机和应用&#xff0c;当用户有日常远程和异地外网访问的…

Zabbix的自定义监控

Zabbix的自定义监控 zabbix自动可以提供很多监控项&#xff1b;但是往往不能满足需求&#xff1b;尝尝需要我们自己创建一系列的监控项&#xff0c;这就是自定义监控&#xff1b; 监控项&#xff1a;zabbix进行监控的一个指标&#xff0c;zabbix成为item&#xff1b; 它的值…

C++7:STL-模拟实现vector

目录 vector的成员变量 构造函数 reserve size() capacity() push_back 一些小BUG 赋值操作符重载 析构函数 【】操作符重载 resize pop_back Insert 迭代器失效 erase 二维数组问题 总结一下 vector&#xff0c;翻译软件会告诉你它的意思是向量&#xff0c;但其…

面试腾讯测开岗,结束后被面试官吐槽“什么阿猫阿狗都敢来面试大厂了吗?”.....

前一阵子有个小徒弟向我诉苦&#xff0c;说自己在参加某大厂测试面试的时候被面试官怼得哑口无言&#xff0c;场面让他一度十分尴尬 印象最深的就是下面几个问题&#xff1a; 根据你以前的工作经验和学习到的测试技术&#xff0c;说说你对质量保证的理解&#xff1f; 非关系型…

不连接显示器或者HDMI欺骗器来 使用Moonlight串流游戏

环境&#xff1a;WIN11NVIDIA显卡Moonlight串流 问题&#xff1a;当主机不连接显示器时&#xff0c;Moonlight客户端黑屏 解决办法&#xff1a;使用虚拟显示器来使显卡工资 背景&#xff1a;当SteamDeck 大卖的时候&#xff0c;我开始思考是否也需要购买一台Steam Deck来躺在床…

G1垃圾回收器详解

文章目录前言一、思考问题二、官方文档三、基本介绍四、G1的内存模型五、G1的标记过程六、G1的垃圾回收1、G1过程梳理2、Young GC3、Mixed GC4、Full GC七、参数介绍八、典型问题1、疏散失败&#xff08;Evacuation Failure&#xff09;2、大对象分配&#xff08;Humongous All…

【Linux】动静态库以及动静态链接

环境&#xff1a;centos7.6&#xff0c;腾讯云服务器Linux文章都放在了专栏&#xff1a;【Linux】欢迎支持订阅&#x1f339;链接扩展我们在使用Linux的时候&#xff0c;不禁会有这么一个疑问&#xff1a;为什么我们能够在Linux下进行c/c代码的编写以及编译呢&#xff1f;这是因…