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

求助,关于STM8L051F3芯片,多路ADC采集DMA传输遇到的问题

[复制链接]
ALEXxx 提问时间:2016-8-23 15:04 /
本帖最后由 q304069320 于 2016-8-25 09:35 编辑

新人求助使用STM8L051F3主控芯片的ADC循环采样DMA传输功能,遇到DMA传输位数变动,采样值交换的问题。
还不能确定是ADC触发DMA的错误还是DMA传输的错误,求大神帮助。
以下是主要代码:
主函数:
void main(void)
{

//  GPIO_Init(LED_PORT,LED_PINS,GPIO_Mode_Out_PP_Low_Fast);

  GPIO_Init(GPIOC,GPIO_Pin_0,GPIO_Mode_Out_PP_Low_Fast);
  GPIO_Init(GPIOC,GPIO_Pin_1,GPIO_Mode_Out_PP_Low_Fast);
  GPIO_Init(GPIOB,GPIO_Pin_0,GPIO_Mode_Out_PP_Low_Fast);


  Tim2_Init();//向量21
  Tim3_Init();//PWM

  DMA_InitConfig();

  ADC_InitConfig();//ADC8位分辨率

  enableInterrupts();

  GPIO_SetBits(GPIOA,GPIO_Pin_1);

while (1)
{

}


}
DMA初始化配置
void DMA_InitConfig(void)
{
  CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);

  SYSCFG_REMAPDMAChannelConfig(REMAP_DMA1Channel_ADC1ToChannel0);

//*******************************************************************

  DMA_Init( DMA1_Channel0,
            BUFFER_ADDRESS,
            ADC1_DR_ADDRESS,
            2,
            DMA_DIR_PeripheralToMemory,
            DMA_Mode_Circular,
            DMA_MemoryIncMode_Inc,
            DMA_Priority_VeryHigh,
            DMA_MemoryDataSize_HalfWord);

   /* DMA Channel0 enable */
  DMA_Cmd(DMA1_Channel0, ENABLE);

  /* Enable DMA1 channel0 Transfer complete interrupt */
//  DMA_ITConfig(DMA1_Channel0, DMA_ITx_TC, ENABLE);

  /* DMA enable */
  DMA_GlobalCmd(ENABLE);



}


宏定义
#define ADC1_DR_ADDRESS ((uint16_t)0x5344)
#define BUFFER_SIZE     ((uint8_t)0x02)
#define BUFFER_ADDRESS  ((uint32_t)DMAResult)


ADC初始化配置
void ADC_InitConfig(void)
{
  CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);

  ADC_Init(ADC1,ADC_ConversionMode_Continuous,ADC_Resolution_12Bit,ADC_Prescaler_2);

  ADC_SamplingTimeConfig(ADC1,ADC_Group_SlowChannels,ADC_SamplingTime_48Cycles);

  ADC_Cmd(ADC1,ENABLE);

  GPIO_Init(GPIOB,GPIO_Pin_5,GPIO_Mode_In_FL_No_IT);//按键1
  GPIO_Init(GPIOB,GPIO_Pin_6,GPIO_Mode_In_FL_No_IT);//按键2

  ADC_ChannelCmd(ADC1,ADC_Channel_12,ENABLE);//PB6
  ADC_ChannelCmd(ADC1,ADC_Channel_13,ENABLE);//PB5

// ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);

  ADC_DMACmd(ADC1,ENABLE);

  ADC_SoftwareStartConv(ADC1);

//  ADC_DMARequestAfterLastTransferCmd();



}

运行后查看寄存器与存储数组

4.png

5.png

6.png

可以看到出现两位通道数值交换问题,为什么呢?
数据位数寄存器C0NDTR并不一直为2.但是配置的BUFFERSIZE是2。
请大神给予解答,不胜感激



收藏 2 评论4 发布时间:2016-8-23 15:04

举报

4个回答
wegfvjdcelb 回答时间:2016-11-10 15:45:27
请问楼主解决了吗?
peter001 回答时间:2016-11-12 10:30:53
不了解,帮顶
文城宝宝 回答时间:2016-12-28 09:22:32
在dma进入中断时先关闭ADC请求,出中断再打开就行了
sssdd 回答时间:2016-12-30 11:17:33
可能是中断优先级问题,数没及时取走,溢出到不该放的地方。。猜的,没用过。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版