你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
wayhe 提问时间:2017-10-31 17:33 /
STM8L151 ADC 采用DMA  8通道连续采集,通过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使能  TS5  MOS温度检测
  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转换
}




收藏 1 评论2 发布时间:2017-10-31 17:33

举报

2个回答
wenyangzeng 回答时间:2017-10-31 22:04:58
你用多通道连续扫描方案,建议所有通道采样速度相同。
wayhe 回答时间:2017-11-1 08:20:11
怎样设置?我就配置了一次采样速率,8通道是要配置8次吗?
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版