打印
[CW32F030系列]

CW32单片机UART基本数据收发功能介绍

[复制链接]
921|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cr315|  楼主 | 2023-6-8 13:54 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 cr315 于 2023-6-8 14:03 编辑

通用异步收发器(Universal Asynchronous Receiver/Transmitter:UART),是一种通用串行数据总线,常用于系统内各子模块间的数据交换。
以CW32L083为例,CW32L083 内部集成 6 个通用异步收发器 (UART),支持异步全双工、同步半双工和单线半双工模式,支持硬件数据流控和多机通信;可编程数据帧结构,可以通过小数波特率发生器提供宽范围的波特率选择。UART 控制器工作在双时钟域下,允许在深度休眠模式下进行数据的接收,接收完成中断可以唤醒 MCU 回到运行模式。
一、主要功能
• 支持双时钟域驱动:配置时钟 PCLK;传输时钟 UCLK。
• 可编程数据帧结构:数据字长:8、9 位,LSB 在前;校验位:无校验、奇校验、偶校验;停止位长度:1、1.5、2 位 。
• 16 位整数、4 位小数波特率发生器 。
• 支持异步全双工、同步半双工、单线半双工 。
• 支持硬件流控 RTS、CTS。
• 支持直接内存访问 (DMA) 。
• 支持多机通信,自动地址识别 。
• 6 个带中断标志的中断源 。
• 错误检测:奇偶校验错误、帧结构错误 。
• 低功耗模式下收发数据,中断唤醒 MCU。
1.功能框图
UART 控制器挂载到 APB 总线上,配置时钟域 PCLK,固定为 APB 总线时钟 PCLK,用于寄存器配置逻辑工作;传输时钟域 UCLK,用于数据收发逻辑工作,其来源可选择 PCLK 时钟、外部低速时钟(LSE)以及内部低速时钟 (LSI)。双时钟域的设计更便于波特率的设置,支持从深度休眠模式下唤醒控制器。

2.UART中断
UART 控制器支持 6 个中断源,当 UART 中断触发事件发生时,中断标志位会被硬件置位,如果设置了对应的中断使能控制位,将产生中断请求。CW32L083 的一个 UART 模块使用一个系统 UART 中断,UART 中断是否产生中断跳转由嵌套向量中断控 制器 (NVIC) 的中断使能设置寄存器 NVIC_ISER 的相应位控制。系统 UART 中断示意图如下图所示:

在用户 UART 中断服务程序中,应查询相关 UART 中断标志位,以进行相应的处理,在退出中断服务程序之前, 要清除该中断标志位,避免重复进入中断程序。各 UART 中断源的标志位、中断使能位、中断标志清除位或清除方法,如下表所示:

使用特权

评论回复
沙发
cr315|  楼主 | 2023-6-8 14:06 | 只看该作者
3.CH340介绍
CH340是一个USB总线的转接芯片,实现USB协议和UART协议的自动转换。

RTS#:MODEM联络输出信号,请求发送
UD+:直接连接USB总线的D+数据线
UD-:直接连接USB总线的D-数据线
V3:在3.3V电源电压时链接VCC输入外部电源,在5V电源电压时外接容量为100nF的退耦电容。
VCC:正电源输入端,需要接100nF电源退耦电容
TXD:串行电路输出
RXD:串行数据输入,内置可控上拉和下拉电阻
CH340内置了独立的收发缓冲区,支持单工、半双工或者全双工异步串行通讯。串行数据包括1个低电平起始位、5、6、7或8个数据位、1个或2个高电平停止位,支持奇校验/偶校验/标志校验/空白校验。CH340支持常用通讯波特率:50、75、100、110、134.5、150、300、600、900、1200、1800、2400、3600、4800、9600、14400、19200、28800、33600、38400、56000、57600、76800、115200、128000、153600、230400、460800、921600、1500000、2000000等。串口发送信号的波特率误差小于0.3%,串口接收信号的允许波特率误差不小于2%。

使用特权

评论回复
板凳
cr315|  楼主 | 2023-6-8 14:08 | 只看该作者
二、实例演示
本实例采用CW32L083V8T6的StartKit单板,MCU的串口引脚(PA08/ PA09)和CH340对接,CH340通过USB接口和PC机对接,实现PC机软件和MCU通过UART双向通信功能。
单板启动后,处于等待数据接收状态,当有数据接收到后,产生UART接收中断,在中断中读取接收到的数据,然后将数据通过UART再发送回来,并清除中断标志位,然后等待接收下一个数据。
1.配置RCC系统时钟
void RCC_Configuration(void)
{
//SYSCLK = HSI = 8MHz = HCLK = PCLKRCC_HSI_Enable(RCC_HSIOSC_DIV6);//外设时钟使能RCC_AHBPeriphClk_Enable(DEBUG_UART_GPIO_CLK, ENABLE);DEBUG_UART_APBClkENx(DEBUG_UART_CLK, ENABLE);
}
2.GPIO配置
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};//UART TX RX 复用DEBUG_UART_AFTX;DEBUG_UART_AFRX;GPIO_InitStructure.Pins = DEBUG_UART_TX_GPIO_PIN;GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;GPIO_Init(DEBUG_UART_TX_GPIO_PORT, &GPIO_InitStructure);GPIO_InitStructure.Pins = DEBUG_UART_RX_GPIO_PIN;GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP;GPIO_Init(DEBUG_UART_RX_GPIO_PORT, &GPIO_InitStructure);
}
3.UART配置
void UART_Configuration(void)
{
UART_InitTypeDef UART_InitStructure = {0};UART_InitStructure.UART_BaudRate = DEBUG_UART_BaudRate;UART_InitStructure.UART_Over = UART_Over_16;UART_InitStructure.UART_Source = UART_Source_PCLK;UART_InitStructure.UART_UclkFreq = DEBUG_UART_UclkFreq;UART_InitStructure.UART_StartBit = UART_StartBit_FE;UART_InitStructure.UART_StopBits = UART_StopBits_1;UART_InitStructure.UART_Parity = UART_Parity_No ;UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;UART_InitStructure.UART_Mode = UART_Mode_Rx | UART_Mode_Tx;UART_Init(DEBUG_UARTx, &UART_InitStructure);
}
4.配置NVIC
void NVIC_Configuration(void)
{
//优先级,无优先级分组NVIC_SetPriority(DEBUG_UART_IRQ, 0);//UARTx中断使能NVIC_EnableIRQ(DEBUG_UART_IRQ);
}
5.中断函数处理UART2/UART5
void UART2_UART5_IRQHandler(void)
{
/* USER CODE BEGIN */uint8_t TxRxBuffer;if(UART_GetITStatus(CW_UART5 UART_IT_RC) != RESET)// 获取UARTx中断标志位{    TxRxBuffer = UART_ReceiveData_8bit(CW_UART5;// 通过UARTx接收一个数据(8bit)    UART_SendData_8bit(CW_UART5 TxRxBuffer);// 通过UARTx发送一个数据(8bit)    UART_ClearITPendingBit(CW_UART5 UART_IT_RC);// 清除UARTx中断标志位}/* USER CODE END */
}
6.定义常量define
//UARTx
#define DEBUG_UARTx CW_UART5
#define DEBUG_UART_CLK RCC_APB1_PERIPH_UART5
#define DEBUG_UART_APBClkENx RCC_APBPeriphClk_Enable1
#define DEBUG_UART_BaudRate 9600
#define DEBUG_UART_UclkFreq 8000000
//UARTx GPIO
#define DEBUG_UART_GPIO_CLK RCC_AHB_PERIPH_GPIOB
#define DEBUG_UART_TX_GPIO_PORT CW_GPIOB
#define DEBUG_UART_TX_GPIO_PIN GPIO_PIN_8
#define DEBUG_UART_RX_GPIO_PORT CW_GPIOB
#define DEBUG_UART_RX_GPIO_PIN GPIO_PIN_9
//GPIO AF
#define DEBUG_UART_AFTX PB08_AFx_UART5TXD()
#define DEBUG_UART_AFRX PB09_AFx_UART5RXD()
//中断
#define DEBUG_UART_IRQ UART2_UART5_IRQn
7.UART中断方式接收数据
int32_t main(void)
{
//配置RCCRCC_Configuration();//配置GPIOGPIO_Configuration();//配置UARTUART_Configuration();//配置NVICNVIC_Configuration();//使能UARTx RC中断UART_ITConfig(DEBUG_UARTx, UART_IT_RC, ENABLE);UART_SendString(DEBUG_UARTx, "\r\nCW32L083 UART Interrupt\r\n");while(1){    //中断收发}
}
8、测试结果如下:当MCU收到上位机发送的数据后,再回传到上位机,UART功能正常。


使用特权

评论回复
地板
deliahouse887| | 2023-6-10 13:57 | 只看该作者
需要考虑其他因素,如数据缓冲区的大小、中断处理函数的编写等。

使用特权

评论回复
5
phoenixwhite| | 2023-6-10 15:51 | 只看该作者
UART串口通信如何实现连续发送和接收两个8位数据

使用特权

评论回复
6
belindagraham| | 2023-6-10 16:00 | 只看该作者
单片机UART串口通信是一种基本的通信方式,它可以实现单片机与外部设备(如电脑、传感器等)之间的数据收发功能。

使用特权

评论回复
7
ingramward| | 2023-6-10 16:48 | 只看该作者
单片机怎么让一个串口同时收发数据

使用特权

评论回复
8
mickit| | 2023-6-10 17:07 | 只看该作者
详解UART通信协议?              

使用特权

评论回复
9
nomomy| | 2023-6-10 17:19 | 只看该作者
单片机UART基本数据收发功能的实现需要进行UART模块初始化、发送数据和接收数据等操作。

使用特权

评论回复
10
cashrwood| | 2023-6-10 17:25 | 只看该作者
通过合理设置参数和进行相应的优化和调整,可以实现高效稳定的串行通信。

使用特权

评论回复
11
houjiakai| | 2023-6-10 17:47 | 只看该作者
在进行UART通信时,需要确保单片机和外部设备的波特率、数据位、校验位和停止位等参数设置相同,否则将会导致数据传输错误和通讯失败。

使用特权

评论回复
12
OKAKAKO| | 2023-6-11 21:27 | 只看该作者
目前串口通信依然是比较常用的单片机通信方式,UART传输速率也较之前有提升

使用特权

评论回复
13
lzbf| | 2023-6-13 20:34 | 只看该作者
相应的寄存器会发生什么变化?              

使用特权

评论回复
14
LOVEEVER| | 2023-6-14 13:34 | 只看该作者
总线双向通信,可以实现全双工传输和接收

使用特权

评论回复
15
tpgf| | 2023-7-5 11:49 | 只看该作者
我可以使用两个来实现自己的收发数据呢

使用特权

评论回复
16
zljiu| | 2023-7-5 13:19 | 只看该作者
在串口通讯中,自动地址识别是什么意思呢

使用特权

评论回复
17
pssyx| | 2023-7-5 13:41 | 只看该作者
zljiu 发表于 2023-7-5 13:19
在串口通讯中,自动地址识别是什么意思呢

自动地址识别功能应用于多机通信。CW32 MCU的UART 支持多机通信方式。在该模式下,UART 总线上有一个主机和多台从机,每个从机有唯一的从机地址,通信时主机会先发送地址帧对从机寻址,只有地址匹配的从机才被激活,接收随后主机发送的数据帧。更详细说明,请参阅CW32 MCU的用户手册。

使用特权

评论回复
18
gwsan| | 2023-7-5 13:41 | 只看该作者
我们如何判定一个不定长数据是否发送完成呢

使用特权

评论回复
19
tfqi| | 2023-7-5 14:03 | 只看该作者
串口协议 每一包都有自己的头和尾而不需要人为添加是吗

使用特权

评论回复
20
nawu| | 2023-7-5 19:11 | 只看该作者
这六个串口之间有没有引脚冲突的情况呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1320

主题

3786

帖子

0

粉丝