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

Committer:
MikamiUitOpen
Date:
Sun Dec 20 08:04:35 2020 +0000
Revision:
3:a1dcee67c67e
Parent:
2:7d58c617d76a
4

Who changed what in which revision?

UserRevisionLine numberNew 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 }