![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
CQ出版社セミナ "実習・Armマイコン内蔵ペリフェラルを活用するためのC++プログラミング" で使う外付け回路のテスト
Dependencies: mbed UIT_SetOutputPortType UIT_AQM1602 UIT_ADT7410
F446_ADDA/F446_AdcBase.cpp@2:3f2be675f975, 2020-04-02 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Thu Apr 02 03:47:14 2020 +0000
- Revision:
- 2:3f2be675f975
- Parent:
- 0:8c850cf6285d
3
Who changed what in which revision?
User | Revision | Line number | New 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 |