Nucleo-F446RE 内蔵の AD/DA を使うためのライブラリ.DA からの出力は,標本化周波数の4倍のレートで行う.AD の読み込みにはソフトウェア割り込みを使用.  このライブラリを登録した際のプログラム: Demo_F446_AD_DA_MultirateSWI. Library for built-in ADC and DAC in Nucleo-F446RE using software interrupt for reading ADC. Sampling rate for DAC is four times of that for ADC.

Dependencies:   Array_Matrix

Dependents:   F446_UpSampling_LPF_HPF_Variable Demo_F446_AD_DA_MultirateSWI

Committer:
MikamiUitOpen
Date:
Sun Feb 09 02:18:32 2020 +0000
Revision:
2:c8aa7ae0012c
Parent:
0:3e5b7187753d
3

Who changed what in which revision?

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