Nanger 发表于 2024-3-27 16:39:31

根据例程设置 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);



不知道是哪里的问题呀?麻烦大佬帮忙一下看看,具体冲突的信息见附图


Nanger 发表于 2024-3-27 16:41:17

目前 UART1 和 UART3 已经使用了 DMA传输,具体如下:

bit               DmaTxFlag1 = 0;
bit               DmaTxFlag3 = 0;
u8                xdata         DmaBuffer1;
u8                xdata         DmaBuffer3;

乘风飞扬 发表于 2024-3-27 17:49:26

ADC DMA例子是提供一个指定XRAM地址的空间划分方法,用这种方法的话你的DMA缓冲区要定义在指定地址上才行。
当然也可以让编译器自动分配空间,那么只要将DmaBufferADC缓冲区的起始地址传给DMA地址寄存器就可以,例如:
    DMA_ADC_RXAH = (u8)((u16)&DmaBufferADC >> 8);
    DMA_ADC_RXAL = (u8)((u16)&DmaBufferADC);

Nanger 发表于 2024-3-28 08:13:17

乘风飞扬 发表于 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,

麻烦大佬帮忙看看到底是哪个地方出了问题呀,谢谢

Nanger 发表于 2024-3-28 09:01:22

问题已经解决了, ADC _POWER 没有打开
页: [1]
查看完整版本: 根据例程设置 DMA_ADC 的地址为 0x800,编译后提示地址重叠