OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2534|回复: 1

求助:H743 ADC+DMA模式,采样数据正确,但是不能用DMA将数据传送到制定的存储位置

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2019-9-26
在线时间
0 小时
发表于 2019-9-26 10:00:15 | 显示全部楼层 |阅读模式
1金钱
本人最近想要用定时采样数据,定时中断为100us,这个测试后没问题,因为有多通道数据采样要求,所以尝试用DMA模式,结果发现ADC采样值正确,但是数据搬不到制定的存储区。在线仿真看,从DMA和ADC的寄存器可以读到在给DMA数据传输完成中断标志位清零前,的确是已经被置1了,是不是可以说明DMA存储器缓冲区数据都被传送出来,那数据怎么就没有到ADC_Regs这个机构提中呢?具体相关代码如下,请各位多多指教!谢谢啦!
ADC初始化配置部分:
ADC1_Regs.CR.all = 0;
ADC1_Regs.CR.bit.ADVREGEN = 1;             //ADVREGEN=1,使能ADC稳压器
while((mbx++) < 1000000);                          //等待稳压器启动完成,约10us,这里延时大一点,没关系.
ADC1_Regs.PCSEL.all = 0xffff;
ADC1_Regs.CFGR.all = 0x80000005;        // 选择ADC-DMA模式,14bit
ADC1_Regs.SMPR1.all = 0x24924924;         // 32.5个ADC时钟周期        TCONV =2us                         //0x1B6DB6D8;                        // 0x3 16.5Clk     ADC1_Regs.SMPR2.all = 0x24924924;                        //0x1B6DB6DB;                        // 0x3 16.5Clk
//  ADC1_Regs.SQR1.bit.L = 6 - 1;
  ADC1_Regs.SQR1.bit.L = 1-1;  

   ADC1_Regs.SQR1.bit.SQ1 = 2; //IMA
//   ADC1_Regs.SQR1.bit.SQ2 = 8; //IMB
//   ADC1_Regs.SQR1.bit.SQ3 = 9; //IMC
////   ADC1_Regs.SQR1.bit.SQ4 = 16;//ICA
////   ADC1_Regs.SQR2.bit.SQ5 = 17;//ICB
//   ADC1_Regs.SQR1.bit.SQ4 = 0;//ICA
//   ADC1_Regs.SQR2.bit.SQ5 = 1;//ICB
//   ADC1_Regs.SQR2.bit.SQ6 = 6; //UMA
   ADC1_Regs.CR.bit.ADCALLIN = 1;   //ADCALLIN=1,线性校准
   ADC1_Regs.CR.bit.ADCAL = 1;      //开启校准
   while(ADC1_Regs.CR.bit.ADCAL == 1);  //等待校准完成
   ADC1_Regs.CR.all = 0x10000101;

DMA初始化配置部分:
  DMAMUX1_Regs.C0CR.all = 0x00000009;                        // 选择9通道(ADC1)
   DMA1_Regs.S0PAR = (uint32)&ADC1_Regs.DR;       
   DMA1_Regs.S0M0AR = (uint32)&ADC_Regs.Ima;
   DMA1_Regs.S0NDTR = 1;
   DMA1_Regs.S0CR.all = 0x00032C20;                                // MINC.MSIZE.PSIZE.PFCTRL=1,PL=3       


// ****************************************************************************
// 系统定时器中断,100us
// ****************************************************************************
uint32 sts;
uint32 xft;
void SysTick_Handler(void)
{
    uint16 amx;
   uint16 bmx;
  DMA1_Regs.S0CR.bit.EN = 0;

   sts = DMA1_Regs.LISR.all;

   if(0x00000020 != (sts & 0x0000003d))
    {
          xft++;  
        }
//***************************************************************************
// 用于Time计时使用
// ****************************************************************************
   if(++Time.Cnt_100us > 10)                // 100us*10 = 1mS时间
    {
      Time.Cnt_100us = 0;
          Time.Tick.bit.msec = 1;
}
       

    DMA1_Regs.LIFCR.all = 0x0f7d0f7d;
    DMA1_Regs.HIFCR.all = 0x0f7d0f7d;
    DMA1_Regs.S0NDTR = 1;
    DMA1_Regs.S0CR.bit.EN = 1;
    ADC1_Regs.CR.bit.ADSTART = 1;

}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-9-27 02:39:59 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 00:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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