万图 发表于 2024-10-4 14:43

沁恒MCU CH32V103串口通信应用及代码实现

最近我在项目中使用了沁恒的CH32V103 MCU,主要任务是实现一个简单的串口通信功能,用于与PC进行数据传输。为了让这个过程更加稳定,我选择了中断方式来接收数据,并在发送时加入了回显功能。以下是我的代码实现,分享出来供大家参考。

串口通信功能描述:
[*]使用UART1作为通信接口,波特率设置为115200。
[*]接收数据后立即回显给PC,确保数据完整性。
[*]通过中断方式接收数据,避免使用轮询方式占用CPU资源。

代码实现:#include "ch32v10x.h"
#include <stdio.h>

#define RX_BUFFER_SIZE 128   // 接收缓冲区大小

char rxBuffer;// 接收数据缓冲区
volatile uint8_t rxIndex = 0;   // 当前接收数据的索引

void USART1_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);// 开启USART1和GPIOA时钟

    // 配置USART1的TX引脚
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;            // TX引脚
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      // 复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 配置USART1的RX引脚
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;         // RX引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;// 浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 初始化USART1
    USART_InitStructure.USART_BaudRate = 115200;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_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);

    USART_Cmd(USART1, ENABLE);// 使能USART1

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);// 开启接收中断
    NVIC_EnableIRQ(USART1_IRQn);   // 开启USART1中断
}

void USART1_IRQHandler(void)
{
    if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
      char received = USART_ReceiveData(USART1);// 读取接收到的数据
      if (rxIndex < RX_BUFFER_SIZE - 1)
      {
            rxBuffer = received;// 保存数据到缓冲区
      }
      // 回显收到的数据
      USART_SendData(USART1, received);
      while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);// 等待发送完成
    }
}

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

    while (1)
    {
      // 主循环可以处理其他任务,串口通信通过中断进行
    }
}

主要功能说明:
[*]USART1_Init函数:该函数用于初始化串口1,包括配置GPIO引脚,设置波特率等串口参数,并开启接收中断。
[*]USART1_IRQHandler函数:串口1的中断服务程序,当接收到数据时,进入中断,并将数据保存到接收缓冲区内,同时回显该数据给发送端。
[*]主函数main:在主循环中无需轮询接收数据,中断自动处理串口接收。程序可以执行其他任务,通信效率更高。

结语:这个简单的串口通信示例可以直接应用于基于沁恒CH32V103的项目,适合需要高效串口数据传输的场景。如果有任何疑问或改进建议,欢迎交流!

页: [1]
查看完整版本: 沁恒MCU CH32V103串口通信应用及代码实现