沁恒ch32V208处理器开发(四)串口通信
目录
- 串口资源
- 资源配置
- 同步模式
- 单线半双工模式
- 中断
- DMA
- 串口的初始化
- 串口通信的实现
串口资源
资源配置
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的接收缓冲区}
相关文章:
沁恒ch32V208处理器开发(四)串口通信
目录 串口资源资源配置同步模式单线半双工模式中断DMA 串口的初始化串口通信的实现 串口资源 资源配置 CH32V208 系列,是基于 RISC-V 指令架构设计的 32 位 RISC 内核 MCU,根据封装的不同,可用的USART串口资源如下表所示: 且US…...
【BASH】回顾与知识点梳理(十八)
【BASH】回顾与知识点梳理 十八 十八. 条件判断式18.1 利用 test 指令的测试功能文件类型判断文件权限侦测两个文件之间的比较两个整数之间的判定判定字符串的数据多重条件判定 18.2 利用判断符号 [ ]18.3 Shell script 的默认参数($0, $1...)shift:造成参数变量号码…...
linux 目录操作命令
目录操作命令 文件列表 ls命令文件列表 ls [选项] [参数]-------------------------------l 详细信息-L 紧接着符号性连接,列出它们指向的文件-a 所有文件,包含隐藏文件(以点号起始的文件)-A 与-a相同,但是不会列出来. 和 ..-c 根据创建时间排…...
React Dva项目小优化之redux-action
之前 我们讲过 models 接下啦 我们来给大家讲一个新的库 这个库的话 有最好 没有影响也不大 它主要是帮助我们处理 action的 我们直接在 GitHub 官网上搜索 redux-action 我们搜出来 第一个就是 从星数来看 还是非常优秀的 我们拉下来 找到这个Documentation 然后点击进去 进…...
Kotlin反射访问androidx.collection.LruCache类私有变量
Kotlin反射访问androidx.collection.LruCache类私有变量 androidx.collection.LruCache类中定义了一个名为map的LinkedHashMap,map存储了所有LruCache的数据,有时候需要遍历访问该LinkedHashMap,取出里面的值,但是LruCache代码实…...
高级进阶多线程——多任务处理、线程状态(生命周期)、三种创建多线程的方式
Java多线程 Java中的多线程是一个同时执行多个线程的进程。线程是一个轻量级的子进程,是最小的处理单元。多进程和多线程都用于实现多任务处理。 但是,一般使用多线程而不是多进程,这是因为线程使用共享内存区域。它们不分配单独的内存区域…...
【 K8S 】 Pod 进阶
目录 //资源限制官网示例:重启策略 //健康检查:又称为探针(Probe) //资源限制 当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和内存大小,以及其他类型的资源。 当为 Pod 中…...
众和转债,宏微转债,阳谷转债上市价格预测
众和转债 基本信息 转债名称:众和转债,评级:AA,发行规模:13.75亿元。 正股名称:新疆众和,今日收盘价:8.14元,转股价格:8.2元。 当前转股价值 转债面值 / 转股…...
MySQL~事务的四大特性和隔离级别
事务的四大特性 1.原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个…...
JMeter处理接口签名之BeanShell实现MD5加密
项目A需要给项目B提供一个接口,这个接口加密了,现在需要测试这个接口,需要怎么编写脚本呢?实现接口签名的方式有两种:BeanShell实现MD5加密和函数助手实现MD5加密,之前已经分享过了函数助手实现MD5加密&…...
【Golang】一文学完 Golang 基本语法
Golang 下载 安装包链接:https://share.weiyun.com/InsZoHHu IDE 下载:https://www.jetbrains.com/go/ 第一个 golang 程序 package mainimport "fmt"func main() {fmt.Println("hello golang") }每个可执行代码都必须包含 Pack…...
《Java-SE-第三十五章》之方法引用
前言 在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!” 博客主页:KC老衲爱尼姑的博客主页 博主的github,平常所写代码皆在于此 共勉:talk is cheap, show me the code 作者是爪哇岛的新手,水平很有限&…...
Effective Java笔记(33)优先考虑类型安全的异构容器
泛型最常用于集合,如 Set<E >和 Map<K ,V>,以及单个元素的容器 ,如 ThreadLocal<T>和 AtomicReference<T> 。 在所有这些用法中,它都充当被参数化了的容器 。 这样就限制每个容器…...
释放AI创作潜能:从大模型训练到高产力应用
文章目录 每日一句正能量前言什么是人工智能生成内容(AIGC)人工智能生成内容(AIGC)能做什么为什么要用人工智能生成内容(AIGC)创作成果用Java实现冒泡排序算法学生信息收集系统学生请假管理系统需求分析教务…...
Ajax 笔记(一)—— Ajax 入门
笔记目录 1. Ajax 入门1.1 Ajax 概念1.2 axios 使用1.2.1 URL1.2.2 URL 查询参数1.2.3 小案例-查询地区列表1.2.4 常用请求方法和数据提交1.2.5 错误处理 1.3 HTTP 协议1.3.1 请求报文1.3.2 响应报文 1.4 接口文档1.5 案例1.5.1 用户登录(主要业务)1.5.2…...
Android Studio跳过Haxm打开模拟器
由于公司权限限制无法安装Haxm,这个时候我们可以试试Arm相关的镜像去跳过Haxm运行模拟器。解决方案:安装API27以下的Arm Image. #ifdef __x86_64__if (sarch "arm64" && apiLevel >28) {APANIC("Avds CPU Architecture %s i…...
从一个GPU到多个GPU
在多GPU运行应用程序时,需要正确设计GPU之间的通信,GPU间数据传输的效率取决于GPU是如何连接在一个节点上并跨集群的 在多GPU系统里有两种连接方式 多GPU通过单个节点连接到PCIe总线上 多GPU连接到集群中的网络交换机上 /* * 本示例演示了如何使用 Open…...
小白编写一个Chrome
步骤 1:了解插件的基本结构和功能 首先,向小白解释什么是Chrome插件,它是如何工作的,以及它可以做什么。强调插件可以修改网页内容、添加功能等。 步骤 2:准备工作 安装Chrome浏览器:确保小白的计算机上…...
自然语言处理学习笔记(六)————字典树
目录 1.字典树 (1)为什么引入字典树 (2)字典树定义 (3)字典树的节点实现 (4)字典树的增删改查 DFA(确定有穷自动机) (5)优化 1.…...
WPF实战项目十一(API篇):待办事项功能api接口
1、新建ToDoController.cs继承基础控制器BaseApiController,但是一般业务代码不写在控制器内,业务代码写在Service,先新建统一返回值格式ApiResponse.cs: public class ApiResponse{public ApiResponse(bool status, string mess…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
GeoServer发布PostgreSQL图层后WFS查询无主键字段
在使用 GeoServer(版本 2.22.2) 发布 PostgreSQL(PostGIS)中的表为地图服务时,常常会遇到一个小问题: WFS 查询中,主键字段(如 id)莫名其妙地消失了! 即使你在…...
