公羊子丹 发表于 2024-10-10 07:50

基于芯圣XS32F103C8T6的串口通信及应用

芯圣(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. 实现代码#include "XS32F1xx.h"// 芯圣标准外设库头文件

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

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

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

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

    // 启用 USART1
    USART_Cmd(USART1, ENABLE);
}

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

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

int main(void) {
    // 初始化串口
    USART1_Init(115200);

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

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

代码解析
[*]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

串口稳定运行最大波特率能到多少
页: [1]
查看完整版本: 基于芯圣XS32F103C8T6的串口通信及应用