3648|1

111

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

STM8L152 ADC+DMA结果中第一个数据不知道干嘛的 [复制链接]

本帖最后由 liyancao001 于 2017-3-13 08:50 编辑

我让单片机一直连续运行,转换6个通道,DMA中设置的数组长度是78,也就是转换13个循环后产生DMA中断。DMA把结果存到BUFFER[13][6]的数组中。
问题是BUFFER[0][0]数据与我6个通道的哪个数据都对应不上,而BUFFER[0][1]对应1通道,BUFFER[0][2]对应2通道。。。。BUFFER[1][0]对应6通道。BUFFER[1][1]对应1通道.。。。后面的也都能对应上。
这样有两个问题,一直对应上偏移了一位,理论应该是BUFFER[0][1]对应2通道,而现在是对应1通道。二是第一个数据跟哪个通道的数据都对应不上。。。。

下面附上代码:#define ADC1_DR_ADDRESS        ((uint16_t)0x5344)
#define BUFFER_SIZE            ((uint8_t) 0x4E)   //((uint8_t) 0x06)
#define BUFFER_ADDRESS          ( (uint32_t)(&Buffer))


void ADC1_Init(void)  
{
  ADC1_GPIO_Config();                                    //ADO 端口设置
  CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);    //时钟使能
  ADC_DeInit(ADC1);                                          
  ADC_Init(ADC1,ADC_ConversionMode_Continuous,ADC_Resolution_12Bit,ADC_Prescaler_1);   
  ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels,ADC_SamplingTime_384Cycles);     
  ADC_VrefintCmd(DISABLE); //禁止内部电压基准源
  ADC_ChannelCmd(ADC1,ADC_Channel_11, ENABLE);      //温度 室温下一般AD值在1700-1800之间
  ADC_ChannelCmd(ADC1,ADC_Channel_12, ENABLE);      
  ADC_ChannelCmd(ADC1,ADC_Channel_13, ENABLE);     
  ADC_ChannelCmd(ADC1,ADC_Channel_14, ENABLE);      
  ADC_ChannelCmd(ADC1,ADC_Channel_15, ENABLE);     
  ADC_ChannelCmd(ADC1,ADC_Channel_16, ENABLE);         
  ADC_DMACmd(ADC1, ENABLE);                                                             //ADC_DMA使能
  ADC_Cmd(ADC1,ENABLE);                                                               //ADC使能
}
void DMA1_Init(void)
{
  CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);  
  SYSCFG_REMAPDMAChannelConfig(REMAP_DMA1Channel_ADC1ToChannel0);
  DMA_GlobalDeInit();
  DMA_Init(DMA1_Channel0, BUFFER_ADDRESS,
           ADC1_DR_ADDRESS,
           BUFFER_SIZE,   //与AD通道相关
           DMA_DIR_PeripheralToMemory,
           DMA_Mode_Circular,
           DMA_MemoryIncMode_Inc,
           DMA_Priority_High,
           DMA_MemoryDataSize_HalfWord );
   
  DMA_Cmd(DMA1_Channel0, ENABLE);                                   //DMA Channel0 enable
  DMA_ITConfig(DMA1_Channel0, DMA_ITx_TC, ENABLE);                  // Enable DMA1 channel0 Transfer complete interrupt
  DMA_GlobalCmd(ENABLE);                                            //DMA enable
}

INTERRUPT_HANDLER(DMA1_CHANNEL0_1_IRQHandler,2)
{
  unsigned char i=0;
    IWDG_ReloadCounter();
//    DMA_GlobalCmd(DISABLE);                                            //DMA enable
    ADC_Cmd(ADC1,DISABLE);                                                               //ADC使能   
    if(DMA_GetFlagStatus(DMA1_FLAG_TC0)!= RESET)
    {
      if(AD_Finish_Flag==0)//必须在处理函数结束以后才能刷新数据。
      {
        for(i=0;i<13;i++)
        {
            sum0=Buffer[0];     //此值应对应通道AD11,但实际对应通道AD16
            sum1=Buffer[1];     //此值应对应通道AD12,但实际对应通道AD11
            sum2=Buffer[2];     //此值应对应通道AD13,但实际对应通道AD12   
            sum3=Buffer[3];     //此值应对应通道AD14,但实际对应通道AD13  
            sum4=Buffer[4];     //此值应对应通道AD15,但实际对应通道AD14
            sum5=Buffer[5];    //此值应对应通道AD16,但实际对应通道AD15
        }           
        AD_Finish_Flag=1;
      }
    } //每个周期转换13次,分别存储在sunx[0]--sunx[12]中   
    DMA_ClearITPendingBit(DMA1_IT_TC0);
}

定时器中还有这一段相关的代码,这里是控制AD转换开始的
        if(AD_Run_Time<25){AD_Run_Time++;}
        else
        {
          disableInterrupts();
          DMA1_Init();
          ADC1_Init();
          enableInterrupts();
          ADC_SoftwareStartConv(ADC1);
          AD_Run_Time=0;
        }



此帖出自stm32/stm8论坛

最新回复

错位倒是问题不大,注意一下处理的是每次ADC转换完的数据,就是上次转换的就行了。 你这个dma没多大意思,ADC软触发用dma意义不大。  详情 回复 发表于 2017-3-13 11:07
点赞 关注
 

回复
举报

4008

帖子

0

TA的资源

版主

沙发
 
错位倒是问题不大,注意一下处理的是每次ADC转换完的数据,就是上次转换的就行了。
你这个dma没多大意思,ADC软触发用dma意义不大。
此帖出自stm32/stm8论坛
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表