沁恒ch32V208处理器开发(四)串口通信

2023-11-14

串口资源

资源配置

CH32V208 系列,是基于 RISC-V 指令架构设计的 32 位 RISC 内核 MCU,根据封装的不同,可用的USART串口资源如下表所示:

在这里插入图片描述且USART具有如下主要特征:
(1)全双工或半双工的同步或异步通信
(2) 支持分数波特率发生器,最高 9Mbps
(3)可编程数据长度、停止位长度
(4)支持 LIN,IrDA 编码器,智能卡
(5)支持 DMA
(6)支持多种中断

其内部模块图实现如下:
在这里插入图片描述

同步模式

和其他单片机不同的是,ch32V208处理器的USART还支持同步模式,就是说系统在使用 USART 模块时可以输出时钟信号。在开启同步模式对外发送数据时,CK引脚会同时对外输出时钟。 要开启同步模式,只需要对控制寄存器 2(R16_USARTx_CTLR2)的 CLKEN 位置位,即可,但有两点注意:
(1)开启同步模式同时需要关闭LIN 模式、智能卡模式、红外模式和半双工模式,即保证 SCEN、HDSEL 和 IREN 位处于复位状态,这三位在控制寄存器 (R16_USARTx_CTLR3)中。
(2)USART 模块同步模式只工作在主模式,即 CK 引脚只输出时钟,不接收输入;
只在 TX 引脚输出数据时输出时钟信号;

单线半双工模式

半双工模式支持使用单个引脚(只使用 TX 引脚)来接收和发送,TX 引脚和 RX 引脚在芯片内部连接。 开启半双工模式的方式是对控制寄存器 3(R16_USARTx_CTLR3)的 HDSEL 位置位,但同时需要关闭 LIN 模式、智能卡模式、红外模式和同步模式,即保证 SCEN、CLKEN 和 IREN 位处于复位状态,这三位在控制寄存器 2 和 3(R16_USARTx_CTLR2 和 R16_USARTx_CTLR3)中。 设置成半双工模式之后,需要把 TX 的 IO 口设置成浮空输入或开漏输出高模式。在 TE 置位的情况下,只要将数据写到数据寄存器上,就会发送出去。

中断

ch32V208处理器的USART 模块支持多种中断源,包括发送数据寄存器空(TXE)、CTS、发送完成(TC)、接收数据就绪(TXNE)、数据溢出(ORE)、线路空闲(IDLE)、奇偶校验出错(PE)、断开标志(LBD)、噪声(NE)、多缓冲通信的溢出(ORE)和帧错误(FE)等等。

DMA

ch32V208处理器的USART 模块支持 DMA 功能,可以利用 DMA 实现快速连续收发。当启用 DMA 时,TXE 被置位时,DMA就会从设定的内存空间向发送缓冲区写数据。当使用 DMA 接收时,每次 RXNE 置位后,DMA 就会将接收缓冲区里的数据转移到特定的内存空间。

串口的初始化

ch32V208处理器的USART通信模式较多,下面以最常用的双工通信模式为例来介绍实现过程,本例程中,使用USART1和USART2,通过外部交叉连接实现全双工的串口通信功能,实现代码如下

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_AFIO | RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);



/* USART1 TX-->B.6 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; /* 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_PinRemapConfig(GPIO_Remap_USART1, 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);


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(USART1, &USART_InitStructure);
USART_Init(USART2, &USART_InitStructure);


USART_Cmd(USART1, ENABLE);
USART_Cmd(USART2, ENABLE);

USART_HalfDuplexCmd(USART1, ENABLE);
USART_HalfDuplexCmd(USART2, ENABLE);

}

串口通信的实现

双串口的收发通信实现包括两部分,USART1的发送和USART2的接收,以及USART1的发送和USART1的接收两个过程,实现方法是完全一样的,USART1—>USART2的实现如下:

 while(TxCnt1 < TxSize1) /* USART1--->USART2,TxSize1为发送个数 */
    {
        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) 
           /* 等待串口1的当前数据发送完成 */
        {
        }
        USART_SendData(USART1, TxBuffer1[TxCnt1++]);
       
       //等待接收完成
        while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET)
        {
        }
        RxBuffer2[RxCnt2++] = USART_ReceiveData(USART2); 
        //把接收数据存放到usart2的接收缓冲区
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

沁恒ch32V208处理器开发(四)串口通信 的相关文章

  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么

随机推荐

  • POI Excel 基础(一)

    POI 5 2 3 官网 github POI HSSF and POI XSSF SXSSF 用于访问Microsoft Excel格式文件的Java API HSSF 是Horrible SpreadSheet Format的缩写 也即
  • 手机内部充电电流控制原理图(如果手机支持快充,比如支持9V快充,则通过充电接口的D+、D-二根线,输出对应的高低电平组合,FP6601就会控制它的3脚接地,4脚悬空,此时R3与R2并联,改变反馈下拉)

    手机内部充电电流控制原理图 来源 电工之家 作者 电工之家 2019 12 08 10 48 7365次阅读 0 手机充电器电流控制方面 现在的手机充电器 无一例外 都使用了隔离式开关电源电路 充电器的体积 是最好的证明 对于隔离式开关电源
  • Linux内存管理之OOM Killer

    什么是OOM Killer OOM Killer是linux自带的一个程序 它的作用是在系统内存不足的时候启动 杀掉一些进程来保证系统继续运行 为什么需要OOM Killer 这里就需要介绍一个Linux里非常重要的概念了 overcomm
  • 2015年1月16日星期五(12-1)

    终于进入最麻烦的地方了 高级纹理映射 在这里 变换和光照计算中将使用浮点数 光栅化函数用定点数 由于函数将会爆炸性地增加 所以一个个地进行 不使用Z缓存的新光栅化函数 将固定或恒定着色的多边形绘制到屏幕上 首先排序三角形再绘制 void d
  • 用Unity3D和VuforiaSDK简单做AR应用(实战)

    一 首先来到https developer vuforia com downloads sdk 这里有高通给予的很多开发包 当然也有很多的学习资源 接下来说重点 下载vuforia unity mobile android ios 4 2
  • HJ33 整数与IP地址间的转换

    Powered by NEFU AB IN Link 文章目录 HJ33 整数与IP地址间的转换 题意 思路 代码 HJ33 整数与IP地址间的转换 题意 原理 ip地址的每段可以看成是一个0 255的整数 把每段拆分成一个二进制形式组合起
  • JAVA:@Builder注解深层特性(笔记)

    JAVA 记录 Builder的特性 Builder原理 在构造方法A上引用时 相当于建造一个构造器G 构造器G只可以构造A方法参数列表里的字段 在类上引用时 相当于给这个类一个全参构造方法 然后给这个全参构造方法加上 Builder注解
  • Docker Compose 配置文件 docker-compose.yml 详解

    Docker Compose配置文件是Docker Compose的核心 用于定义服务 网络和数据卷 格式为YAML 默认路径为 docker compose yml 可以使用 yml或 yaml扩展名 目前Compose配置文件格式的最新
  • Conformal lec learning7: abort points

    在conformal lec 检查等价性的过程中 遇到abort points 是比较头疼的 可以通过以下方式避免
  • 使用split.js库实现网页布局分割

    前言 在开发网页应用程序时 经常需要将页面的布局分割成多个区域 使得用户可以同时查看不同的内容 split js是一个简单易用的JavaScript库 可以帮助我们实现灵活的网页布局分割 以及可拖动和调整大小的分割器 引入split js库
  • Java与Scala的转换

    一 java Map 转为 scala collection immutable Map public static
  • PyQt5,PyQt-tools安装与Qt designer,pyuic,qrcToPy的配置

    一 PyQt5 PyQt tools的安装 PyQt5的安装 可以在pycharm里安装PyQt5 PyQt tools和PyQt Designer库 或者在命令行里用pip命令安装 安装完成测试一下 from PyQt5 Qt impor
  • 坚持了139天,剪辑视频拿到12w,手把手教会你如何去操作

    如果你能熬得了夜 吃得了苦 大家也可以来跟我一起做视频剪辑 把我的方法拿去认真操作 相信你也可以做到 也想要通过做自媒体赚取一份收入 却没有方向的小伙伴们可以给大周点赞并扣 8 大周会把整理好的新手指南分享给你们 接下来就分享具体的操作方法
  • sql查看和更新某个表的某个字段

    学了一点sql新知识 给某个表的某个字段添加一个新的值 查看表里某个字段的值 SELECT FROM TableFields WHERE TableFieldID 表名 字段名 更新字段的存储 UPDATE TableFields SET
  • upf+vcs仿真

    要做upf vcs的联合仿真的话 首先需要写好upf文件 其中有两个方面 1 需要修改makefile 1 tb文件改为 sv模式 2 在makefile中注意修改了 sv需要在加上 sverilog 3 加上 vcs upf lt 路径
  • FIND_IN_SET

    FIND IN SET str strlist str 要查询的字符串 strlist 字段名 参数以 分隔 如 1 2 6 8 查询字段 strlist 中包含 str 的结果 返回结果为null或记录 假如字符串str在由N个子链组成的
  • 【NLP】3 种强大的长文本摘要方法和实例

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • Python 全栈系列220 Tornado的服务搭建

    说明 想法变的真快 本来是没打算用Tornado的 主要是想节约时间 但是现在看来不用还是不行 目前用gevent flask部署的时候 启动多核的worker似乎存在问题 另外 有很多内部基础的数据服务 其实并不需要flask的各种组件
  • stata解决内生性问题--样本选择

    目录 简单介绍 1 内生性 2 为什么要解决内生性问题 3 内生性问题产生的原因 4 例子 代码 简洁版 代码 详细分析版 结果 简单介绍 1 内生性 x与误差项有相关关系 2 为什么要解决内生性问题 内生性会破坏参数估计的 一致性 参数估
  • 沁恒ch32V208处理器开发(四)串口通信

    目录 串口资源 资源配置 同步模式 单线半双工模式 中断 DMA 串口的初始化 串口通信的实现 串口资源 资源配置 CH32V208 系列 是基于 RISC V 指令架构设计的 32 位 RISC 内核 MCU 根据封装的不同 可用的USA