根据例程设置 DMA_ADC 的地址为 0x800,编译后提示地址重叠
根据例程设置 DMA_ADC 的地址为 0x800,编译后提示地址,具体程序如下:#define DMA_ADDR 0x800 /* DMA数据存放地址 */
u8xdata DmaBufferADC ;
//-------------------------------------------------- ADC
DMA_ADC_CFG = 0x80; //bit7 1:Enable Interrupt
DMA_ADC_STA = 0x00;
DMA_ADC_RXAH = (u8)(DMA_ADDR >> 8); //ADC转换数据存储地址
DMA_ADC_RXAL = (u8)DMA_ADDR;
DMA_ADC_CFG2 = 0x09; //每个通道ADC转换次数:4
DMA_ADC_CHSW0 = 0;
DMA_ADC_CHSW1 = 0x0f; //ADC通道使能寄存器 ADC8-ADC11
DMA_ADC_CR = 0xC0; //bit7 1:Enable ADC_DMA, bit6 1:Start ADC_DMA
//--------------------------------------------------
我使用如下程序想把 ADC数值 用 printf打印出来,结果显示data1 =10635
uint data1;
data1 = DmaBufferADC <<8 | DmaBufferADC ;
printf("data1 =%u\n", data1);
不知道是哪里的问题呀?麻烦大佬帮忙一下看看,具体冲突的信息见附图
目前 UART1 和 UART3 已经使用了 DMA传输,具体如下:
bit DmaTxFlag1 = 0;
bit DmaTxFlag3 = 0;
u8 xdata DmaBuffer1;
u8 xdata DmaBuffer3; ADC DMA例子是提供一个指定XRAM地址的空间划分方法,用这种方法的话你的DMA缓冲区要定义在指定地址上才行。
当然也可以让编译器自动分配空间,那么只要将DmaBufferADC缓冲区的起始地址传给DMA地址寄存器就可以,例如:
DMA_ADC_RXAH = (u8)((u16)&DmaBufferADC >> 8);
DMA_ADC_RXAL = (u8)((u16)&DmaBufferADC); 乘风飞扬 发表于 2024-3-27 17:49
ADC DMA例子是提供一个指定XRAM地址的空间划分方法,用这种方法的话你的DMA缓冲区要定义在指定地址上才行。 ...
您好,我已经改为不使用 at 指令了,但是打印出来的数据还是不正常,硬件接线和配置应该是没有问题的,我原始用的是原地等待 ADC完成后再计算数据,一次大概 4ms左右,现在想提速一下,因此想改为 DMA试一下。具体程序如下,不知道哪里出问题了呢,您帮忙看看
1、ADC初始化程序
static void ADC_Initial()
{
P_SW2 |= 0x80;//开启访问XFR
ADCTIM = 0x3F; // 时序控制,默认值即可
ADCCFG = 0x2F;//数据右对齐,转换时间 512时钟
}
2、DMA_ADC初始化程序:目前只用四个通道 8/9/10/11、
DMA_ADC_CFG = 0x80; //bit7 1:Enable Interrupt
DMA_ADC_STA = 0x00;
DMA_ADC_RXAH = (u8)((u16)&DmaBufferADC >> 8); //ADC转换数据存储地址
DMA_ADC_RXAL = (u8)((u16)&DmaBufferADC);
DMA_ADC_CFG2 = 0x09; //每个通道ADC转换次数:4
DMA_ADC_CHSW0 = 0;
DMA_ADC_CHSW1 = 0x0f; //ADC通道使能寄存器 ADC8-ADC11
DMA_ADC_CR = 0xC0; //bit7 1:Enable ADC_DMA, bit6 1:Start ADC_DMA
3、DMA中断服务程序:
/**************************************************************************/// ADC DMA发送中断服务函数
void ADC_DMA_Interrupt(void) interrupt 48
{
DMA_ADC_STA = 0;
DmaFlag_ADC = 0; //发送完成置零
}
4、定时每秒启动 DMA外发功能
if( msDMAsend >= 100 ) //每秒定时启动 DMA功能
{
msDMAsend = 0;
// if( !DmaTxFlag1)
// {
// DmaTxFlag1 = 1;
// DMA_UR1T_CR = 0xC0; //bit7 1:使能
//UART1_DMA, bit6 1:开始 UART1_DMA 自动发送
// }
if( !DmaTxFlag3)
{
DmaTxFlag3 = 1;
DMA_UR3T_CR = 0xC0; //bit7 1:使能
//UART3_DMA, bit6 1:开始 UART3_DMA 自动发送
}
if( !DmaFlag_ADC)
{
DmaFlag_ADC = 1;
DMA_ADC_CR = 0xC0; //bit7 1:使能 ADC_DMA,
//bit6 1:开始 ADC_DMA 自动发送
}
}
5、DMA_ADC存储空间定义
bit DmaFlag_ADC;
u8xdata DmaBufferADC ; //4通道,每通道 4*2+4=12字节数据
6、使用 printf每秒输出空间的 ADC数值
uint data1,data2,data3,data4;
data1 = DmaBufferADC <<8 | DmaBufferADC ;
data2 = DmaBufferADC <<8 | DmaBufferADC ;
data3 = DmaBufferADC <<8 | DmaBufferADC ;
data4 = DmaBufferADC <<8 | DmaBufferADC ;
7、printf输出的四个数据完全没有规律,
data1= 10506, data2= 0,data3= 368,data4= 5776,
麻烦大佬帮忙看看到底是哪个地方出了问题呀,谢谢 问题已经解决了, ADC _POWER 没有打开
页:
[1]