STM32F446 の内蔵 ADC, DAC 用のライブラリ.このライブラリを登録した際のプログラム: Demo_DSP_ADDA. Library for build-in ADC and DAC in STM32F446.
Dependents: Demo_DSP_ADDA F446_DSP_FFT_Analyzer TrG_FFT_Analyzer DSP_MultirateLinearphase ... more
DSP_AdcBase.cpp@3:a1dcee67c67e, 2020-12-20 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Sun Dec 20 08:04:35 2020 +0000
- Revision:
- 3:a1dcee67c67e
- Parent:
- 2:7d58c617d76a
4
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:85348d58f498 | 1 | //------------------------------------------------------------- |
MikamiUitOpen | 0:85348d58f498 | 2 | // STM32F446 内蔵 ADC のための抽象基底クラス |
MikamiUitOpen | 0:85348d58f498 | 3 | // |
MikamiUitOpen | 3:a1dcee67c67e | 4 | // 2020/12/20, Copyright (c) 2020 MIKAMI, Naoki |
MikamiUitOpen | 0:85348d58f498 | 5 | //------------------------------------------------------------- |
MikamiUitOpen | 0:85348d58f498 | 6 | |
MikamiUitOpen | 0:85348d58f498 | 7 | #include "DSP_AdcBase.hpp" |
MikamiUitOpen | 0:85348d58f498 | 8 | #pragma diag_suppress 870 // マルチバイト文字使用の警告抑制のため |
MikamiUitOpen | 0:85348d58f498 | 9 | |
MikamiUitOpen | 0:85348d58f498 | 10 | namespace Mikami |
MikamiUitOpen | 0:85348d58f498 | 11 | { |
MikamiUitOpen | 0:85348d58f498 | 12 | // コンストラクタ |
MikamiUitOpen | 3:a1dcee67c67e | 13 | DspAdcBase::DspAdcBase(float fSampling, PinName pin, |
MikamiUitOpen | 0:85348d58f498 | 14 | ADC_TypeDef* const adc) |
MikamiUitOpen | 0:85348d58f498 | 15 | { |
MikamiUitOpen | 0:85348d58f498 | 16 | // このクラスのオブジェクトの複数生成禁止のため |
MikamiUitOpen | 0:85348d58f498 | 17 | MBED_ASSERT(!created_); |
MikamiUitOpen | 0:85348d58f498 | 18 | created_ = true; |
MikamiUitOpen | 0:85348d58f498 | 19 | |
MikamiUitOpen | 0:85348d58f498 | 20 | // pin に対応する ADC が存在するか確認 |
MikamiUitOpen | 0:85348d58f498 | 21 | MBED_ASSERT(PinmapMatch(pin, adc)); |
MikamiUitOpen | 0:85348d58f498 | 22 | |
MikamiUitOpen | 0:85348d58f498 | 23 | // 引数で指定された AD 変換器を使うように設定 |
MikamiUitOpen | 0:85348d58f498 | 24 | myAdc_ = adc; |
MikamiUitOpen | 0:85348d58f498 | 25 | |
MikamiUitOpen | 0:85348d58f498 | 26 | // pin に対応する GPIOx_MODER をアナログ・モードに設定する |
MikamiUitOpen | 0:85348d58f498 | 27 | pin_function(pin, STM_MODE_ANALOG); |
MikamiUitOpen | 0:85348d58f498 | 28 | // pin_function() が定義されている pinmap.c が含まれるディレクトリ: |
MikamiUitOpen | 0:85348d58f498 | 29 | // mbed-dev\targets\TARGET_STM |
MikamiUitOpen | 0:85348d58f498 | 30 | |
MikamiUitOpen | 0:85348d58f498 | 31 | // ADC にクロックを供給する |
MikamiUitOpen | 0:85348d58f498 | 32 | // クロック供給用マクロの定義:stm32f4xx_hal_rcc_ex.h |
MikamiUitOpen | 0:85348d58f498 | 33 | switch ((uint32_t)adc) |
MikamiUitOpen | 0:85348d58f498 | 34 | { |
MikamiUitOpen | 0:85348d58f498 | 35 | case ADC_1 : __HAL_RCC_ADC1_CLK_ENABLE(); break; |
MikamiUitOpen | 0:85348d58f498 | 36 | case ADC_2 : __HAL_RCC_ADC2_CLK_ENABLE(); break; |
MikamiUitOpen | 0:85348d58f498 | 37 | case ADC_3 : __HAL_RCC_ADC3_CLK_ENABLE(); break; |
MikamiUitOpen | 0:85348d58f498 | 38 | } |
MikamiUitOpen | 0:85348d58f498 | 39 | |
MikamiUitOpen | 0:85348d58f498 | 40 | // 1 チャンネルのみ使用の設定 |
MikamiUitOpen | 0:85348d58f498 | 41 | myAdc_->SQR1 &= ~ADC_SQR1_L; |
MikamiUitOpen | 0:85348d58f498 | 42 | |
MikamiUitOpen | 0:85348d58f498 | 43 | // pin に対応するチャンネルを使うための設定 |
MikamiUitOpen | 0:85348d58f498 | 44 | myAdc_->SQR3 = STM_PIN_CHANNEL(pinmap_function(pin, PinMap_ADC)); |
MikamiUitOpen | 0:85348d58f498 | 45 | // pinmap_function() のヘッダファイル: mbed\hal\pinmap.h |
MikamiUitOpen | 0:85348d58f498 | 46 | // pinmap_function() が定義されているファイル: mbed-dev\hal\mbed_pinmap_common.c |
MikamiUitOpen | 0:85348d58f498 | 47 | // STM_PIN_CHANNEL() の定義:mbed\TARGET_NUCLEO_F446RE\TOOLCHAIN_ARM_STD\ |
MikamiUitOpen | 0:85348d58f498 | 48 | // PinNamesTypes.h |
MikamiUitOpen | 0:85348d58f498 | 49 | |
MikamiUitOpen | 0:85348d58f498 | 50 | // ADC の CR1 の設定 |
MikamiUitOpen | 0:85348d58f498 | 51 | myAdc_->CR1 = 0x0; // 12bit, 非Scan モード,AD 変換終了割込みを禁止 |
MikamiUitOpen | 0:85348d58f498 | 52 | |
MikamiUitOpen | 0:85348d58f498 | 53 | // ADC の CR2 の設定 |
MikamiUitOpen | 0:85348d58f498 | 54 | myAdc_->CR2 = ADC_EXTERNALTRIGCONVEDGE_RISING // 外部トリガの立ち上がりで開始される |
MikamiUitOpen | 0:85348d58f498 | 55 | | ADC_EXTERNALTRIGCONV_T8_TRGO // 外部トリガ: Timer8 TRGO event |
MikamiUitOpen | 0:85348d58f498 | 56 | | ADC_CR2_ADON; // ADC を有効にする |
MikamiUitOpen | 0:85348d58f498 | 57 | |
MikamiUitOpen | 0:85348d58f498 | 58 | // AD 変換器の外部トリガに使うタイマ (TIM8) の設定 |
MikamiUitOpen | 2:7d58c617d76a | 59 | SetFs(fSampling); |
MikamiUitOpen | 0:85348d58f498 | 60 | } |
MikamiUitOpen | 0:85348d58f498 | 61 | |
MikamiUitOpen | 0:85348d58f498 | 62 | // AD 変換器の外部トリガに使うタイマ (TIM8) の設定 |
MikamiUitOpen | 0:85348d58f498 | 63 | // fSampling 標本化周波数 [kHz] |
MikamiUitOpen | 3:a1dcee67c67e | 64 | void DspAdcBase::SetFs(float fSampling) |
MikamiUitOpen | 0:85348d58f498 | 65 | { |
MikamiUitOpen | 0:85348d58f498 | 66 | __HAL_RCC_TIM8_CLK_ENABLE(); // クロック供給. "stm32f4xx_hal_rcc.h" 参照 |
MikamiUitOpen | 0:85348d58f498 | 67 | TIM_TypeDef* const TIM = TIM8; |
MikamiUitOpen | 0:85348d58f498 | 68 | |
MikamiUitOpen | 0:85348d58f498 | 69 | TIM->CR2 = TIM_TRGO_UPDATE; // Update event を TRGO とする |
MikamiUitOpen | 0:85348d58f498 | 70 | |
MikamiUitOpen | 0:85348d58f498 | 71 | uint32_t psc = 0; |
MikamiUitOpen | 0:85348d58f498 | 72 | uint16_t mul = 1; |
MikamiUitOpen | 0:85348d58f498 | 73 | fSampling = fSampling*1000; // Hz 単位に変換 |
MikamiUitOpen | 0:85348d58f498 | 74 | uint32_t arr; |
MikamiUitOpen | 0:85348d58f498 | 75 | while (true) |
MikamiUitOpen | 0:85348d58f498 | 76 | { |
MikamiUitOpen | 0:85348d58f498 | 77 | arr = (uint32_t)(SystemCoreClock/(mul*fSampling) + 0.5f); |
MikamiUitOpen | 0:85348d58f498 | 78 | if (arr <= 65536) break; |
MikamiUitOpen | 0:85348d58f498 | 79 | psc++; |
MikamiUitOpen | 0:85348d58f498 | 80 | mul++; |
MikamiUitOpen | 2:7d58c617d76a | 81 | MBED_ASSERT(psc <= 65536); // 標本化周波数が低すぎないかチェック |
MikamiUitOpen | 0:85348d58f498 | 82 | } |
MikamiUitOpen | 0:85348d58f498 | 83 | TIM->ARR = arr - 1; // Auto-reload レジスタの設定 |
MikamiUitOpen | 0:85348d58f498 | 84 | TIM->PSC = psc; // Prescaler の設定 |
MikamiUitOpen | 0:85348d58f498 | 85 | TIM->CR1 = TIM_CR1_CEN; // TIM8 を有効にする |
MikamiUitOpen | 0:85348d58f498 | 86 | } |
MikamiUitOpen | 0:85348d58f498 | 87 | |
MikamiUitOpen | 0:85348d58f498 | 88 | // pin に対応する AD 変換器が存在することを確認する |
MikamiUitOpen | 0:85348d58f498 | 89 | // pin A0, PA_0 など |
MikamiUitOpen | 0:85348d58f498 | 90 | // adc ADC1 など |
MikamiUitOpen | 3:a1dcee67c67e | 91 | bool DspAdcBase::PinmapMatch(PinName pin, ADC_TypeDef* const adc) |
MikamiUitOpen | 0:85348d58f498 | 92 | { |
MikamiUitOpen | 0:85348d58f498 | 93 | for (int n=0; PinMap_ADC[n].pin != NC; n++) |
MikamiUitOpen | 0:85348d58f498 | 94 | if ( ((PinMap_ADC[n].pin & 0xFF) == pin) & |
MikamiUitOpen | 0:85348d58f498 | 95 | (PinMap_ADC[n].peripheral == (uint32_t)adc) ) return true; |
MikamiUitOpen | 0:85348d58f498 | 96 | return false; |
MikamiUitOpen | 0:85348d58f498 | 97 | } |
MikamiUitOpen | 0:85348d58f498 | 98 | |
MikamiUitOpen | 0:85348d58f498 | 99 | // static メンバの実体 |
MikamiUitOpen | 3:a1dcee67c67e | 100 | ADC_TypeDef* DspAdcBase::myAdc_; |
MikamiUitOpen | 3:a1dcee67c67e | 101 | bool DspAdcBase::created_ = false; |
MikamiUitOpen | 0:85348d58f498 | 102 | } |