小米手机如何做游戏视频网站,开发公司财务管理制度,班级网页设计模板html代码,阿里巴巴网站分类板块做全屏目录 串口资源资源配置同步模式单线半双工模式中断DMA 串口的初始化串口通信的实现 串口资源
资源配置
CH32V208 系列#xff0c;是基于 RISC-V 指令架构设计的 32 位 RISC 内核 MCU#xff0c;根据封装的不同#xff0c;可用的USART串口资源如下表所示#xff1a;
且US… 目录 串口资源资源配置同步模式单线半双工模式中断DMA 串口的初始化串口通信的实现 串口资源
资源配置
CH32V208 系列是基于 RISC-V 指令架构设计的 32 位 RISC 内核 MCU根据封装的不同可用的USART串口资源如下表所示
且USART具有如下主要特征 1全双工或半双工的同步或异步通信 2 支持分数波特率发生器最高 9Mbps 3可编程数据长度、停止位长度 4支持 LINIrDA 编码器智能卡 5支持 DMA 6支持多种中断
其内部模块图实现如下
同步模式
和其他单片机不同的是ch32V208处理器的USART还支持同步模式就是说系统在使用 USART 模块时可以输出时钟信号。在开启同步模式对外发送数据时CK引脚会同时对外输出时钟。 要开启同步模式只需要对控制寄存器 2R16_USARTx_CTLR2的 CLKEN 位置位即可但有两点注意 1开启同步模式同时需要关闭LIN 模式、智能卡模式、红外模式和半双工模式即保证 SCEN、HDSEL 和 IREN 位处于复位状态这三位在控制寄存器 R16_USARTx_CTLR3中。 2USART 模块同步模式只工作在主模式即 CK 引脚只输出时钟不接收输入 只在 TX 引脚输出数据时输出时钟信号
单线半双工模式
半双工模式支持使用单个引脚只使用 TX 引脚来接收和发送TX 引脚和 RX 引脚在芯片内部连接。 开启半双工模式的方式是对控制寄存器 3R16_USARTx_CTLR3的 HDSEL 位置位但同时需要关闭 LIN 模式、智能卡模式、红外模式和同步模式即保证 SCEN、CLKEN 和 IREN 位处于复位状态这三位在控制寄存器 2 和 3R16_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---USART2TxSize1为发送个数 */{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的接收缓冲区}