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

news/2024/7/7 18:35:55

目录

    • 串口资源
      • 资源配置
      • 同步模式
      • 单线半双工模式
      • 中断
      • 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的接收缓冲区
  }

http://lihuaxi.xjx100.cn/news/1461158.html

相关文章

Lnton羚通关于Optimization在【PyTorch】中的基础知识

OPTIMIZING MODEL PARAMETERS &#xff08;模型参数优化&#xff09; 现在我们有了模型和数据&#xff0c;是时候通过优化数据上的参数来训练了&#xff0c;验证和测试我们的模型。训练一个模型是一个迭代的过程&#xff0c;在每次迭代中&#xff0c;模型会对输出进行猜测&…

提示词4大经典框架;将AI融入动画工作流的案例和实践经验;构建基于LLM的系统和产品的模式;提示工程的艺术 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 高效提示词的4大经典框架&#xff1a;ICIO、CRISPE、BROKE、RASCEF ICIO 框架 Intruction (任务) &#xff1a;你希望AI去做的任务&am…

第13章——FreeRTOS队列

1.队列简介 队列是任务到任务、任务到中断、中断到任务数据交流的一种机制&#xff08;消息传递&#xff09; FreeRTOS基于队列&#xff0c; 实现了多种功能&#xff0c;其中包括队列集、互斥信号量、计数型信号量、二值信号量、 递归互斥信号量&#xff0c;因此很有必要深入了…

【深度学习-图像识别】使用fastai对Caltech101数据集进行图像多分类(50行以内的代码就可达到很高准确率)

文章目录 前言fastai介绍数据集介绍 一、环境准备二、数据集处理1.数据目录结构2.导入依赖项2.读入数据3.模型构建3.1 寻找合适的学习率3.2 模型调优 4.模型保存与应用 总结人工智能-图像识别 系列文章目录 前言 fastai介绍 fastai 是一个深度学习库&#xff0c;它为从业人员…

应用高分辨率 GAN 对扰动文档图像去扭曲的深度Python实践

1. 引言 随着技术的不断发展&#xff0c;图像处理在各种场景中的应用也变得越来越广泛。高分辨率 GAN (Generative Adversarial Network) 是近年来图像处理领域的热点技术&#xff0c;它能够生成极高分辨率的图像&#xff0c;与此同时&#xff0c;它也可以用于各种修复和增强任…

Redis中常见的缓存穿透、缓存击穿、缓存雪崩、缓存预热解决方案

文章目录 一、缓存穿透1. 什么是缓存穿透2. 解决方案2.1 无效的key存放到Redis2.2 引入布隆过滤器2.3 如何选择&#xff1a; 二、缓存击穿1. 什么是缓存击穿2. 解决方案 三、缓存雪崩1. 什么是缓存雪崩2. 解决方案2.1 均匀过期2.2 热点数据缓存永远不过期2.3 采取限流降级的策略…

使用IText导出复杂pdf

1、问题描述 需要将发票导出成pdf&#xff0c;要求每页都必须包含发票信息和表头行。 2、解决方法 使用IText工具实现PDF导出 IText8文档&#xff1a;Examples (itextpdf.com) 3、我的代码 引入Itext依赖&#xff0c;我这里用的是8.0.1版本 <dependency><groupId>…

Qt 编译使用Bit7z库接口调用7z.dll、7-Zip.dll解压压缩常用Zip、ISO9660、Wim、Esd、7z等格式文件(二)

修改qt5 7zip源码编译及使用(含展示进度)一文中的封装类ZlibHelper代码类&#xff0c;继承多线程&#xff0c;使解压&#xff0c;压缩时进度条不影响界面&#xff0c;同时添加压缩文件中的文件预览功能&#xff0c;建议直接看源码 导读 相关代码内容扩展预览内容时获取文件修改…