2017-07-17 334 views
0

ADC1、ADC2、および2つのDMA ADCチャネルのデュアルレギュラー同時モードをstm32f303ディスカバリで実装したいとします。 CubeMX例でデュアルレギュラー同時モードで2つのDMA ADCチャネルの使用STM32

:2つのDMAチャネル(ADCマスターのための1つ、ADCスレーブ用)の

使用も可能 である:これは、高 ADCの変換速度とアプリケーションの場合に推奨される構成であります他のDMAチャネル を集中的に使用します。マスタとスレーブのための2つの別々の DMAチャンネルの•使用:

AN4195

DMAを使用してによれば、2つの可能な場合があります。各ADC(この場合は、 、MDMA [1:0])をクリアしたままにしておく必要があります。第1のDMAチャネルは、ADC_DRからのマスターADC変換データを が読み取るために使用され、DMA要求 は、マスターADCの各EOCイベントで生成されます。第2のDMA チャネルは、ADC_DRからスレーブADC変換データを読み取るために使用され、 スレーブADCの各EOCイベントでDMA要求が生成されます。

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つのチャンネルを実行することができます:1つのチャネルコードの場合

?偉大なHALライブラリを:) - 私は

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からのこの見積もりは間違っています。バスマトリクスの負荷が5Mよりも10M要求の集中度は低いですか? –

答えて

1

おかしい動作していない独立したモードのような

何かを理解することができるようHAL_ADCEx_MultiModeStart_DMAは1つのチャンネル用です。これは私の動作コードです。インターリーブモード - 2回の変換(マスターとスレーブ)あたり1つの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; 

DMA1転送が終了すると、DMA1_Channel1割り込みが呼び出されます。

+0

冒険に行くときは、常にベンダーのライブラリを削除してください。 – Jeroen3

関連する問題