STM32F446 の内蔵 ADC, DAC を 2 チャンネルで使うためのライブラリ.このライブラリを登録した際のプログラム: Demo_DSP_ADDA_Dual. Library for build-in ADC and DAC in STM32F446 using with dual channels.
Dependents: F446_DSP_Oscilloscope Demo_DSP_ADDA_Dual TrG_Oscilloscope
DSP_AdcDualBase.cpp@0:c02c700a8ecf, 2020-09-22 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Tue Sep 22 04:52:53 2020 +0000
- Revision:
- 0:c02c700a8ecf
- Child:
- 1:e1c5baa559de
1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:c02c700a8ecf | 1 | //---------------------------------------------------------- |
MikamiUitOpen | 0:c02c700a8ecf | 2 | // STM32F446 の ADC2, ADC3 を使って同時に AD 変換を開始し, |
MikamiUitOpen | 0:c02c700a8ecf | 3 | // アナログ信号を入力するための抽象クラス |
MikamiUitOpen | 0:c02c700a8ecf | 4 | // CH1 は ADC2 を使用 |
MikamiUitOpen | 0:c02c700a8ecf | 5 | // CH2 は ADC3 を使用 |
MikamiUitOpen | 0:c02c700a8ecf | 6 | // Read(), Write() の引数: |
MikamiUitOpen | 0:c02c700a8ecf | 7 | // 第一引数:CH1,第二引数:CH2 |
MikamiUitOpen | 0:c02c700a8ecf | 8 | // |
MikamiUitOpen | 0:c02c700a8ecf | 9 | // 2020/09/22, Copyright (c) 2020 MIKAMI, Naoki |
MikamiUitOpen | 0:c02c700a8ecf | 10 | //---------------------------------------------------------- |
MikamiUitOpen | 0:c02c700a8ecf | 11 | |
MikamiUitOpen | 0:c02c700a8ecf | 12 | #include "DSP_AdcDualBase.hpp" |
MikamiUitOpen | 0:c02c700a8ecf | 13 | #pragma diag_suppress 870 // マルチバイト文字使用の警告抑制のため |
MikamiUitOpen | 0:c02c700a8ecf | 14 | |
MikamiUitOpen | 0:c02c700a8ecf | 15 | namespace Mikami |
MikamiUitOpen | 0:c02c700a8ecf | 16 | { |
MikamiUitOpen | 0:c02c700a8ecf | 17 | DspAdcDualBase::DspAdcDualBase(float fSampling, |
MikamiUitOpen | 0:c02c700a8ecf | 18 | PinName pinCh1, PinName pinCh2) |
MikamiUitOpen | 0:c02c700a8ecf | 19 | : adcCh1_(ADC2), adcCh2_(ADC3) |
MikamiUitOpen | 0:c02c700a8ecf | 20 | { |
MikamiUitOpen | 0:c02c700a8ecf | 21 | // pin に対応する ADC が存在するか確認 |
MikamiUitOpen | 0:c02c700a8ecf | 22 | MBED_ASSERT(PinmapMatch(pinCh1, adcCh1_)); |
MikamiUitOpen | 0:c02c700a8ecf | 23 | MBED_ASSERT(PinmapMatch(pinCh2, adcCh2_)); |
MikamiUitOpen | 0:c02c700a8ecf | 24 | |
MikamiUitOpen | 0:c02c700a8ecf | 25 | // ピンに対応する GPIOx_MODER をアナログ・モードに設定する |
MikamiUitOpen | 0:c02c700a8ecf | 26 | pin_function(pinCh1, STM_MODE_ANALOG); |
MikamiUitOpen | 0:c02c700a8ecf | 27 | pin_function(pinCh2, STM_MODE_ANALOG); |
MikamiUitOpen | 0:c02c700a8ecf | 28 | // pin_function() が定義されている pinmap.c が含まれるディレクトリ: |
MikamiUitOpen | 0:c02c700a8ecf | 29 | // mbed-dev\targets\TARGET_STM |
MikamiUitOpen | 0:c02c700a8ecf | 30 | |
MikamiUitOpen | 0:c02c700a8ecf | 31 | // ADC にクロックを供給する |
MikamiUitOpen | 0:c02c700a8ecf | 32 | __HAL_RCC_ADC2_CLK_ENABLE(); |
MikamiUitOpen | 0:c02c700a8ecf | 33 | __HAL_RCC_ADC3_CLK_ENABLE(); |
MikamiUitOpen | 0:c02c700a8ecf | 34 | // クロック供給用マクロの定義:stm32f4xx_hal_rcc_ex.h |
MikamiUitOpen | 0:c02c700a8ecf | 35 | |
MikamiUitOpen | 0:c02c700a8ecf | 36 | Initialize(adcCh1_, pinCh1); // ADC2 の初期設定 |
MikamiUitOpen | 0:c02c700a8ecf | 37 | Initialize(adcCh2_, pinCh2); // ADC3 の初期設定 |
MikamiUitOpen | 0:c02c700a8ecf | 38 | ADC->CCR = 0x0; // ADC 共通の設定, 念のため |
MikamiUitOpen | 0:c02c700a8ecf | 39 | |
MikamiUitOpen | 0:c02c700a8ecf | 40 | // AD 変換器の外部トリガに使うタイマ (TIM8) の設定 |
MikamiUitOpen | 0:c02c700a8ecf | 41 | SetTim8(fSampling); |
MikamiUitOpen | 0:c02c700a8ecf | 42 | } |
MikamiUitOpen | 0:c02c700a8ecf | 43 | |
MikamiUitOpen | 0:c02c700a8ecf | 44 | // AD 変換器の初期設定 |
MikamiUitOpen | 0:c02c700a8ecf | 45 | void DspAdcDualBase::Initialize(ADC_TypeDef* adc, PinName pin) |
MikamiUitOpen | 0:c02c700a8ecf | 46 | { |
MikamiUitOpen | 0:c02c700a8ecf | 47 | // 一つの ADC につき,1 チャンネルのみ使用の設定 |
MikamiUitOpen | 0:c02c700a8ecf | 48 | adc->SQR1 &= ~ADC_SQR1_L; |
MikamiUitOpen | 0:c02c700a8ecf | 49 | |
MikamiUitOpen | 0:c02c700a8ecf | 50 | // pin に対応するチャンネルを使うための設定 |
MikamiUitOpen | 0:c02c700a8ecf | 51 | adc->SQR3 = STM_PIN_CHANNEL(pinmap_function(pin, PinMap_ADC)); |
MikamiUitOpen | 0:c02c700a8ecf | 52 | // pinmap_function() のヘッダファイル: mbed\hal\pinmap.h |
MikamiUitOpen | 0:c02c700a8ecf | 53 | // pinmap_function() が定義されているファイル: mbed-dev\hal\mbed_pinmap_common.c |
MikamiUitOpen | 0:c02c700a8ecf | 54 | // STM_PIN_CHANNEL() の定義:mbed\TARGET_NUCLEO_F446RE\TOOLCHAIN_ARM_STD\ |
MikamiUitOpen | 0:c02c700a8ecf | 55 | // PinNamesTypes.h |
MikamiUitOpen | 0:c02c700a8ecf | 56 | |
MikamiUitOpen | 0:c02c700a8ecf | 57 | // ADC の CR1 の設定 |
MikamiUitOpen | 0:c02c700a8ecf | 58 | adc->CR1 = 0x0; // 12bit, 非Scan モード,AD 変換終了割込みを禁止 |
MikamiUitOpen | 0:c02c700a8ecf | 59 | |
MikamiUitOpen | 0:c02c700a8ecf | 60 | // ADC の CR2 の設定 |
MikamiUitOpen | 0:c02c700a8ecf | 61 | adc->CR2 = ADC_EXTERNALTRIGCONVEDGE_RISING // 外部トリガの立ち上がりで開始される |
MikamiUitOpen | 0:c02c700a8ecf | 62 | | ADC_EXTERNALTRIGCONV_T8_TRGO // 外部トリガ: Timer8 TRGO event |
MikamiUitOpen | 0:c02c700a8ecf | 63 | | ADC_CR2_ADON; // ADC を有効にする |
MikamiUitOpen | 0:c02c700a8ecf | 64 | } |
MikamiUitOpen | 0:c02c700a8ecf | 65 | |
MikamiUitOpen | 0:c02c700a8ecf | 66 | // AD 変換器の外部トリガに使うタイマ (TIM8) の設定 |
MikamiUitOpen | 0:c02c700a8ecf | 67 | // fSampling 標本化周波数 [kHz] |
MikamiUitOpen | 0:c02c700a8ecf | 68 | void DspAdcDualBase::SetTim8(float fSampling) |
MikamiUitOpen | 0:c02c700a8ecf | 69 | { |
MikamiUitOpen | 0:c02c700a8ecf | 70 | __HAL_RCC_TIM8_CLK_ENABLE(); // クロック供給. "stm32f4xx_hal_rcc.h" 参照 |
MikamiUitOpen | 0:c02c700a8ecf | 71 | TIM_TypeDef* const TIM = TIM8; |
MikamiUitOpen | 0:c02c700a8ecf | 72 | |
MikamiUitOpen | 0:c02c700a8ecf | 73 | TIM->CR2 = TIM_TRGO_UPDATE; // Update event を TRGO とする |
MikamiUitOpen | 0:c02c700a8ecf | 74 | |
MikamiUitOpen | 0:c02c700a8ecf | 75 | uint32_t psc = 0; |
MikamiUitOpen | 0:c02c700a8ecf | 76 | uint16_t mul = 1; |
MikamiUitOpen | 0:c02c700a8ecf | 77 | fSampling = fSampling*1000; // Hz 単位に変換 |
MikamiUitOpen | 0:c02c700a8ecf | 78 | uint32_t arr; |
MikamiUitOpen | 0:c02c700a8ecf | 79 | while (true) |
MikamiUitOpen | 0:c02c700a8ecf | 80 | { |
MikamiUitOpen | 0:c02c700a8ecf | 81 | arr = (uint32_t)(SystemCoreClock/(mul*fSampling) + 0.5f); |
MikamiUitOpen | 0:c02c700a8ecf | 82 | if (arr <= 65536) break; |
MikamiUitOpen | 0:c02c700a8ecf | 83 | psc++; |
MikamiUitOpen | 0:c02c700a8ecf | 84 | mul++; |
MikamiUitOpen | 0:c02c700a8ecf | 85 | if (psc > 65535) |
MikamiUitOpen | 0:c02c700a8ecf | 86 | { |
MikamiUitOpen | 0:c02c700a8ecf | 87 | fprintf(stderr, "%8.2f kHz : 標本化周波数が低すぎます.\r\n", |
MikamiUitOpen | 0:c02c700a8ecf | 88 | fSampling); |
MikamiUitOpen | 0:c02c700a8ecf | 89 | mbed_die(); // ボードの緑色 LED を点滅させる |
MikamiUitOpen | 0:c02c700a8ecf | 90 | } |
MikamiUitOpen | 0:c02c700a8ecf | 91 | } |
MikamiUitOpen | 0:c02c700a8ecf | 92 | TIM->ARR = arr - 1; // Auto-reload レジスタの設定 |
MikamiUitOpen | 0:c02c700a8ecf | 93 | TIM->PSC = psc; // Prescaler の設定 |
MikamiUitOpen | 0:c02c700a8ecf | 94 | TIM->CR1 = TIM_CR1_CEN; // TIM8 を有効にする |
MikamiUitOpen | 0:c02c700a8ecf | 95 | } |
MikamiUitOpen | 0:c02c700a8ecf | 96 | |
MikamiUitOpen | 0:c02c700a8ecf | 97 | // pin に対応する AD 変換器が存在することを確認する |
MikamiUitOpen | 0:c02c700a8ecf | 98 | // pin A0, PA_0 など |
MikamiUitOpen | 0:c02c700a8ecf | 99 | // adc ADC1 など |
MikamiUitOpen | 0:c02c700a8ecf | 100 | bool DspAdcDualBase::PinmapMatch(PinName pin, ADC_TypeDef* const adc) |
MikamiUitOpen | 0:c02c700a8ecf | 101 | { |
MikamiUitOpen | 0:c02c700a8ecf | 102 | for (int n=0; PinMap_ADC[n].pin != NC; n++) |
MikamiUitOpen | 0:c02c700a8ecf | 103 | if ( ((PinMap_ADC[n].pin & 0xFF) == pin) & |
MikamiUitOpen | 0:c02c700a8ecf | 104 | (PinMap_ADC[n].peripheral == (uint32_t)adc) ) return true; |
MikamiUitOpen | 0:c02c700a8ecf | 105 | return false; |
MikamiUitOpen | 0:c02c700a8ecf | 106 | } |
MikamiUitOpen | 0:c02c700a8ecf | 107 | } |