wayhe 发表于 2017-10-31 17:33:00

STM8L151 ADC采用DMA多通道连续采集遇到通道数据滚动问题

STM8L151 ADC 采用DMA8通道连续采集,通过ST_LINK仿真发现:通道数据滚动问题,比如第一通道的数据本应该在数组0通道,一会儿整组偏移到数组3通道,一会又偏移到4通道,而且是所有数据同时偏移。网上搜了一下,有很多人遇到过,但是都不说解决方法。折腾了一天无解,只能在这里求救了。ADC初始化程序如下:
void ADC_DMA_Config(void)                                                         //ADC初始化,ADC连续转换模式
{

        // Enable ADC clock
CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);                     //开启ADC时钟
CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);                     //DMA时钟

DMA_DeInit(DMA1_Channel0);                                                    //初始化DMA为默认值
ADC_DeInit(ADC1);                                                             //初始化ADC为默认值

ADC_Init(ADC1, ADC_ConversionMode_Continuous,ADC_Resolution_12Bit, ADC_Prescaler_1);//初始化ADC1为,连续转换模式,12位AD转换,ADC时钟预分频为1

ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels,ADC_SamplingTime_192Cycles);//配置ADC为慢速通道,采样时间周期为192
//ADC_SamplingTimeConfig(ADC1, ADC_Group_FastChannels,ADC_SamplingTime_24Cycles);//配置ADC为,快速通道,采样时间周期为9

ADC_Cmd(ADC1, ENABLE);                                                         //启用ADC

//ADC_ChannelCmd(ADC1, ADC_Channel_Vrefint, ENABLE);                            //内部参考电压

ADC_ChannelCmd(ADC1, ADC_Channel_15, ENABLE);                                  //ADC通道15使能Vbat 总电池电压
ADC_ChannelCmd(ADC1, ADC_Channel_16, ENABLE);                                  //ADC通道16使能TS5MOS温度检测
ADC_ChannelCmd(ADC1, ADC_Channel_17, ENABLE);                                  //ADC通道17使能TS4电池温度检测4
ADC_ChannelCmd(ADC1, ADC_Channel_18, ENABLE);                                  //ADC通道18使能TS3电池温度检测3
ADC_ChannelCmd(ADC1, ADC_Channel_19, ENABLE);                                  //ADC通道19使能TS2电池温度检测2
ADC_ChannelCmd(ADC1, ADC_Channel_20, ENABLE);                                  //ADC通道20使能TS1电池温度检测1
ADC_ChannelCmd(ADC1, ADC_Channel_21, ENABLE);                                  //ADC通道21使能Ic   充电电流检测
ADC_ChannelCmd(ADC1, ADC_Channel_22, ENABLE);                                  //ADC通道22使能Id   放电电流检测

SYSCFG_REMAPDMAChannelConfig(REMAP_DMA1Channel_ADC1ToChannel0);               //重新映射DMA通道的具体外围(ADC或TIM4)

DMA_Init(DMA1_Channel0,                                                      //通道0
          (uint32_t)&ADC_Value,                                                //缓冲区地址
          (uint16_t)ADC1_DR_Address,                                           //ADC数据寄存器地址
          DMA_BUF_SIZE,                                                      //缓冲区大小
          DMA_DIR_PeripheralToMemory,                                          //外设到内存
          DMA_Mode_Circular,                                                   //循环转换
          DMA_MemoryIncMode_Inc,                                             //内存地址自增
          DMA_Priority_High,                                                   //优先级为高
          DMA_MemoryDataSize_HalfWord);                                        //内存数据是半字位宽 16位

//DMA_SetCurrDataCounter(DMA1_Channel0,DMA_BUF_SIZE);//

// Enable DMA1 channel0
DMA_Cmd(DMA1_Channel0, ENABLE);                                             //启用DMA使能通道0

DMA_ITConfig(DMA1_Channel0,DMA_ITx_TC, ENABLE);//使能传输完成中断
//DMA_ITConfig(DMA1_Channel0,DMA_ITx_TC, DISABLE);                              //是否开启DMA中断   
//DMA_ITConfig(DMA1_Channel0,DMA_ITx_HT, DISABLE);

DMA_GlobalCmd(ENABLE);                                                      //启用或禁用全部DMA

ADC_DMACmd(ADC1,ENABLE);                                                      //启用ADC DMA请求

// a short time of delay is required after enable ADC
//delay_10us(3);                                                                //延时

ADC_ITConfig(ADC1, ADC_IT_EOC,DISABLE);                                       //开启ADC中断

//ADC_ClearFlag(ADC1, ADC_FLAG_EOC);                                          //清除EOC标志,即:清除转换完成标志

ADC_SoftwareStartConv(ADC1);                                                //开始ADC转换
}




wenyangzeng 发表于 2017-10-31 22:04:58

你用多通道连续扫描方案,建议所有通道采样速度相同。

wayhe 发表于 2017-11-1 08:20:11

怎样设置?我就配置了一次采样速率,8通道是要配置8次吗?
页: [1]
查看完整版本: STM8L151 ADC采用DMA多通道连续采集遇到通道数据滚动问题