不韋 呂
/
SDR_AM_Rx_CIC_FIR
AM中波放送用SDR.CICフィルタのみを使用.CQ出版社「トランジスタ技術」誌,2021年4月号に掲載
SDR_Library/F446_ADC_Base.cpp@2:63fbcf115b88, 2021-12-01 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Wed Dec 01 00:53:09 2021 +0000
- Revision:
- 2:63fbcf115b88
- Parent:
- 0:9c28f5905a1a
3
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:9c28f5905a1a | 1 | //------------------------------------------------------------- |
MikamiUitOpen | 0:9c28f5905a1a | 2 | // F446 内蔵 用抽象基底クラス |
MikamiUitOpen | 0:9c28f5905a1a | 3 | // ADC2 を使用(固定) |
MikamiUitOpen | 0:9c28f5905a1a | 4 | // |
MikamiUitOpen | 0:9c28f5905a1a | 5 | // 2020/07/24, Copyright (c) 2020 MIKAMI, Naoki |
MikamiUitOpen | 0:9c28f5905a1a | 6 | //------------------------------------------------------------- |
MikamiUitOpen | 0:9c28f5905a1a | 7 | |
MikamiUitOpen | 0:9c28f5905a1a | 8 | #include "F446_ADC_Base.hpp" |
MikamiUitOpen | 0:9c28f5905a1a | 9 | #include "PeripheralPins.h" // PinMap_ADC を使う場合に必要 |
MikamiUitOpen | 0:9c28f5905a1a | 10 | #pragma diag_suppress 870 // マルチバイト文字使用の警告抑制のため |
MikamiUitOpen | 0:9c28f5905a1a | 11 | // PeripheralPins.c は以下よりたどって行けば取得可能 |
MikamiUitOpen | 0:9c28f5905a1a | 12 | // https://gitlab.exmachina.fr/fw-libs/mbed-os/tree/5.8.1 |
MikamiUitOpen | 0:9c28f5905a1a | 13 | |
MikamiUitOpen | 0:9c28f5905a1a | 14 | namespace Mikami |
MikamiUitOpen | 0:9c28f5905a1a | 15 | { |
MikamiUitOpen | 0:9c28f5905a1a | 16 | // コンストラクタ |
MikamiUitOpen | 0:9c28f5905a1a | 17 | AdcF446_Base::AdcF446_Base(float fSampling, PinName pin) : myAdc_(ADC2) |
MikamiUitOpen | 0:9c28f5905a1a | 18 | { |
MikamiUitOpen | 0:9c28f5905a1a | 19 | // pin に対応する GPIOx_MODER をアナログ・モードに設定する |
MikamiUitOpen | 0:9c28f5905a1a | 20 | pin_function(pin, STM_MODE_ANALOG); |
MikamiUitOpen | 0:9c28f5905a1a | 21 | // pin_function() が定義されている pinmap.c が含まれるディレクトリ: |
MikamiUitOpen | 0:9c28f5905a1a | 22 | // mbed-dev\targets\TARGET_STM |
MikamiUitOpen | 0:9c28f5905a1a | 23 | |
MikamiUitOpen | 0:9c28f5905a1a | 24 | __HAL_RCC_ADC2_CLK_ENABLE(); // ADC2 にクロックを供給する |
MikamiUitOpen | 0:9c28f5905a1a | 25 | // __HAL_RCC_ADC2_CLK_ENABLE() の定義:stm32f4xx_hal_rcc_ex.h |
MikamiUitOpen | 0:9c28f5905a1a | 26 | |
MikamiUitOpen | 0:9c28f5905a1a | 27 | // 1 チャンネルのみ使用の設定 |
MikamiUitOpen | 0:9c28f5905a1a | 28 | myAdc_->SQR1 &= ~ADC_SQR1_L; |
MikamiUitOpen | 0:9c28f5905a1a | 29 | |
MikamiUitOpen | 0:9c28f5905a1a | 30 | // pin に対応するチャンネルを使うための設定 |
MikamiUitOpen | 0:9c28f5905a1a | 31 | myAdc_->SQR3 = STM_PIN_CHANNEL(pinmap_function(pin, PinMap_ADC)); |
MikamiUitOpen | 0:9c28f5905a1a | 32 | // pinmap_function() のヘッダファイル: mbed\hal\pinmap.h |
MikamiUitOpen | 0:9c28f5905a1a | 33 | // STM_PIN_CHANNEL() の定義:PinNamesTypes.h |
MikamiUitOpen | 0:9c28f5905a1a | 34 | |
MikamiUitOpen | 0:9c28f5905a1a | 35 | // ADC の CR1 の設定 |
MikamiUitOpen | 0:9c28f5905a1a | 36 | myAdc_->CR1 = 0x0; // AD 変換終了割り込みを禁止 |
MikamiUitOpen | 0:9c28f5905a1a | 37 | // ADC の CR2 の設定 |
MikamiUitOpen | 0:9c28f5905a1a | 38 | myAdc_->CR2 = ADC_EXTERNALTRIGCONVEDGE_RISING // 外部トリガの立ち上がりで開始される |
MikamiUitOpen | 0:9c28f5905a1a | 39 | | ADC_EXTERNALTRIGCONV_T8_TRGO // 外部トリガ: Timer8 TRGO event |
MikamiUitOpen | 0:9c28f5905a1a | 40 | | ADC_CR2_ADON; // ADC を有効にする |
MikamiUitOpen | 0:9c28f5905a1a | 41 | |
MikamiUitOpen | 0:9c28f5905a1a | 42 | // AD 変換器の外部トリガに使うタイマ (TIM8) の設定 |
MikamiUitOpen | 0:9c28f5905a1a | 43 | SetTim8(fSampling); |
MikamiUitOpen | 0:9c28f5905a1a | 44 | } |
MikamiUitOpen | 0:9c28f5905a1a | 45 | |
MikamiUitOpen | 0:9c28f5905a1a | 46 | // AD 変換器の外部トリガに使うタイマ (TIM8) の設定 |
MikamiUitOpen | 0:9c28f5905a1a | 47 | // fSampling 標本化周波数 [kHz] |
MikamiUitOpen | 0:9c28f5905a1a | 48 | void AdcF446_Base::SetTim8(float fSampling) |
MikamiUitOpen | 0:9c28f5905a1a | 49 | { |
MikamiUitOpen | 0:9c28f5905a1a | 50 | __HAL_RCC_TIM8_CLK_ENABLE(); // クロック供給. "stm32f4xx_hal_rcc.h" 参照 |
MikamiUitOpen | 0:9c28f5905a1a | 51 | TIM_TypeDef* const TIM = TIM8; |
MikamiUitOpen | 0:9c28f5905a1a | 52 | |
MikamiUitOpen | 0:9c28f5905a1a | 53 | TIM->CR2 = TIM_TRGO_UPDATE; // Update event を TRGO (trigger output) とする |
MikamiUitOpen | 0:9c28f5905a1a | 54 | |
MikamiUitOpen | 0:9c28f5905a1a | 55 | float arrF = (SystemCoreClock/fSampling)/1000.0f; |
MikamiUitOpen | 0:9c28f5905a1a | 56 | if (arrF >65535) |
MikamiUitOpen | 0:9c28f5905a1a | 57 | { |
MikamiUitOpen | 0:9c28f5905a1a | 58 | fprintf(stderr, "%8.2f kHz : 標本化周波数が低すぎます.\r\n", fSampling); |
MikamiUitOpen | 0:9c28f5905a1a | 59 | while (true) {} |
MikamiUitOpen | 0:9c28f5905a1a | 60 | } |
MikamiUitOpen | 0:9c28f5905a1a | 61 | TIM->ARR = floor(arrF + 0.5f) - 1; // Auto-reload レジスタの設定 |
MikamiUitOpen | 0:9c28f5905a1a | 62 | TIM->PSC = 0; // Prescaler の設定 |
MikamiUitOpen | 0:9c28f5905a1a | 63 | TIM->CR1 = TIM_CR1_CEN; // TIM8 を有効にする |
MikamiUitOpen | 0:9c28f5905a1a | 64 | } |
MikamiUitOpen | 0:9c28f5905a1a | 65 | } |