[视频教程] 基于芯圣XS32F103C8T6的串口通信及应用

[复制链接]
 楼主| 公羊子丹 发表于 2024-10-10 07:50 | 显示全部楼层 |阅读模式
芯圣(Chipsea)推出的XS32系列微控制器,具有性能优异、功耗低等特点,非常适合物联网、智能家居、工业控制等嵌入式应用。其中,XS32F103C8T6是一款基于 ARM Cortex-M3 内核的32位 MCU,拥有高达72MHz 的主频、64KB 的 Flash 和 20KB 的 SRAM,并且带有丰富的外设,包括串口(USART)、I2C、SPI 等。
本文将重点介绍如何在 XS32F103C8T6 上实现串口通信功能,并通过示例代码展示如何进行串口数据的收发操作。串口通信是嵌入式系统中非常重要的功能,广泛应用于设备间的数据传输、调试等场景。

1. 硬件准备
  • XS32F103C8T6 开发板
  • USB 转串口模块(用于连接电脑)
  • 电源、跳线

2. 软件工具
  • Keil MDK(用于编写和编译代码)
  • XS32F1xx 标准外设库
  • 串口调试工具(如 SecureCRT 或者串口助手)

3. 串口通信原理简介串口(UART)是一种简单、有效的数据传输方式,通过 TX(发送端)和 RX(接收端)两条线实现数据的双向通信。UART 使用异步通信方式,传输过程中无需额外的时钟信号,适用于长距离、低速率的数据传输。在嵌入式开发中,串口通常用于与电脑进行调试数据的交互,或者用于设备间的通信。

4. XS32F103C8T6 的串口配置XS32F103C8T6 拥有多个串口接口,本例中我们使用 USART1 进行通信,串口波特率设定为 115200,数据位为 8 位,停止位为 1 位,无校验位。接下来的代码将展示如何初始化串口并实现数据的收发。

5. 实现代码
  1. #include "XS32F1xx.h"  // 芯圣标准外设库头文件

  2. // 串口初始化函数,配置 USART1
  3. void USART1_Init(uint32_t baudrate) {
  4.     // 使能 USART1 和 GPIOA 的时钟
  5.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

  6.     // 配置 GPIOA 9 和 GPIOA 10 分别为 USART1_TX 和 USART1_RX
  7.     GPIO_InitTypeDef GPIO_InitStructure;
  8.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;  // PA9 作为 TX 引脚
  9.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  10.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  11.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  12.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;  // PA10 作为 RX 引脚
  13.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  14.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  15.     // 初始化 USART1
  16.     USART_InitTypeDef USART_InitStructure;
  17.     USART_InitStructure.USART_BaudRate = baudrate;  // 设置波特率
  18.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;  // 8位数据位
  19.     USART_InitStructure.USART_StopBits = USART_StopBits_1;  // 1个停止位
  20.     USART_InitStructure.USART_Parity = USART_Parity_No;  // 无校验位
  21.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  // 无硬件流控制
  22.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  // 开启接收和发送功能
  23.     USART_Init(USART1, &USART_InitStructure);

  24.     // 启用 USART1
  25.     USART_Cmd(USART1, ENABLE);
  26. }

  27. // 串口发送函数
  28. void USART1_SendChar(char ch) {
  29.     while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  // 等待发送数据寄存器为空
  30.     USART_SendData(USART1, (uint16_t)ch);
  31.     while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);  // 等待传输完成
  32. }

  33. // 串口接收函数
  34. char USART1_ReceiveChar(void) {
  35.     while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);  // 等待接收到数据
  36.     return (char)USART_ReceiveData(USART1);
  37. }

  38. int main(void) {
  39.     // 初始化串口
  40.     USART1_Init(115200);

  41.     // 发送和接收数据示例
  42.     while (1) {
  43.         // 从串口接收一个字符
  44.         char receivedChar = USART1_ReceiveChar();

  45.         // 将接收到的字符通过串口发送回去
  46.         USART1_SendChar(receivedChar);
  47.     }
  48. }

代码解析
  • USART1_Init 函数:此函数负责配置并初始化 USART1。通过设置波特率、数据位、停止位等参数,串口可以进行数据传输。TX 引脚配置为推挽复用输出,RX 引脚配置为浮空输入。
  • USART1_SendChar 函数:用于将单个字符发送至串口。它首先等待发送数据寄存器为空,然后将字符写入寄存器,最后等待传输完成。
  • USART1_ReceiveChar 函数:用于从串口接收单个字符。它通过等待接收标志位被置位,确认接收到数据后,将数据读取出来。
  • 主函数:主循环中,MCU 不断接收并返回从串口收到的数据,实现基本的回显功能。这是串口通信中常见的测试方法。


6. 应用场景
  • 调试输出:串口是嵌入式开发中非常常见的调试工具。通过串口输出调试信息,可以帮助开发者快速定位程序问题。
  • 数据传输:在嵌入式设备中,串口可以用于设备与设备之间的数据通信。例如,一个传感器节点可以通过串口将数据发送到中央控制单元。
  • 固件更新:某些设备的固件更新可以通过串口进行,串口通信的可靠性使得它成为固件更新的理想选择。

7. 项目总结本文介绍了如何在芯圣 XS32F103C8T6 上实现串口通信,包括串口初始化、数据收发等操作。通过简单的回显功能,开发者可以快速测试并验证串口的功能。XS32F103C8T6 提供了强大的外设资源,能够轻松应对各种嵌入式通信需求。串口作为最常见的通信方式之一,其简单有效的特点使其在开发调试中必不可少。


周半梅 发表于 2024-10-10 07:50 | 显示全部楼层
这篇文章正好解决了我的串口调试问题,感谢!
帛灿灿 发表于 2024-10-10 07:50 | 显示全部楼层
我用的是 XS32F103C8T6,代码可以直接用,非常方便。
童雨竹 发表于 2024-10-10 07:50 | 显示全部楼层
可不可以加上中断方式接收串口数据的例子?
万图 发表于 2024-10-10 07:51 | 显示全部楼层
我看代码里是设置 115200 的波特率,可以调整成 9600 吗?
Wordsworth 发表于 2024-10-10 07:51 | 显示全部楼层
串口回显功能调试时太实用了,没想到这么简单就能实现。
Pulitzer 发表于 2024-10-10 07:51 | 显示全部楼层
用 Keil 配合芯圣的开发板真的很顺手,推荐给大家。
Bblythe 发表于 2024-10-10 07:51 | 显示全部楼层
这段代码运行起来很顺畅,就是初学者也能快速上手。
Uriah 发表于 2024-10-10 07:52 | 显示全部楼层
请问如果我要用两个串口通信,如何修改代码?
Clyde011 发表于 2024-10-10 07:52 | 显示全部楼层
代码结构很清晰,特别是 GPIO 和串口初始化部分,看了就懂。
suncat0504 发表于 2024-10-29 12:20 | 显示全部楼层
主频挺高啊。能替换ST的103不?看型号后面的字母数字,好像一样。
地瓜patch 发表于 2024-10-29 16:39 来自手机 | 显示全部楼层
串口稳定运行最大波特率能到多少
您需要登录后才可以回帖 登录 | 注册

本版积分规则

182

主题

6177

帖子

3

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

182

主题

6177

帖子

3

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