最近我在项目中使用了沁恒的CH32V103 MCU,主要任务是实现一个简单的串口通信功能,用于与PC进行数据传输。为了让这个过程更加稳定,我选择了中断方式来接收数据,并在发送时加入了回显功能。以下是我的代码实现,分享出来供大家参考。
串口通信功能描述:- 使用UART1作为通信接口,波特率设置为115200。
- 接收数据后立即回显给PC,确保数据完整性。
- 通过中断方式接收数据,避免使用轮询方式占用CPU资源。
代码实现:- #include "ch32v10x.h"
- #include <stdio.h>
- #define RX_BUFFER_SIZE 128 // 接收缓冲区大小
- char rxBuffer[RX_BUFFER_SIZE]; // 接收数据缓冲区
- 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[rxIndex++] = 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的项目,适合需要高效串口数据传输的场景。如果有任何疑问或改进建议,欢迎交流!
|