打印
[STM8]

STM8L152 ADC+DMA结果中第一个数据不知道干嘛的

[复制链接]
3177|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 liyancao001 于 2017-3-11 16:36 编辑

我让单片机一直连续运行,转换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;
        }


沙发
liyancao001|  楼主 | 2017-3-13 08:41 | 只看该作者
??

使用特权

评论回复
板凳
peterlifan| | 2017-6-1 17:11 | 只看该作者
表示这里好像看不懂 重复覆盖十三次吗 楼主是不是写错了

捕获.PNG (30.09 KB )

捕获.PNG

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

32

帖子

2

粉丝