[其他] 灵动微 MM32 多路ADC-DMA配置

[复制链接]
 楼主| 人的发个哈哈 发表于 2022-7-28 23:01 | 显示全部楼层 |阅读模式
AD, DM, dc
一、问题
最近在使用灵动微的MM32,当用多路ADC-DMA时,出现了一些问题,所以在此记录一下
总结下来,处理了下面几个问题(这里的问题是拿到最新的SDK包,参考example没办法解决的)

多路通道对应的DMA内存不明确,例如CH0对应DMA的第二个字节,CH1却对应第一字节
多个通道数值接近


 楼主| 人的发个哈哈 发表于 2022-7-28 23:02 | 显示全部楼层
二、解决方法
使用任意通道
  1.     ADC_ANY_NUM_Config(ADC1,3);//一共4通道
  2.     ADC1->ANYCR |=  ADC_ANY_CR_CHANY_MDEN;//开启任意通道
  3.        
  4.         ///设置通道的顺序
  5.     ADC_ANY_CH_Config(ADC1,0,ADC_Channel_0);
  6.     ADC_ANY_CH_Config(ADC1,1,ADC_Channel_1);
  7.     ADC_ANY_CH_Config(ADC1,2,ADC_Channel_2);
  8.     ADC_ANY_CH_Config(ADC1,3,ADC_Channel_Vrefint);
 楼主| 人的发个哈哈 发表于 2022-7-28 23:06 | 显示全部楼层
这个问题,是因为引脚悬空导致了,举个例子,若PA1有确切电平, PA2 PA3
悬空,则PA2 PA3得到的数据会跟随PA1变化,只有一点点区别(细微差别)
 楼主| 人的发个哈哈 发表于 2022-7-28 23:08 | 显示全部楼层
整体代码
  1. void adc_dma_init()
  2. {
  3.     DMA_InitTypeDef DMA_InitStruct;

  4.     RCC_AHBPeriphClockCmd(RCC_AHBENR_DMA1, ENABLE);
  5.     DMA_DeInit(DMA1_Channel1);
  6.     DMA_StructInit(&DMA_InitStruct);
  7.     //DMA transfer peripheral address
  8.     DMA_InitStruct.DMA_PeripheralBaseAddr = (u32) & (ADC1->DR);
  9.     //DMA transfer memory address
  10.     DMA_InitStruct.DMA_MemoryBaseAddr = (u32)&adcBuf;
  11.     //DMA transfer direction from peripheral to memory
  12.     DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;
  13.     //DMA cache size
  14.     DMA_InitStruct.DMA_BufferSize = ADC_DMA_BUF_SIZE;
  15.     //After receiving the data, the peripheral address is forbidden to move
  16.     //backward
  17.     DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  18.     //After receiving the data, the memory address is shifted backward
  19.     DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
  20.     //Define the peripheral data width to 16 bits
  21.     DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  22.     //Define the memory data width to 16 bits
  23.     DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  24.     //Cycle conversion mode
  25.     DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;
  26.     //DMA priority is high
  27.     DMA_InitStruct.DMA_Priority = DMA_Priority_High;
  28.     //M2M mode is disabled
  29.     DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;
  30.     DMA_InitStruct.DMA_Auto_reload = DMA_Auto_Reload_Disable;
  31.     DMA_Init(DMA1_Channel1, &DMA_InitStruct);
  32.     DMA_Cmd(DMA1_Channel1, ENABLE);

  33.     ADC_InitTypeDef  ADC_InitStruct;
  34.     ADC_StructInit(&ADC_InitStruct);

  35.     //Initialize PA1 to analog input mode
  36.     //Enable ADC clock
  37.     RCC_APB2PeriphClockCmd(RCC_APB2ENR_ADC1, ENABLE);
  38.     ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
  39.     //ADC prescale factor
  40.     ADC_InitStruct.ADC_PRESCARE = ADC_PCLK2_PRESCARE_17;
  41.     //Set ADC mode to continuous conversion mode
  42.     ADC_InitStruct.ADC_Mode = ADC_Mode_Continue;
  43.     //AD data right-justified
  44.     ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
  45.     ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  46.     ADC_Init(ADC1, &ADC_InitStruct);

  47.     GPIO_InitTypeDef GPIO_InitStruct;
  48.     RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
  49.     RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOC, ENABLE);
  50.     GPIO_StructInit(&GPIO_InitStruct);
  51.     GPIO_InitStruct.GPIO_Pin  =  GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
  52.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  53.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
  54.     GPIO_Init(GPIOA, &GPIO_InitStruct);

  55.     //PC3  ADC_IN13
  56.     GPIO_InitStruct.GPIO_Pin  =  GPIO_Pin_3;
  57.     GPIO_Init(GPIOC, &GPIO_InitStruct);

  58.     //Enable the channel
  59.     ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 0, ADC_Samctl_240_5);
  60.     ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 0, ADC_Samctl_240_5);
  61.     ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 0, ADC_Samctl_240_5);
  62.    // ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 0, ADC_Samctl_240_5);
  63.    // ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 0, ADC_Samctl_240_5);
  64.     //ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 0, ADC_Samctl_240_5);
  65.     //ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 0, ADC_Samctl_240_5);
  66.    // ADC_RegularChannelConfig(ADC1, 13, 0, ADC_Samctl_240_5);//通道13
  67.     ADC_RegularChannelConfig(ADC1, ADC_Channel_Vrefint, 0, ADC_Samctl_240_5);

  68.    
  69.     ADC_ANY_CH_Config(ADC1,0,ADC_Channel_0);
  70.     ADC_ANY_CH_Config(ADC1,1,ADC_Channel_1);
  71.     ADC_ANY_CH_Config(ADC1,2,ADC_Channel_2);
  72.     ADC_ANY_CH_Config(ADC1,3,ADC_Channel_Vrefint);

  73.     ADC_ANY_NUM_Config(ADC1,3);//
  74.     ADC1->ANYCR |=  ADC_ANY_CR_CHANY_MDEN;//开启任意通道

  75.     ADC_TempSensorVrefintCmd(ENABLE);


  76.     //Enable ADCDMA
  77.     ADC_DMACmd(ADC1, ENABLE);
  78.     //Enable AD conversion
  79.     ADC_Cmd(ADC1, ENABLE);

  80.     ADC_SoftwareStartConvCmd(ADC1, ENABLE);

  81. }
tpgf 发表于 2022-8-2 20:23 | 显示全部楼层
这些问题有解决的了吗
磨砂 发表于 2022-8-2 20:34 | 显示全部楼层
不用的引脚都不能悬空吗
晓伍 发表于 2022-8-2 20:43 | 显示全部楼层
悬空的话电平不一定吗
八层楼 发表于 2022-8-2 20:48 | 显示全部楼层
可以设置为高阻态吗
观海 发表于 2022-8-2 20:55 | 显示全部楼层
跟选用的模式有关系
guanjiaer 发表于 2022-8-2 21:03 | 显示全部楼层
多路的话 是跑系统好 还是用dma好呢
match007 发表于 2022-8-3 20:18 | 显示全部楼层
guanjiaer 发表于 2022-8-2 21:03
多路的话 是跑系统好 还是用dma好呢

感觉实现功能就可以,没有好坏之分
Bowclad 发表于 2022-9-16 21:05 | 显示全部楼层
不用的引脚都不能悬空吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

137

帖子

0

粉丝
快速回复 返回顶部 返回列表