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

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

[复制链接]

14

主题

70

回帖

341

积分

中级会员

积分
341
发表于 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

主题

70

回帖

341

积分

中级会员

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 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

主题

70

回帖

341

积分

中级会员

积分
341
发表于 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

主题

70

回帖

341

积分

中级会员

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 03:30 , Processed in 0.126980 second(s), 76 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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