江哥 发表于 2025-2-12 00:27:38

用DMA发送到P2端口





STC8H8K64U创建一个递增数组,用DMA发送到P2端口,下面的代码是与豆包反复纠错后生成的,编译不报错,但上传后看不到P2端口想要的输出(接R-2R模块生成锯齿波,用普通数组方式赋值给P2是可以看到锯齿波的)

#include "stc8h.h"

// 手动添加DMA相关寄存器定义(根据实际情况修改地址)
#define DMAEN (*(unsigned char volatile xdata *)0xA0)
#define DMACH0 (*(unsigned char volatile xdata *)0xA1)
#define DMASRC0 (*(unsigned int volatile xdata *)0xA2)
#define DMADST0 (*(unsigned int volatile xdata *)0xA4)
#define DMALEN0 (*(unsigned int volatile xdata *)0xA6)
#define DMACTL0 (*(unsigned char volatile xdata *)0xA8)
#define DMARQST0 (*(unsigned char volatile xdata *)0xA9)

// 定义要传输的数据数组,使用xdata存储类型
#define DATA_SIZE 256
unsigned char xdata data_array;

// 初始化DMA
void DMA_Init() {
    // 使能DMA控制器
    DMAEN = 1;

    // 配置DMA通道0
    DMACH0 = 0;// 选择通道0
    DMASRC0 = (unsigned int)data_array;// 设置源地址为数据数组的起始地址
    DMADST0 = 0xA0;// 直接使用P2的地址
    DMALEN0 = DATA_SIZE;// 设置传输数据的长度

    // 配置DMA控制寄存器
    //DMACTL0 = 0x80;// 使能通道0,选择单次传输模式
        DMACTL0 = 0xC0;// 使能通道0,选择循环传输模式
}

void main() {
    unsigned int i;

    // 设置P2为推挽输出模式
    P2M0 = 0xff;
    P2M1 = 0x00;

    // 初始化数据数组
    for (i = 0; i < DATA_SIZE; i++) {
      data_array = (unsigned char)i;
    }

    // 初始化DMA
    DMA_Init();

    // 启动DMA传输
    DMARQST0 = 1;

    while (1) {
      // CPU可以在这里处理其他任务
    }
}

王昱顺 发表于 2025-2-12 09:55:05

STC单片机目前并没有直接发送到一整组IO口的DMA方法
并且你的程序中也写了:// 手动添加DMA相关寄存器定义(根据实际情况修改地址)
可以使用LCM-DMA间接实现这个功能。也可以发送到P2端口数据
使用AI的前提是自己能看懂AI生成的程序,AI写代码只是减轻负担的手段。
完全的依靠AI写代码就像是闭着眼走路,比较危险的还是

神农鼎 发表于 2025-2-12 10:01:50

DMA-I8080接口,或 DMA-M6800接口 尝试下

江哥 发表于 2025-2-12 13:43:49

王昱顺 发表于 2025-2-12 09:55
STC单片机目前并没有直接发送到一整组IO口的DMA方法
并且你的程序中也写了:// 手动添加DMA相关寄存器定义 ...
谢谢回复,危险不至于,只是试着问问看STC有没有而已。

江哥 发表于 2025-2-12 13:44:23

神农鼎 发表于 2025-2-12 10:01
DMA-I8080接口,或 DMA-M6800接口 尝试下

谢谢,回头去啃一下

梁工 发表于 2025-2-12 17:29:40

STC8H8K64U 的TFT-LCM DMA不能控制输出速率,所以建议使用AI8051U来实现,可以设置DMA更新速率,从而可以设置输出波形频率。

=======================================================


例程功能: 使用TFT-LCM模块用DMA方式将正弦波数据输出P2口接R-2R做DAC输出正弦波。
使用32点8位正弦波表,采样率(DMA输出更新速率)为32KHz,输出1000Hz正弦波。
用户可以改变DMA输出感染新速率从而改变正弦波频率。
虽然只使用P2口输出数据,但由于是借用TFT-LCM输出,则相关的IO都被占用,不能做他用,本例占用P2、P3.6、P3.7、P4.5.

本例程基于AI8051U为主控芯片进行编写测试。
验证电路:

输出1000Hz正弦波-无滤波波形:



输出1000Hz正弦波-低通滤波波形:








页: [1]
查看完整版本: 用DMA发送到P2端口