STM32F446 の内蔵 ADC, DAC を 2 チャンネルで使うためのライブラリ.このライブラリを登録した際のプログラム: Demo_DSP_ADDA_Dual. Library for build-in ADC and DAC in STM32F446 using with dual channels.

Dependents:   F446_DSP_Oscilloscope Demo_DSP_ADDA_Dual TrG_Oscilloscope

Committer:
MikamiUitOpen
Date:
Tue Sep 22 04:52:53 2020 +0000
Revision:
0:c02c700a8ecf
Child:
1:e1c5baa559de
1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:c02c700a8ecf 1 //----------------------------------------------------------
MikamiUitOpen 0:c02c700a8ecf 2 // STM32F446 の ADC2, ADC3 を使って同時に AD 変換を開始し,
MikamiUitOpen 0:c02c700a8ecf 3 // アナログ信号を入力するための抽象クラス
MikamiUitOpen 0:c02c700a8ecf 4 // CH1 は ADC2 を使用
MikamiUitOpen 0:c02c700a8ecf 5 // CH2 は ADC3 を使用
MikamiUitOpen 0:c02c700a8ecf 6 // Read(), Write() の引数:
MikamiUitOpen 0:c02c700a8ecf 7 // 第一引数:CH1,第二引数:CH2
MikamiUitOpen 0:c02c700a8ecf 8 //
MikamiUitOpen 0:c02c700a8ecf 9 // 2020/09/22, Copyright (c) 2020 MIKAMI, Naoki
MikamiUitOpen 0:c02c700a8ecf 10 //----------------------------------------------------------
MikamiUitOpen 0:c02c700a8ecf 11
MikamiUitOpen 0:c02c700a8ecf 12 #include "DSP_AdcDualBase.hpp"
MikamiUitOpen 0:c02c700a8ecf 13 #pragma diag_suppress 870 // マルチバイト文字使用の警告抑制のため
MikamiUitOpen 0:c02c700a8ecf 14
MikamiUitOpen 0:c02c700a8ecf 15 namespace Mikami
MikamiUitOpen 0:c02c700a8ecf 16 {
MikamiUitOpen 0:c02c700a8ecf 17 DspAdcDualBase::DspAdcDualBase(float fSampling,
MikamiUitOpen 0:c02c700a8ecf 18 PinName pinCh1, PinName pinCh2)
MikamiUitOpen 0:c02c700a8ecf 19 : adcCh1_(ADC2), adcCh2_(ADC3)
MikamiUitOpen 0:c02c700a8ecf 20 {
MikamiUitOpen 0:c02c700a8ecf 21 // pin に対応する ADC が存在するか確認
MikamiUitOpen 0:c02c700a8ecf 22 MBED_ASSERT(PinmapMatch(pinCh1, adcCh1_));
MikamiUitOpen 0:c02c700a8ecf 23 MBED_ASSERT(PinmapMatch(pinCh2, adcCh2_));
MikamiUitOpen 0:c02c700a8ecf 24
MikamiUitOpen 0:c02c700a8ecf 25 // ピンに対応する GPIOx_MODER をアナログ・モードに設定する
MikamiUitOpen 0:c02c700a8ecf 26 pin_function(pinCh1, STM_MODE_ANALOG);
MikamiUitOpen 0:c02c700a8ecf 27 pin_function(pinCh2, STM_MODE_ANALOG);
MikamiUitOpen 0:c02c700a8ecf 28 // pin_function() が定義されている pinmap.c が含まれるディレクトリ:
MikamiUitOpen 0:c02c700a8ecf 29 // mbed-dev\targets\TARGET_STM
MikamiUitOpen 0:c02c700a8ecf 30
MikamiUitOpen 0:c02c700a8ecf 31 // ADC にクロックを供給する
MikamiUitOpen 0:c02c700a8ecf 32 __HAL_RCC_ADC2_CLK_ENABLE();
MikamiUitOpen 0:c02c700a8ecf 33 __HAL_RCC_ADC3_CLK_ENABLE();
MikamiUitOpen 0:c02c700a8ecf 34 // クロック供給用マクロの定義:stm32f4xx_hal_rcc_ex.h
MikamiUitOpen 0:c02c700a8ecf 35
MikamiUitOpen 0:c02c700a8ecf 36 Initialize(adcCh1_, pinCh1); // ADC2 の初期設定
MikamiUitOpen 0:c02c700a8ecf 37 Initialize(adcCh2_, pinCh2); // ADC3 の初期設定
MikamiUitOpen 0:c02c700a8ecf 38 ADC->CCR = 0x0; // ADC 共通の設定, 念のため
MikamiUitOpen 0:c02c700a8ecf 39
MikamiUitOpen 0:c02c700a8ecf 40 // AD 変換器の外部トリガに使うタイマ (TIM8) の設定
MikamiUitOpen 0:c02c700a8ecf 41 SetTim8(fSampling);
MikamiUitOpen 0:c02c700a8ecf 42 }
MikamiUitOpen 0:c02c700a8ecf 43
MikamiUitOpen 0:c02c700a8ecf 44 // AD 変換器の初期設定
MikamiUitOpen 0:c02c700a8ecf 45 void DspAdcDualBase::Initialize(ADC_TypeDef* adc, PinName pin)
MikamiUitOpen 0:c02c700a8ecf 46 {
MikamiUitOpen 0:c02c700a8ecf 47 // 一つの ADC につき,1 チャンネルのみ使用の設定
MikamiUitOpen 0:c02c700a8ecf 48 adc->SQR1 &= ~ADC_SQR1_L;
MikamiUitOpen 0:c02c700a8ecf 49
MikamiUitOpen 0:c02c700a8ecf 50 // pin に対応するチャンネルを使うための設定
MikamiUitOpen 0:c02c700a8ecf 51 adc->SQR3 = STM_PIN_CHANNEL(pinmap_function(pin, PinMap_ADC));
MikamiUitOpen 0:c02c700a8ecf 52 // pinmap_function() のヘッダファイル: mbed\hal\pinmap.h
MikamiUitOpen 0:c02c700a8ecf 53 // pinmap_function() が定義されているファイル: mbed-dev\hal\mbed_pinmap_common.c
MikamiUitOpen 0:c02c700a8ecf 54 // STM_PIN_CHANNEL() の定義:mbed\TARGET_NUCLEO_F446RE\TOOLCHAIN_ARM_STD\
MikamiUitOpen 0:c02c700a8ecf 55 // PinNamesTypes.h
MikamiUitOpen 0:c02c700a8ecf 56
MikamiUitOpen 0:c02c700a8ecf 57 // ADC の CR1 の設定
MikamiUitOpen 0:c02c700a8ecf 58 adc->CR1 = 0x0; // 12bit, 非Scan モード,AD 変換終了割込みを禁止
MikamiUitOpen 0:c02c700a8ecf 59
MikamiUitOpen 0:c02c700a8ecf 60 // ADC の CR2 の設定
MikamiUitOpen 0:c02c700a8ecf 61 adc->CR2 = ADC_EXTERNALTRIGCONVEDGE_RISING // 外部トリガの立ち上がりで開始される
MikamiUitOpen 0:c02c700a8ecf 62 | ADC_EXTERNALTRIGCONV_T8_TRGO // 外部トリガ: Timer8 TRGO event
MikamiUitOpen 0:c02c700a8ecf 63 | ADC_CR2_ADON; // ADC を有効にする
MikamiUitOpen 0:c02c700a8ecf 64 }
MikamiUitOpen 0:c02c700a8ecf 65
MikamiUitOpen 0:c02c700a8ecf 66 // AD 変換器の外部トリガに使うタイマ (TIM8) の設定
MikamiUitOpen 0:c02c700a8ecf 67 // fSampling 標本化周波数 [kHz]
MikamiUitOpen 0:c02c700a8ecf 68 void DspAdcDualBase::SetTim8(float fSampling)
MikamiUitOpen 0:c02c700a8ecf 69 {
MikamiUitOpen 0:c02c700a8ecf 70 __HAL_RCC_TIM8_CLK_ENABLE(); // クロック供給. "stm32f4xx_hal_rcc.h" 参照
MikamiUitOpen 0:c02c700a8ecf 71 TIM_TypeDef* const TIM = TIM8;
MikamiUitOpen 0:c02c700a8ecf 72
MikamiUitOpen 0:c02c700a8ecf 73 TIM->CR2 = TIM_TRGO_UPDATE; // Update event を TRGO とする
MikamiUitOpen 0:c02c700a8ecf 74
MikamiUitOpen 0:c02c700a8ecf 75 uint32_t psc = 0;
MikamiUitOpen 0:c02c700a8ecf 76 uint16_t mul = 1;
MikamiUitOpen 0:c02c700a8ecf 77 fSampling = fSampling*1000; // Hz 単位に変換
MikamiUitOpen 0:c02c700a8ecf 78 uint32_t arr;
MikamiUitOpen 0:c02c700a8ecf 79 while (true)
MikamiUitOpen 0:c02c700a8ecf 80 {
MikamiUitOpen 0:c02c700a8ecf 81 arr = (uint32_t)(SystemCoreClock/(mul*fSampling) + 0.5f);
MikamiUitOpen 0:c02c700a8ecf 82 if (arr <= 65536) break;
MikamiUitOpen 0:c02c700a8ecf 83 psc++;
MikamiUitOpen 0:c02c700a8ecf 84 mul++;
MikamiUitOpen 0:c02c700a8ecf 85 if (psc > 65535)
MikamiUitOpen 0:c02c700a8ecf 86 {
MikamiUitOpen 0:c02c700a8ecf 87 fprintf(stderr, "%8.2f kHz : 標本化周波数が低すぎます.\r\n",
MikamiUitOpen 0:c02c700a8ecf 88 fSampling);
MikamiUitOpen 0:c02c700a8ecf 89 mbed_die(); // ボードの緑色 LED を点滅させる
MikamiUitOpen 0:c02c700a8ecf 90 }
MikamiUitOpen 0:c02c700a8ecf 91 }
MikamiUitOpen 0:c02c700a8ecf 92 TIM->ARR = arr - 1; // Auto-reload レジスタの設定
MikamiUitOpen 0:c02c700a8ecf 93 TIM->PSC = psc; // Prescaler の設定
MikamiUitOpen 0:c02c700a8ecf 94 TIM->CR1 = TIM_CR1_CEN; // TIM8 を有効にする
MikamiUitOpen 0:c02c700a8ecf 95 }
MikamiUitOpen 0:c02c700a8ecf 96
MikamiUitOpen 0:c02c700a8ecf 97 // pin に対応する AD 変換器が存在することを確認する
MikamiUitOpen 0:c02c700a8ecf 98 // pin A0, PA_0 など
MikamiUitOpen 0:c02c700a8ecf 99 // adc ADC1 など
MikamiUitOpen 0:c02c700a8ecf 100 bool DspAdcDualBase::PinmapMatch(PinName pin, ADC_TypeDef* const adc)
MikamiUitOpen 0:c02c700a8ecf 101 {
MikamiUitOpen 0:c02c700a8ecf 102 for (int n=0; PinMap_ADC[n].pin != NC; n++)
MikamiUitOpen 0:c02c700a8ecf 103 if ( ((PinMap_ADC[n].pin & 0xFF) == pin) &
MikamiUitOpen 0:c02c700a8ecf 104 (PinMap_ADC[n].peripheral == (uint32_t)adc) ) return true;
MikamiUitOpen 0:c02c700a8ecf 105 return false;
MikamiUitOpen 0:c02c700a8ecf 106 }
MikamiUitOpen 0:c02c700a8ecf 107 }