我想实现ADC1,ADC2和stm32f303发现的两个DMA ADC通道的双常规同时模式。
在CubeMX示例中:
使用两个DMA通道(一个用于ADC主站,一个用于ADC从站) 也可能:这是推荐的配置,以防万一 ADC转换速率和使用其他DMA通道的应用程序 集中。
根据AN4195
使用DMA时,有两种可能的情况:•使用两种情况 用于主站和从站的单独DMA通道。每个ADC(在这种情况下, MDMA [1:0])必须保持清除状态。第一个DMA通道用于 从ADC_DR读取主ADC转换数据和DMA请求 在主ADC的每个EOC事件中生成。第二个DMA 通道用于从ADC_DR读取从ADC转换的数据,和 DMA请求在从ADC的每个EOC事件中生成。
对于1通道代码:
HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);
HAL_ADCEx_Calibration_Start(&hadc2, ADC_SINGLE_ENDED);
HAL_ADC_Start(&hadc2);
HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t*)buffer, 3);
但我们如何运行2个频道? HAL_ADCEx_MultiModeStart_DMA用于1个频道,我可以理解
独立模式之类的东西无效
HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);
HAL_ADCEx_Calibration_Start(&hadc2, ADC_SINGLE_ENDED);
HAL_ADC_Start(&hadc2);
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)ADC1_data,sizeof(ADC1_data)/sizeof(ADC1_data[0]));
HAL_ADC_Start_DMA(&hadc2,(uint32_t*)ADC2_data,sizeof(ADC2_data)/sizeof(ADC2_data[0]));
答案 0 :(得分:1)
搞笑 - 很棒的HAL库:)。这是我的工作代码:交错模式 - 每两次转换一次DMA传输半字(主和从)。 8位分辨率。注册版
DMA1_Channel1 -> CPAR = (uint32_t)&(ADC12_COMMON -> CDR);
DMA1_Channel1 -> CMAR = (uint32_t)&obuff[0][0];
DMA1_Channel1 -> CNDTR = 1 * 1024;
DMA1_Channel1 -> CCR = DMA_CCR_MINC | DMA_CCR_TCIE | DMA_CCR_EN | DMA_CCR_MSIZE_0 | DMA_CCR_PSIZE_0 | DMA_CCR_TEIE | (DMA_CCR_PL_Msk);
ADC12_COMMON -> CCR = (0b11 << ADC12_CCR_MDMA_Pos) | (0b111 << ADC12_CCR_MULTI_Pos);
ADC1 -> CFGR = ADC_CFGR_DMAEN | (0b10 << ADC_CFGR_RES_Pos);
ADC1 -> CFGR &= ~(ADC_CFGR_EXTEN_Msk | ADC_CFGR_EXTSEL_Msk); // software trigger only , converting as fast as possible
ADC1 -> CFGR |= ADC_CFGR_CONT;
ADC1 -> SMPR1 = 0;
ADC1 -> SMPR2 = 0;
ADC1 -> SQR1 &= ~(ADC_SQR1_L_Msk);
ADC1 -> SQR1 &= ~(ADC_SQR1_SQ1_Msk);
ADC1 -> SQR1 |= (1 << ADC_SQR1_SQ1_Pos);
ADC2 -> CFGR = ADC_CFGR_DMAEN | (0b10 << ADC_CFGR_RES_Pos);
ADC2 -> SMPR1 = 0;
ADC2 -> SMPR2 = 0;
ADC2 -> SQR1 &= ~(ADC_SQR1_L_Msk);
ADC2 -> SQR1 &= ~(ADC_SQR1_SQ1_Msk);
ADC2 -> SQR1 |= (1 << ADC_SQR1_SQ1_Pos);
ADC1 -> CR |= ADC_CR_ADSTART;
DMA完成传输时调用DMA1_Channel1中断。
答案 1 :(得分:1)
我不确定100%是否也适用于F3系列,但是我已经为F103C8编写了有关ADC双常规同时模式的摘要: http://www.bepat.de/2020/11/27/stm32f103c8-adc-dual-regular-simultaneous-mode/ 也许您会发现它很有帮助。
简而言之,我想您以错误的方式启动了ADC。 在ADC1开始之前,需要以正常模式启动ADC2
HAL_ADC_Start(&hadc2);
随后使用以下命令启动ADC1:
HAL_ADCEx_MultiModeStart_DMA(&hadc1, ADC_Buffer, ADC_BufferSize);