找回密码
 立即注册
查看: 196|回复: 6

用DMA发送到P2端口

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:57
  • 最近打卡:2025-05-02 00:21:46

13

主题

43

回帖

136

积分

注册会员

积分
136
发表于 2025-2-12 00:27:38 | 显示全部楼层 |阅读模式




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[DATA_SIZE];

// 初始化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可以在这里处理其他任务
    }
}

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2025-2-12 10:01:50 | 显示全部楼层
DMA-I8080接口,或 DMA-M6800接口 尝试下
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:57
  • 最近打卡:2025-05-02 00:21:46

13

主题

43

回帖

136

积分

注册会员

积分
136
发表于 2025-2-12 13:43:49 | 显示全部楼层
王*** 发表于 2025-2-12 09:55
STC单片机目前并没有直接发送到一整组IO口的DMA方法
并且你的程序中也写了:// 手动添加DMA相关寄存器定义 ...

谢谢回复,危险不至于,只是试着问问看STC有没有而已。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:57
  • 最近打卡:2025-05-02 00:21:46

13

主题

43

回帖

136

积分

注册会员

积分
136
发表于 2025-2-12 13:44:23 | 显示全部楼层
神*** 发表于 2025-2-12 10:01
DMA-I8080接口,或 DMA-M6800接口 尝试下

谢谢,回头去啃一下
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 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为主控芯片进行编写测试。
验证电路:
验证电路.PNG
输出1000Hz正弦波-无滤波波形:

输出1000Hz正弦波-无滤波波形.PNG

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

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

AI8051U-TFT-LCM接口-P2口接R-2R做DAC输出波形-DMA.rar (2.77 MB, 下载次数: 12)




点评

就是这个味  发表于 2025-2-12 20:52
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:04 , Processed in 0.141138 second(s), 88 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表