2017-07-17 322 views
0

我想實現stm32f303發現的ADC1,ADC2和兩個DMA ADC通道的雙常規同時模式。在雙常規同時模式下使用兩個DMA ADC通道STM32

在CubeMX例子:

兩個DMA通道(一個用於ADC主,一個用於ADC從站)的用法是 也是可能的:這是在高 ADC轉換速率和應用的情況下建議的配置使用其他DMA頻道 集中。

根據AN4195

當使用DMA,有兩種可能的情況:•使用兩個 獨立的DMA通道用於主站和從站的。每個ADC(在這種情況下, MDMA [1:0])必須保持清零狀態。第一個DMA通道用於 從ADC_DR讀取主ADC轉換後的數據,並在主ADC的每個EOC事件中生成DMA請求 。第二個DMA通道用於讀取ADC_DR的從機ADC轉換數據,並且在從機ADC的每個EOC事件中生成DMA請求。

對於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

來自CubeMx的這個引用是definitelly錯誤的。總線矩陣的10M請求如何不如5M? –

回答

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中斷。

+0

冒險時總是放棄供應商庫。 – Jeroen3