AM中波放送用SDR.CICフィルタのみを使用.CQ出版社「トランジスタ技術」誌,2021年4月号に掲載

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers F446_ADC_Base.cpp Source File

F446_ADC_Base.cpp

00001 //-------------------------------------------------------------
00002 //  F446 内蔵 用抽象基底クラス
00003 //      ADC2 を使用(固定)
00004 //
00005 //  2020/07/24, Copyright (c) 2020 MIKAMI, Naoki
00006 //-------------------------------------------------------------
00007 
00008 #include "F446_ADC_Base.hpp"
00009 #include "PeripheralPins.h" // PinMap_ADC を使う場合に必要
00010 #pragma diag_suppress 870   // マルチバイト文字使用の警告抑制のため
00011 // PeripheralPins.c は以下よりたどって行けば取得可能
00012 // https://gitlab.exmachina.fr/fw-libs/mbed-os/tree/5.8.1
00013 
00014 namespace Mikami
00015 {
00016     // コンストラクタ
00017     AdcF446_Base::AdcF446_Base(float fSampling, PinName pin) : myAdc_(ADC2)
00018     {
00019         // pin に対応する GPIOx_MODER をアナログ・モードに設定する
00020         pin_function(pin, STM_MODE_ANALOG);
00021         // pin_function() が定義されている pinmap.c が含まれるディレクトリ:
00022         // mbed-dev\targets\TARGET_STM
00023 
00024         __HAL_RCC_ADC2_CLK_ENABLE();    // ADC2 にクロックを供給する
00025         // __HAL_RCC_ADC2_CLK_ENABLE() の定義:stm32f4xx_hal_rcc_ex.h
00026 
00027         // 1 チャンネルのみ使用の設定
00028         myAdc_->SQR1 &= ~ADC_SQR1_L;
00029 
00030         // pin に対応するチャンネルを使うための設定
00031         myAdc_->SQR3 = STM_PIN_CHANNEL(pinmap_function(pin, PinMap_ADC));
00032         // pinmap_function() のヘッダファイル: mbed\hal\pinmap.h
00033         // STM_PIN_CHANNEL() の定義:PinNamesTypes.h
00034 
00035         // ADC の CR1 の設定
00036         myAdc_->CR1 = 0x0;      // AD 変換終了割り込みを禁止
00037         // ADC の CR2 の設定
00038         myAdc_->CR2 = ADC_EXTERNALTRIGCONVEDGE_RISING   // 外部トリガの立ち上がりで開始される
00039                     | ADC_EXTERNALTRIGCONV_T8_TRGO      // 外部トリガ: Timer8 TRGO event
00040                     | ADC_CR2_ADON;                     // ADC を有効にする
00041 
00042         // AD 変換器の外部トリガに使うタイマ (TIM8) の設定
00043         SetTim8(fSampling);
00044     }
00045 
00046     // AD 変換器の外部トリガに使うタイマ (TIM8) の設定
00047     //      fSampling  標本化周波数 [kHz]
00048     void AdcF446_Base::SetTim8(float fSampling)
00049     {
00050         __HAL_RCC_TIM8_CLK_ENABLE();    // クロック供給. "stm32f4xx_hal_rcc.h" 参照
00051         TIM_TypeDef* const TIM = TIM8;
00052 
00053         TIM->CR2 = TIM_TRGO_UPDATE;     // Update event を TRGO (trigger output) とする
00054 
00055         float arrF = (SystemCoreClock/fSampling)/1000.0f;
00056         if (arrF >65535)
00057         {
00058             fprintf(stderr, "%8.2f kHz : 標本化周波数が低すぎます.\r\n", fSampling);
00059             while (true) {}
00060         }
00061         TIM->ARR = floor(arrF + 0.5f) - 1;  // Auto-reload レジスタの設定
00062         TIM->PSC = 0;                   // Prescaler の設定
00063         TIM->CR1 = TIM_CR1_CEN;         // TIM8 を有効にする
00064     }
00065 }