找回密码
 立即注册
查看: 80|回复: 4

根据例程设置 DMA_ADC 的地址为 0x800,编译后提示地址重叠

[复制链接]

该用户从未签到

14

主题

69

回帖

335

积分

中级会员

积分
335
发表于 2024-3-27 16:39:31 | 显示全部楼层 |阅读模式
根据例程设置 DMA_ADC 的地址为 0x800,编译后提示地址,具体程序如下:


#define                DMA_ADDR                        0x800                  /* DMA数据存放地址 */


  u8  xdata DmaBufferADC[4][12] ;



//-------------------------------------------------- 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[0][10] <<8 | DmaBufferADC[0][11] ;

printf("data1 =%u  \n", data1);



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


无标题.png
回复 送花

使用道具 举报

该用户从未签到

14

主题

69

回帖

335

积分

中级会员

积分
335
 楼主| 发表于 2024-3-27 16:41:17 | 显示全部楼层
目前 UART1 和 UART3 已经使用了 DMA传输,具体如下:

bit                 DmaTxFlag1 = 0;
bit                 DmaTxFlag3 = 0;
u8                  xdata         DmaBuffer1[50];
u8                  xdata         DmaBuffer3[150];
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    开心
    昨天 11:37
  • 签到天数: 125 天

    [LV.7]常住居民III

    26

    主题

    1271

    回帖

    3957

    积分

    论坛元老

    积分
    3957
    发表于 2024-3-27 17:49:26 | 显示全部楼层
    ADC DMA例子是提供一个指定XRAM地址的空间划分方法,用这种方法的话你的DMA缓冲区要定义在指定地址上才行。
    当然也可以让编译器自动分配空间,那么只要将DmaBufferADC缓冲区的起始地址传给DMA地址寄存器就可以,例如:
    1.     DMA_ADC_RXAH = (u8)((u16)&DmaBufferADC >> 8);
    2.     DMA_ADC_RXAL = (u8)((u16)&DmaBufferADC);
    复制代码
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    14

    主题

    69

    回帖

    335

    积分

    中级会员

    积分
    335
     楼主| 发表于 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;
           u8  xdata DmaBufferADC[4][12] ; //4通道,每通道 4*2+4=12字节数据
    6、使用 printf每秒输出空间的 ADC数值
            uint data1,data2,data3,data4;
            data1 = DmaBufferADC[0][10] <<8 | DmaBufferADC[0][11] ;
            data2 = DmaBufferADC[1][10] <<8 | DmaBufferADC[1][11] ;
            data3 = DmaBufferADC[2][10] <<8 | DmaBufferADC[2][11] ;
            data4 = DmaBufferADC[3][10] <<8 | DmaBufferADC[3][11] ;
    7、printf输出的四个数据完全没有规律,
          data1= 10506, data2= 0,data3= 368,data4= 5776,

    麻烦大佬帮忙看看到底是哪个地方出了问题呀,谢谢
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    14

    主题

    69

    回帖

    335

    积分

    中级会员

    积分
    335
     楼主| 发表于 2024-3-28 09:01:22 | 显示全部楼层
    问题已经解决了, ADC _POWER 没有打开
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-4-28 04:43 , Processed in 0.060260 second(s), 47 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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