以下是基于 STC8H8K64U 单片机使用 DMA 实现串口3(UART3)不定长接收的完整方案。STC8H系列支持硬件DMA和串口空闲中断,结合两者可实现高效的不定长数据接收。
1. 核心思路
- DMA循环模式:持续接收数据到环形缓冲区。
- 串口空闲中断(IDLE):检测到总线空闲时触发,标记一帧数据接收完成。
- 双缓冲区机制:避免处理数据时被新数据覆盖。
2. 硬件配置
”`c
#include “stc8h.h”
#include
#define UART3_BUF_SIZE 128 // 环形缓冲区大小 uint8_t uart3_rx_buf[UART3_BUF_SIZE]; volatile uint16_t rx_len = 0; // 接收到的数据长度 volatile uint8_t rx_flag = 0; // 接收完成标志
void UART3_Init(void) {
P_SW2 |= 0x80; // 允许访问扩展寄存器(XFR)
// --- 串口3配置 ---
S3CON = 0x10; // 8位数据,无校验位,1位停止位
T3L = (65536 - (FOSC/4/115200)); // 波特率115200(根据实际时钟调整)
T3H = (65536 - (FOSC/4/115200)) >> 8;
T4T3M |= 0x20; // Timer3作为波特率发生器
S3CON |= 0x01; // 使能串口3接收
IE2 |= 0x08; // 使能UART3中断(用于IDLE检测)
}
void DMA_UART3_RX_Init(void) {
DMA_URCFG &= ~0x80; // 关闭DMA_UART3_RX
DMA_URTSA = (uint16_t)uart_rx_buf; // DMA目标地址
DMA_URTCR = UART_BUF_SIZE; // DMA传输长度(循环模式)
DMA_URCFG |= (1 << ––7); | ||||||||| ||||||||||||||||| ||||||||||||| ||||||||| ||||||||| ||||||||| ||||||||| ||||||||| ||||||||| ||||||||| ||||||||| ||<br/><br/><br/><font size=1 color=#CCCCCC>内容由零声教学AI助手提供,问题来源于学员提问</font>