以下是基于 STC8H8K64U 单片机使用 DMA(直接存储器访问) 实现串口3(UART3)定长接收的示例代码。STC8H系列支持硬件DMA,可显著降低CPU负载。
1. 硬件配置说明
- 串口3引脚:根据数据手册,UART3的默认引脚为:
- TX: P0.4
- RX: P0.5
- DMA通道:STC8H的DMA控制器支持多通道,需选择未占用的通道(如DMA1)。
2. DMA初始化与串口配置
#include "stc8h.h"
#include <intrins.h>
#define UART3_RX_LEN 32 // 定义定长接收的字节数
uint8_t uart3_rx_buf[UART3_RX_LEN]; // DMA接收缓冲区
void UART3_DMA_Init(void) {
// --- 1. 初始化串口3 ---
P_SW2 |= 0x80; // 允许访问扩展寄存器(XFR)
S3CON = 0x10; // 8位数据,无校验位,1位停止位
T3L = (65536 - (FOSC/4/115200)); // 波特率115200(根据实际时钟调整)
T3H = (65536 - (FOSC/4/115200)) >> 8;
T4T3M |= 0x20; // Timer3作为波特率发生器,开始计数
S3CON |= 0x01; // 使能串口3接收
// --- 2. DMA配置 ---
DMA_UR3TCR = UART3_RX_LEN; // DMA传输长度(定长)
DMA_URTSA = (uint16_t)uart3_rx_buf; // DMA目标地址(接收缓冲区)
DMA_URCFG |= 0x80; // 使能DMA_UART3_RX
}
3. DMA中断处理
当DMA完成指定长度的数据传输后,会触发中断:
void DMA_Interrupt() interrupt DMA_VECTOR {
if (DMA_URSTA & 0x01) { // UART3 RX DMA完成标志
DMA_URSTA &= ~0x01; // 清除标志位
// TODO: 处理接收到的数据(uart3_rx_buf)
//重新启动DMA接收(循环模式可选)
DMA_URCFG |= 0x80;
}
}
4. main函数示例
”`c void main() {
P0M1 = 0x00; P0M0 = 0x30; // P0.4(TX), P0.5(RX)设置为推挽输出
EA = 1; //全局中断使能
UART3_DMA_Init(); //初始化串口和DMA
while(1) {
; //主循环可执行其他任务
//数据通过DMA自动填充到uart_rx_buf中!
<br/><br/><br/><font size=1 color=#CCCCCC>内容由零声教学AI助手提供,问题来源于学员提问</font>