ZBLOG

用STC8H8K64U的单片机串口3的不定长接收程序,用DMA方式接收

以下是基于 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>

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=8244

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?