CQ出版社セミナ "実習・Armマイコン内蔵ペリフェラルを活用するためのC++プログラミング" で使う外付け回路のテスト

Dependencies:   mbed UIT_SetOutputPortType UIT_AQM1602 UIT_ADT7410

Committer:
MikamiUitOpen
Date:
Thu Apr 02 03:47:14 2020 +0000
Revision:
2:3f2be675f975
Parent:
0:8c850cf6285d
3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:8c850cf6285d 1 //-------------------------------------------------------------
MikamiUitOpen 0:8c850cf6285d 2 // F446 内蔵 ADC2 のための抽象基底クラス
MikamiUitOpen 0:8c850cf6285d 3 //
MikamiUitOpen 0:8c850cf6285d 4 // 2020/01/28, Copyright (c) 2020 MIKAMI, Naoki
MikamiUitOpen 0:8c850cf6285d 5 //-------------------------------------------------------------
MikamiUitOpen 0:8c850cf6285d 6
MikamiUitOpen 0:8c850cf6285d 7 #include "F446_AdcBase.hpp"
MikamiUitOpen 0:8c850cf6285d 8 #include "PeripheralPins.h" // PinMap_ADC を使う場合に必要
MikamiUitOpen 0:8c850cf6285d 9 #pragma diag_suppress 870 // マルチバイト文字使用の警告抑制のため
MikamiUitOpen 0:8c850cf6285d 10 // PeripheralPins.c は以下よりたどって行けば取得可能
MikamiUitOpen 0:8c850cf6285d 11 // https://gitlab.exmachina.fr/fw-libs/mbed-os/tree/5.8.1
MikamiUitOpen 0:8c850cf6285d 12
MikamiUitOpen 0:8c850cf6285d 13 namespace Mikami
MikamiUitOpen 0:8c850cf6285d 14 {
MikamiUitOpen 0:8c850cf6285d 15 // コンストラクタ
MikamiUitOpen 0:8c850cf6285d 16 AdcF446_Base::AdcF446_Base(float fSampling, PinName pin)
MikamiUitOpen 0:8c850cf6285d 17 {
MikamiUitOpen 0:8c850cf6285d 18 SetGPIO(pin); // GPIO の設定
MikamiUitOpen 0:8c850cf6285d 19
MikamiUitOpen 0:8c850cf6285d 20 __HAL_RCC_ADC2_CLK_ENABLE(); // ADC2 にクロックを供給する
MikamiUitOpen 0:8c850cf6285d 21 // __HAL_RCC_ADC2_CLK_ENABLE() の定義:stm32f4xx_hal_rcc_ex.h
MikamiUitOpen 0:8c850cf6285d 22
MikamiUitOpen 0:8c850cf6285d 23 // 1 チャンネルのみ使用の設定
MikamiUitOpen 0:8c850cf6285d 24 myAdc_->SQR1 &= ~ADC_SQR1_L;
MikamiUitOpen 0:8c850cf6285d 25 // pin に対応するチャンネルを使うための設定
MikamiUitOpen 0:8c850cf6285d 26 myAdc_->SQR3 = STM_PIN_CHANNEL(pinmap_function(pin, PinMap_ADC));
MikamiUitOpen 0:8c850cf6285d 27 // pinmap_function() のヘッダファイル: mbed\hal\pinmap.h
MikamiUitOpen 0:8c850cf6285d 28 // STM_PIN_CHANNEL() の定義:PinNamesTypes.h
MikamiUitOpen 0:8c850cf6285d 29
MikamiUitOpen 0:8c850cf6285d 30 // ADC の CR1 の設定
MikamiUitOpen 0:8c850cf6285d 31 myAdc_->CR1 = 0x0; // 12bit, 非Scan モード,AD 変換終了割込みを禁止
MikamiUitOpen 0:8c850cf6285d 32 // ADC の CR2 の設定
MikamiUitOpen 0:8c850cf6285d 33 myAdc_->CR2 = ADC_EXTERNALTRIGCONVEDGE_RISING // 外部トリガの立ち上がりで開始される
MikamiUitOpen 0:8c850cf6285d 34 | ADC_EXTERNALTRIGCONV_T8_TRGO // 外部トリガ: Timer8 TRGO event
MikamiUitOpen 0:8c850cf6285d 35 | ADC_CR2_ADON; // ADC を有効にする
MikamiUitOpen 0:8c850cf6285d 36
MikamiUitOpen 0:8c850cf6285d 37 // AD 変換器の外部トリガに使うタイマ (TIM8) の設定
MikamiUitOpen 0:8c850cf6285d 38 SetTim8(fSampling);
MikamiUitOpen 0:8c850cf6285d 39 }
MikamiUitOpen 0:8c850cf6285d 40
MikamiUitOpen 0:8c850cf6285d 41 // AD 変換器の外部トリガに使うタイマ (TIM8) の設定
MikamiUitOpen 0:8c850cf6285d 42 // fSampling 標本化周波数 [kHz]
MikamiUitOpen 0:8c850cf6285d 43 void AdcF446_Base::SetTim8(float fSampling)
MikamiUitOpen 0:8c850cf6285d 44 {
MikamiUitOpen 0:8c850cf6285d 45 __HAL_RCC_TIM8_CLK_ENABLE(); // クロック供給. "stm32f4xx_hal_rcc.h" 参照
MikamiUitOpen 0:8c850cf6285d 46 TIM_TypeDef* const TIM = TIM8;
MikamiUitOpen 0:8c850cf6285d 47
MikamiUitOpen 0:8c850cf6285d 48 TIM->CR2 = TIM_TRGO_UPDATE; // Update event を TRGO (trigger output) とする
MikamiUitOpen 0:8c850cf6285d 49
MikamiUitOpen 0:8c850cf6285d 50 float arrF = (SystemCoreClock/fSampling)/1000.0f;
MikamiUitOpen 0:8c850cf6285d 51 if (arrF >65535)
MikamiUitOpen 0:8c850cf6285d 52 {
MikamiUitOpen 0:8c850cf6285d 53 fprintf(stderr, "%8.2f kHz : 標本化周波数が低すぎます.\r\n", fSampling);
MikamiUitOpen 0:8c850cf6285d 54 while (true) {}
MikamiUitOpen 0:8c850cf6285d 55 }
MikamiUitOpen 0:8c850cf6285d 56 TIM->ARR = floor(arrF + 0.5f) - 1; // Auto-reload レジスタの設定
MikamiUitOpen 0:8c850cf6285d 57 TIM->PSC = 0; // Prescaler の設定
MikamiUitOpen 0:8c850cf6285d 58 TIM->CR1 = TIM_CR1_CEN; // TIM8 を有効にする
MikamiUitOpen 0:8c850cf6285d 59 }
MikamiUitOpen 0:8c850cf6285d 60
MikamiUitOpen 0:8c850cf6285d 61 // AD 変換器に関係のある GPIO の設定
MikamiUitOpen 0:8c850cf6285d 62 void AdcF446_Base::SetGPIO(PinName pin)
MikamiUitOpen 0:8c850cf6285d 63 {
MikamiUitOpen 0:8c850cf6285d 64 // 各シンボルは stm32f4xx_hal_gpio.h で定義されている
MikamiUitOpen 0:8c850cf6285d 65 // MODIFY_REG() マクロは stm32f4xx.h で定義されている
MikamiUitOpen 0:8c850cf6285d 66 uint32_t nShift = STM_PIN(pin) << 1;
MikamiUitOpen 0:8c850cf6285d 67 uint32_t moder = GPIO_MODE_ANALOG << nShift;
MikamiUitOpen 0:8c850cf6285d 68 uint32_t mask = 0x03 << nShift;
MikamiUitOpen 0:8c850cf6285d 69 switch (STM_PORT(pin))
MikamiUitOpen 0:8c850cf6285d 70 {
MikamiUitOpen 0:8c850cf6285d 71 case 0:
MikamiUitOpen 0:8c850cf6285d 72 if (__HAL_RCC_GPIOA_IS_CLK_DISABLED())
MikamiUitOpen 0:8c850cf6285d 73 __HAL_RCC_GPIOA_CLK_ENABLE(); // GPIOA にクロックを供給
MikamiUitOpen 0:8c850cf6285d 74 MODIFY_REG(GPIOA->MODER, mask, moder); // GPIOA のピンを設定
MikamiUitOpen 0:8c850cf6285d 75 break;
MikamiUitOpen 0:8c850cf6285d 76 case 1:
MikamiUitOpen 0:8c850cf6285d 77 if (__HAL_RCC_GPIOB_IS_CLK_DISABLED())
MikamiUitOpen 0:8c850cf6285d 78 __HAL_RCC_GPIOB_CLK_ENABLE(); // GPIOB にクロックを供給
MikamiUitOpen 0:8c850cf6285d 79 MODIFY_REG(GPIOB->MODER, mask, moder); // GPIOB のピンを設定
MikamiUitOpen 0:8c850cf6285d 80 break;
MikamiUitOpen 0:8c850cf6285d 81 case 2:
MikamiUitOpen 0:8c850cf6285d 82 if (__HAL_RCC_GPIOC_IS_CLK_DISABLED())
MikamiUitOpen 0:8c850cf6285d 83 __HAL_RCC_GPIOC_CLK_ENABLE(); // GPIOC にクロックを供給
MikamiUitOpen 0:8c850cf6285d 84 MODIFY_REG(GPIOC->MODER, mask, moder); // GPIOC のピンを設定
MikamiUitOpen 0:8c850cf6285d 85 break;
MikamiUitOpen 0:8c850cf6285d 86 }
MikamiUitOpen 0:8c850cf6285d 87 }
MikamiUitOpen 0:8c850cf6285d 88
MikamiUitOpen 0:8c850cf6285d 89 // static メンバの実体
MikamiUitOpen 0:8c850cf6285d 90 ADC_TypeDef* const AdcF446_Base::myAdc_ = ADC2;
MikamiUitOpen 0:8c850cf6285d 91 }
MikamiUitOpen 0:8c850cf6285d 92