Nucleo-F446RE 内蔵の AD/DA を使うためのライブラリ.DA からの出力は,標本化周波数の4倍のレートで行う. このライブラリを登録した際のプログラム: Demo_F446_AD_DA_Multirate. Library for built-in ADC and DAC in Nucleo-F446RE. Sampling rate for DAC is four times of that for ADC.
Dependents: F446_UpSampling_GraphicEqualizer F446_UpSampling_ReverbSystem F446_UpSampling_FrqShifter_Weaver Demo_F446_AD_DA_Multirate ... more
F446_ADC.cpp@9:75bc15678d1b, 2020-02-09 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Sun Feb 09 02:16:39 2020 +0000
- Revision:
- 9:75bc15678d1b
- Parent:
- 7:6275fe158ae8
10
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:2447a7d225b1 | 1 | //---------------------------------------------------------------- |
MikamiUitOpen | 0:2447a7d225b1 | 2 | // AD Conversion by interrupt using ADC2 or ADC3 on STM32F446 |
MikamiUitOpen | 0:2447a7d225b1 | 3 | // |
MikamiUitOpen | 0:2447a7d225b1 | 4 | // STM32F446 の ADC2 または ADC3 を使って割込みによりアナログ信号を |
MikamiUitOpen | 0:2447a7d225b1 | 5 | // 入力するクラス ― マルチ・レート処理用 |
MikamiUitOpen | 0:2447a7d225b1 | 6 | // |
MikamiUitOpen | 7:6275fe158ae8 | 7 | // 2018/10/11, Copyright (c) 2018 MIKAMI, Naoki |
MikamiUitOpen | 0:2447a7d225b1 | 8 | //---------------------------------------------------------------- |
MikamiUitOpen | 0:2447a7d225b1 | 9 | |
MikamiUitOpen | 0:2447a7d225b1 | 10 | #include "F446_ADC.hpp" |
MikamiUitOpen | 0:2447a7d225b1 | 11 | |
MikamiUitOpen | 0:2447a7d225b1 | 12 | namespace Mikami |
MikamiUitOpen | 0:2447a7d225b1 | 13 | { |
MikamiUitOpen | 0:2447a7d225b1 | 14 | AdcF446::AdcF446(int frequency, PinName pin) |
MikamiUitOpen | 0:2447a7d225b1 | 15 | { |
MikamiUitOpen | 0:2447a7d225b1 | 16 | if ( (pin != A0) && (pin != A1) ) |
MikamiUitOpen | 0:2447a7d225b1 | 17 | { |
MikamiUitOpen | 0:2447a7d225b1 | 18 | fprintf(stderr, "Invalid pin name\r\n"); |
MikamiUitOpen | 0:2447a7d225b1 | 19 | while (true) {} |
MikamiUitOpen | 0:2447a7d225b1 | 20 | } |
MikamiUitOpen | 0:2447a7d225b1 | 21 | |
MikamiUitOpen | 0:2447a7d225b1 | 22 | // PA0 または PA1 を ADC 入力として使うための設定 |
MikamiUitOpen | 0:2447a7d225b1 | 23 | __HAL_RCC_GPIOA_CLK_ENABLE(); |
MikamiUitOpen | 0:2447a7d225b1 | 24 | GPIO_InitTypeDef gpioInit; |
MikamiUitOpen | 0:2447a7d225b1 | 25 | gpioInit.Pin = (pin == A0) ? GPIO_PIN_0 : GPIO_PIN_1; |
MikamiUitOpen | 0:2447a7d225b1 | 26 | gpioInit.Mode = GPIO_MODE_ANALOG; |
MikamiUitOpen | 0:2447a7d225b1 | 27 | gpioInit.Pull = GPIO_NOPULL; |
MikamiUitOpen | 0:2447a7d225b1 | 28 | gpioInit.Speed = GPIO_SPEED_FREQ_VERY_HIGH; |
MikamiUitOpen | 0:2447a7d225b1 | 29 | HAL_GPIO_Init(GPIOA, &gpioInit); |
MikamiUitOpen | 0:2447a7d225b1 | 30 | |
MikamiUitOpen | 0:2447a7d225b1 | 31 | if (pin == A0) // ADC2 の設定 (入力ポート:PA0) |
MikamiUitOpen | 0:2447a7d225b1 | 32 | { |
MikamiUitOpen | 0:2447a7d225b1 | 33 | __HAL_RCC_ADC2_CLK_ENABLE(); |
MikamiUitOpen | 0:2447a7d225b1 | 34 | adc_ = ADC2; |
MikamiUitOpen | 0:2447a7d225b1 | 35 | adc_->SQR3 = 0x0; // CH0 を使う |
MikamiUitOpen | 0:2447a7d225b1 | 36 | } |
MikamiUitOpen | 0:2447a7d225b1 | 37 | else // ADC3 の設定 (入力ポート:PA1) |
MikamiUitOpen | 0:2447a7d225b1 | 38 | { |
MikamiUitOpen | 0:2447a7d225b1 | 39 | __HAL_RCC_ADC3_CLK_ENABLE(); |
MikamiUitOpen | 0:2447a7d225b1 | 40 | adc_ = ADC3; |
MikamiUitOpen | 0:2447a7d225b1 | 41 | adc_->SQR3 = 0x1; // CH1 を使う |
MikamiUitOpen | 0:2447a7d225b1 | 42 | } |
MikamiUitOpen | 0:2447a7d225b1 | 43 | adc_->CR2 = ADC_EXTERNALTRIGCONVEDGE_RISING // 外部トリガの立ち上がりで開始される |
MikamiUitOpen | 0:2447a7d225b1 | 44 | | ADC_EXTERNALTRIGCONV_T8_TRGO // 外部トリガ: Timer8 TRGO event |
MikamiUitOpen | 0:2447a7d225b1 | 45 | | ADC_CR2_ADON; // ADC を有効にする |
MikamiUitOpen | 0:2447a7d225b1 | 46 | adc_->CR1 = ADC_CR1_EOCIE; // ADC の変換終了割り込みを有効にする |
MikamiUitOpen | 0:2447a7d225b1 | 47 | |
MikamiUitOpen | 0:2447a7d225b1 | 48 | // AD 変換器の外部トリガに使うタイマ (TIM8) の設定 |
MikamiUitOpen | 0:2447a7d225b1 | 49 | // 標本化周波数としてアップサンプリングに対応する値を設定する |
MikamiUitOpen | 0:2447a7d225b1 | 50 | SetTim8(frequency); |
MikamiUitOpen | 0:2447a7d225b1 | 51 | } |
MikamiUitOpen | 0:2447a7d225b1 | 52 | |
MikamiUitOpen | 0:2447a7d225b1 | 53 | // 割込みベクタを設定し,ADC 割込みを有効にする |
MikamiUitOpen | 0:2447a7d225b1 | 54 | void AdcF446::SetIntrVec(void (*Func)()) |
MikamiUitOpen | 0:2447a7d225b1 | 55 | { |
MikamiUitOpen | 0:2447a7d225b1 | 56 | NVIC_SetVector(ADC_IRQn, (uint32_t)Func); // "cmsis_nvic.h" 参照 |
MikamiUitOpen | 0:2447a7d225b1 | 57 | NVIC_EnableIRQ(ADC_IRQn); // "core_cm4.h" 参照 |
MikamiUitOpen | 0:2447a7d225b1 | 58 | } |
MikamiUitOpen | 0:2447a7d225b1 | 59 | |
MikamiUitOpen | 3:285cebe5823c | 60 | // AD 変換器の外部トリガに使うタイマ (TIM8) の設定 |
MikamiUitOpen | 0:2447a7d225b1 | 61 | void AdcF446::SetTim8(int frequency) |
MikamiUitOpen | 0:2447a7d225b1 | 62 | { |
MikamiUitOpen | 0:2447a7d225b1 | 63 | __HAL_RCC_TIM8_CLK_ENABLE(); // クロック供給. "stm32f4xx_hal_rcc.h" 参照 |
MikamiUitOpen | 0:2447a7d225b1 | 64 | SystemCoreClockUpdate(); // クロックの更新. See "system_stm32f4xx.h" 参照 |
MikamiUitOpen | 0:2447a7d225b1 | 65 | TIM_TypeDef* const myTim = TIM8; |
MikamiUitOpen | 0:2447a7d225b1 | 66 | |
MikamiUitOpen | 0:2447a7d225b1 | 67 | myTim->CR2 = TIM_CR2_MMS_1; // Update event を TRGO (trigger output) とする |
MikamiUitOpen | 0:2447a7d225b1 | 68 | |
MikamiUitOpen | 0:2447a7d225b1 | 69 | uint32_t psc = 0; |
MikamiUitOpen | 0:2447a7d225b1 | 70 | uint16_t mul = 1; |
MikamiUitOpen | 0:2447a7d225b1 | 71 | uint32_t arr; |
MikamiUitOpen | 0:2447a7d225b1 | 72 | while (true) |
MikamiUitOpen | 0:2447a7d225b1 | 73 | { |
MikamiUitOpen | 0:2447a7d225b1 | 74 | arr = SystemCoreClock/(mul*frequency); |
MikamiUitOpen | 0:2447a7d225b1 | 75 | if (arr <= 65536) break; |
MikamiUitOpen | 0:2447a7d225b1 | 76 | psc++; |
MikamiUitOpen | 0:2447a7d225b1 | 77 | mul++; |
MikamiUitOpen | 0:2447a7d225b1 | 78 | if (psc > 65535) |
MikamiUitOpen | 0:2447a7d225b1 | 79 | { |
MikamiUitOpen | 0:2447a7d225b1 | 80 | fprintf(stderr, "Sampling frequency: too low.\r\n"); |
MikamiUitOpen | 0:2447a7d225b1 | 81 | while (true) {} |
MikamiUitOpen | 0:2447a7d225b1 | 82 | } |
MikamiUitOpen | 0:2447a7d225b1 | 83 | } |
MikamiUitOpen | 0:2447a7d225b1 | 84 | myTim->ARR = arr - 1; // Auto-reload レジスタの設定 |
MikamiUitOpen | 0:2447a7d225b1 | 85 | myTim->PSC = psc; // Prescaler の設定 |
MikamiUitOpen | 0:2447a7d225b1 | 86 | myTim->CR1 = TIM_CR1_CEN; // TIM8 を有効にする |
MikamiUitOpen | 0:2447a7d225b1 | 87 | } |
MikamiUitOpen | 0:2447a7d225b1 | 88 | } |