STM32
直播中

张浩

7年用户 1145经验值
私信 关注
[问答]

STM8L051F3多路ADC采集DMA传输遇到的问题求解

新人求助使用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();



}

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


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



回帖(1)

任青

2024-5-8 16:56:59
在dma进入中断时先关闭ADC请求,出中断再打开就行了
举报

更多回帖

发帖
×
20
完善资料,
赚取积分