用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可以在这里处理其他任务
}
}
STC单片机目前并没有直接发送到一整组IO口的DMA方法
并且你的程序中也写了:// 手动添加DMA相关寄存器定义(根据实际情况修改地址)
可以使用LCM-DMA间接实现这个功能。也可以发送到P2端口数据
使用AI的前提是自己能看懂AI生成的程序,AI写代码只是减轻负担的手段。
完全的依靠AI写代码就像是闭着眼走路,比较危险的还是
DMA-I8080接口,或 DMA-M6800接口 尝试下 王昱顺 发表于 2025-2-12 09:55
STC单片机目前并没有直接发送到一整组IO口的DMA方法
并且你的程序中也写了:// 手动添加DMA相关寄存器定义 ...
谢谢回复,危险不至于,只是试着问问看STC有没有而已。 神农鼎 发表于 2025-2-12 10:01
DMA-I8080接口,或 DMA-M6800接口 尝试下
谢谢,回头去啃一下
‘ 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]