打印
[视频教程]

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

[复制链接]
3245|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
公羊子丹|  楼主 | 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. 实现代码
#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 | 只看该作者
可不可以加上中断方式接收串口数据的例子?

使用特权

评论回复
5
万图| | 2024-10-10 07:51 | 只看该作者
我看代码里是设置 115200 的波特率,可以调整成 9600 吗?

使用特权

评论回复
6
Wordsworth| | 2024-10-10 07:51 | 只看该作者
串口回显功能调试时太实用了,没想到这么简单就能实现。

使用特权

评论回复
7
Pulitzer| | 2024-10-10 07:51 | 只看该作者
用 Keil 配合芯圣的开发板真的很顺手,推荐给大家。

使用特权

评论回复
8
Bblythe| | 2024-10-10 07:51 | 只看该作者
这段代码运行起来很顺畅,就是初学者也能快速上手。

使用特权

评论回复
9
Uriah| | 2024-10-10 07:52 | 只看该作者
请问如果我要用两个串口通信,如何修改代码?

使用特权

评论回复
10
Clyde011| | 2024-10-10 07:52 | 只看该作者
代码结构很清晰,特别是 GPIO 和串口初始化部分,看了就懂。

使用特权

评论回复
11
suncat0504| | 2024-10-29 12:20 | 只看该作者
主频挺高啊。能替换ST的103不?看型号后面的字母数字,好像一样。

使用特权

评论回复
12
地瓜patch| | 2024-10-29 16:39 | 只看该作者
串口稳定运行最大波特率能到多少

使用特权

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

本版积分规则

69

主题

4118

帖子

1

粉丝