不韋 呂
/
SDR_AM_Rx_CIC
AM中波放送用SDR.CICフィルタのみを使用.CQ出版社「トランジスタ技術」誌,2021年4月号に掲載
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Fri Jul 22 2022 13:23:28 by 1.7.2