ZBLOG

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

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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?