[单片机芯片] 沁恒MCU CH32V103串口通信应用及代码实现

[复制链接]
 楼主| 万图 发表于 2024-10-4 14:43 | 显示全部楼层 |阅读模式
最近我在项目中使用了沁恒的CH32V103 MCU,主要任务是实现一个简单的串口通信功能,用于与PC进行数据传输。为了让这个过程更加稳定,我选择了中断方式来接收数据,并在发送时加入了回显功能。以下是我的代码实现,分享出来供大家参考。

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

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

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

  4. char rxBuffer[RX_BUFFER_SIZE];  // 接收数据缓冲区
  5. volatile uint8_t rxIndex = 0;   // 当前接收数据的索引

  6. void USART1_Init(void)
  7. {
  8.     GPIO_InitTypeDef GPIO_InitStructure;
  9.     USART_InitTypeDef USART_InitStructure;

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

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

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

  20.     // 初始化USART1
  21.     USART_InitStructure.USART_BaudRate = 115200;
  22.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  23.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
  24.     USART_InitStructure.USART_Parity = USART_Parity_No;
  25.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  26.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  27.     USART_Init(USART1, &USART_InitStructure);

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

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

  32. void USART1_IRQHandler(void)
  33. {
  34.     if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  35.     {
  36.         char received = USART_ReceiveData(USART1);  // 读取接收到的数据
  37.         if (rxIndex < RX_BUFFER_SIZE - 1)
  38.         {
  39.             rxBuffer[rxIndex++] = received;  // 保存数据到缓冲区
  40.         }
  41.         // 回显收到的数据
  42.         USART_SendData(USART1, received);
  43.         while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  // 等待发送完成
  44.     }
  45. }

  46. int main(void)
  47. {
  48.     USART1_Init();  // 初始化串口1

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

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

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

Giory 发表于 2025-7-1 11:41 | 显示全部楼层
你好。为啥我配置好了进不去中断

评论

中断函数注意加中断声明  发表于 2025-7-1 14:33
闪烁阴影 发表于 2025-7-8 10:28 | 显示全部楼层
Giory 发表于 2025-7-1 11:41
你好。为啥我配置好了进不去中断

中断设置好了也要开启,开启才能进中断
您需要登录后才可以回帖 登录 | 注册

本版积分规则

152

主题

5815

帖子

1

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

152

主题

5815

帖子

1

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