[开发板] CW32L0开发板学习记录三:板载串口2学习过程

[复制链接]
 楼主| 聪聪哥哥 发表于 2024-12-7 15:13 | 显示全部楼层 |阅读模式
今天和大家分享一下CW32L010的串口输出功能:
CW32L010 内部集成2个通用异步收发器(UART),支持异步全双工、同步半双工和单线半双工模式,支持硬件数据流控和多机通信,还支持 LIN(局域互连网络);可编程数据帧结构,可以通过小数波特率发生器提供宽范围的波特率选择:内置定时器模块,支持等待超时检测、接收空闲检测、自动波特率检测和通用定时功能。
UART 控制器工作在双时钟域下,允许在深度休眠模式下进行数据的接收,接收完成中断可以唤醒 MCU 回到运行模式。
注意:
仅 UART1 支持 LIN 和定时器功能:UART2 可通过片内外设互联与 BTIM/GTIM/ATIM 的从模式协同工作实现超时定时器相关功能。

CW32串口的主要特征:
主要特性
支持双时钟域驱动
-配置时钟 PCLK
- 传输时钟 UCLK
可编程数据帧结构:
-数据字长:8、9位,LSB/MSB 在前
- 校验位:无校验、奇校验、偶校验
-停止位长度:1、1.5、2 位
16 位整数、4 位小数波特率发生器
支持异步全双工、同步半双工、单线半双工
单独的发送器和接收器使能位
单独的发送和接收信号极性控制
TXD/RXD 引脚配置可交换
支持 LoopBack 模式
支持接收数据匹配检测
间隔段帧和空闲字符发送和接收功能
硬件流控 RTS、CTS 和 RS485 驱动器使能
发送缓冲器空/接收数据完成触发启动 ADC
支持多机通信,自动地址识别
13 个带中断标志的中断源
自动波特率检测模式 1/2
等待超时检测/接收空闲检测
内置定时器模块支持通用定时器功能
错误检测:奇偶校验错误、帧结构错误、溢出错误、噪声错误
低功耗模式下收发数据,中断唤醒 MCU
支持与工作电压低于 MCU 的器件通信(借助 VC)
LIN 主模式同步间隔段发送功能和 LIN 从模式同步间隔段检测功能:
-支持长度可配置的同步间隔段发送
- 支持 10/11 位同步间隔段的检测

三:查询方式发送数据
步骤 1:设置 SYSCTRL_AHBEN.GPIOx为1,SYSCTRL_APBENx.UARTx为1,使能 UART 引脚对应的 GPIO 时钟和 UART 配置时钟;
步骤 2:将 UARTx _TXD 引|脚配置成推挽复用输出模式,具体寄存器配置步骤请参见8通用输入输出端口(GPIO)章节;
步骤 3:设置 UARTX_CR1.SYNC为0,配置 UARTx为异步全双工通信模式;步骤 4:配置数据帧;
1.起始位判定方式:配置 UARTX CR1.START
2.数据字长:配置 UARTX CR1.CHLEN
3.校验位:配置 UARTX_CR1.PARITYEN 和 UARTX_CR1.PARITY
4.停止位:配置 UARTX CR1.STOP步骤 5:配置 UARTX_CR1.SOURCE,选择传输时钟源;步骤 6:配置 UARTX_CR1.OVER,选择采样模式;
步骤 7:配置 UARTx_BRRI 和 UARTx_BRRF 寄存器,配置波特率,具体配置请参见 16.3.3.2小数波特率发生器;
步骤 8:设置 UARTX CR1.TXEN 为1使能发送;
步骤 9:设置 UARTX ICRTC为0,清除发送完成标志位;
步骤 10:将要发送的一帧数据写入 UARTX_TDR 寄存器;
步骤 11:查询等待 UARTX ISR.TC 标志位置 1,确认一帧数据发送完成;
步骤 12:重复步骤 9 至步骤 12,发送下一帧数据。

四:开发板硬件设计:

五:软件设计
GPIO口初始化代码:
  1. void GPIO_Configuration(void)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStructure = {0};
  4.    
  5.     GPIO_WritePin(DEBUG_UART_TX_GPIO_PORT, DEBUG_UART_TX_GPIO_PIN,GPIO_Pin_SET);    // 设置TXD的默认电平为高,空闲

  6.     GPIO_InitStructure.Pins = DEBUG_UART_TX_GPIO_PIN;
  7.     GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
  8.     GPIO_Init(DEBUG_UART_TX_GPIO_PORT, &GPIO_InitStructure);

  9.     GPIO_InitStructure.Pins = DEBUG_UART_RX_GPIO_PIN;
  10.     GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP;
  11.     GPIO_Init(DEBUG_UART_RX_GPIO_PORT, &GPIO_InitStructure);

  12.      //UART TX RX 复用
  13.     DEBUG_UART_AFTX;
  14.     DEBUG_UART_AFRX;
  15. }

串口初始化:
  1. void UART_Configuration(void)
  2. {
  3.     UART_InitTypeDef UART_InitStructure = {0};

  4.     UART_InitStructure.UART_BaudRate = DEBUG_UART_BaudRate;
  5.     UART_InitStructure.UART_Over = UART_Over_16;
  6.     UART_InitStructure.UART_Source = UART_Source_PCLK;
  7.     UART_InitStructure.UART_UclkFreq = DEBUG_UART_UclkFreq;
  8.     UART_InitStructure.UART_StartBit = UART_StartBit_FE;
  9.     UART_InitStructure.UART_StopBits = UART_StopBits_1;
  10.     UART_InitStructure.UART_Parity = UART_Parity_No ;
  11.     UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;
  12.     UART_InitStructure.UART_Mode = UART_Mode_Rx | UART_Mode_Tx;
  13.     UART_Init(DEBUG_UARTx, &UART_InitStructure);
  14. }
复用串口功能
  1. /**
  2. * [url=home.php?mod=space&uid=247401]@brief[/url] Retargets the C library printf function to the UART.
  3. *
  4. */
  5. PUTCHAR_PROTOTYPE
  6. {
  7.     UART_SendData_8bit(DEBUG_UARTx, (uint8_t)ch);

  8.     while (UART_GetFlagStatus(DEBUG_UARTx, UART_FLAG_TXE) == RESET);

  9.     return ch;
  10. }
主程序代码:
  1.     while(1)
  2.     {
  3.     printf("\r\nCW32L010 UART 21 IC CE PING HUO DONG \r\n");
  4.                 Delay(0X7FFF);
  5.     }
测试图片:

AdaMaYun 发表于 2024-12-10 08:27 | 显示全部楼层
UART 控制器工作在双时钟域下,允许在深度休眠模式下进行数据的接收,接收完成中断可以唤醒 MCU 回到运行模式。
LOVEEVER 发表于 2024-12-12 09:13 | 显示全部楼层
UART1 支持 LIN 和定时器功能
gongqijuns 发表于 2025-2-17 15:42 | 显示全部楼层
这种1.5位的停止位一般是什么应用场景?
eleg34ance 发表于 2025-2-17 16:55 | 显示全部楼层
CW比较有优势的就是低功耗的串口了
一切D都好 发表于 2025-2-17 18:01 | 显示全部楼层
其实挺期待楼主使用低功耗串口来搞的
ewyu 发表于 2025-2-17 19:10 | 显示全部楼层
我觉得串口挺好用,尤其是CW的串口例程,很全面的
pe66ak 发表于 2025-2-17 20:22 | 显示全部楼层
芯源的串口是有空闲中断的吧
wamed 发表于 2025-2-17 21:33 | 显示全部楼层
我之前用过芯源的MCU,挺好,很多IO都可以复用,让电路设计十分简单
yuliangren 发表于 2025-2-17 23:28 | 显示全部楼层
支持 10/11 位同步间隔段的检测这个咋玩?
星星点点didi 发表于 2025-2-18 08:42 | 显示全部楼层
写的不错,芯源的MCU的资料还是可以的,开发起来还不复杂
hight1light 发表于 2025-2-18 10:09 | 显示全部楼层
话说芯源的串口支持最大多少的波特率?
清芯芯清 发表于 2025-2-18 12:15 | 显示全部楼层
感觉这个芯片还行啊, 串口的功能都这么多
peterLaw 发表于 2025-2-18 16:10 | 显示全部楼层
pe66ak 发表于 2025-2-17 20:22
芯源的串口是有空闲中断的吧

芯源的串口是有空闲中断的
peterLaw 发表于 2025-2-18 16:11 | 显示全部楼层
非常不错的案例指导分享
星辰大海不退缩 发表于 2025-2-20 15:15 | 显示全部楼层
可编程数据帧结构具体应该如何使用
lxs0026 发表于 2025-2-28 15:16 | 显示全部楼层
通过这些独立的时钟域,串口可以更精确地控制通信速率,甚至在低功耗模式下维持数据传输。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

222

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

85

主题

222

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部