ファンクション・ジェネレータ.出力信号:正弦波,矩形波,矩形波 (5倍波まで).ノイズの付加が可能.

Dependencies:   mbed SerialTxRxIntr Random

Committer:
MikamiUitOpen
Date:
Mon Jul 09 06:05:08 2018 +0000
Revision:
0:d11ff22a164f
1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:d11ff22a164f 1 //----------------------------------------------------------------------
MikamiUitOpen 0:d11ff22a164f 2 // TIM7 の Update event (UEV) 割込みを使って,Ticker と同じような機能の
MikamiUitOpen 0:d11ff22a164f 3 // ほかに,割込みの時間間隔を設定するメンバ関数を追加した行うクラス
MikamiUitOpen 0:d11ff22a164f 4 //
MikamiUitOpen 0:d11ff22a164f 5 // 2018/06/24, Copyright (c) 2018 MIKAMI, Naoki
MikamiUitOpen 0:d11ff22a164f 6 //----------------------------------------------------------------------
MikamiUitOpen 0:d11ff22a164f 7
MikamiUitOpen 0:d11ff22a164f 8 #include "MyTicker7.hpp"
MikamiUitOpen 0:d11ff22a164f 9
MikamiUitOpen 0:d11ff22a164f 10 namespace Mikami
MikamiUitOpen 0:d11ff22a164f 11 {
MikamiUitOpen 0:d11ff22a164f 12 MyTicker7::MyTicker7()
MikamiUitOpen 0:d11ff22a164f 13 {
MikamiUitOpen 0:d11ff22a164f 14 // TIM7 にクロック供給."stm32f4xx_hal_rcc_ex.h" 参照
MikamiUitOpen 0:d11ff22a164f 15 __HAL_RCC_TIM7_CLK_ENABLE();
MikamiUitOpen 0:d11ff22a164f 16 // クロックの更新(念のため)."system_stm32f4xx.h" 参照
MikamiUitOpen 0:d11ff22a164f 17 SystemCoreClockUpdate();
MikamiUitOpen 0:d11ff22a164f 18 #if defined(STM32F7)
MikamiUitOpen 0:d11ff22a164f 19 if ((RCC->DCKCFGR1 & RCC_DCKCFGR1_TIMPRE) == RCC_DCKCFGR1_TIMPRE)
MikamiUitOpen 0:d11ff22a164f 20 #elif defined(STM32F4)
MikamiUitOpen 0:d11ff22a164f 21 if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RCC_DCKCFGR_TIMPRE)
MikamiUitOpen 0:d11ff22a164f 22 #else
MikamiUitOpen 0:d11ff22a164f 23 #error "This MCU is neither STM32F7 nor STM32F4."
MikamiUitOpen 0:d11ff22a164f 24 #endif
MikamiUitOpen 0:d11ff22a164f 25 maxClock_ = SystemCoreClock;
MikamiUitOpen 0:d11ff22a164f 26 else
MikamiUitOpen 0:d11ff22a164f 27 maxClock_ = SystemCoreClock/2;
MikamiUitOpen 0:d11ff22a164f 28 }
MikamiUitOpen 0:d11ff22a164f 29
MikamiUitOpen 0:d11ff22a164f 30 // 割込みサービスルーチンの割り当てと割り込み周期(μs 単位)の設定
MikamiUitOpen 0:d11ff22a164f 31 void MyTicker7::Attach_us(void (*Func)(), uint16_t time)
MikamiUitOpen 0:d11ff22a164f 32 {
MikamiUitOpen 0:d11ff22a164f 33 SetPeriod_us(time);
MikamiUitOpen 0:d11ff22a164f 34 SetCommon(Func, time);
MikamiUitOpen 0:d11ff22a164f 35 }
MikamiUitOpen 0:d11ff22a164f 36
MikamiUitOpen 0:d11ff22a164f 37 // 割込みサービスルーチンの割り当てと割り込み周期(ms 単位)の設定
MikamiUitOpen 0:d11ff22a164f 38 void MyTicker7::Attach_ms(void (*Func)(), uint16_t time)
MikamiUitOpen 0:d11ff22a164f 39 {
MikamiUitOpen 0:d11ff22a164f 40 SetPeriod_ms(time);
MikamiUitOpen 0:d11ff22a164f 41 SetCommon(Func, time);
MikamiUitOpen 0:d11ff22a164f 42 }
MikamiUitOpen 0:d11ff22a164f 43
MikamiUitOpen 0:d11ff22a164f 44 // 割り込み周期(μs 単位)の設定
MikamiUitOpen 0:d11ff22a164f 45 void MyTicker7::SetPeriod_us(uint16_t time)
MikamiUitOpen 0:d11ff22a164f 46 {
MikamiUitOpen 0:d11ff22a164f 47 tim_->ARR = time - 1; // Auto-reload
MikamiUitOpen 0:d11ff22a164f 48 tim_->PSC = maxClock_/1000000 - 1; // Prescaler
MikamiUitOpen 0:d11ff22a164f 49 }
MikamiUitOpen 0:d11ff22a164f 50
MikamiUitOpen 0:d11ff22a164f 51 // 割り込み周期(ms 単位)の設定
MikamiUitOpen 0:d11ff22a164f 52 void MyTicker7::SetPeriod_ms(uint16_t time)
MikamiUitOpen 0:d11ff22a164f 53 {
MikamiUitOpen 0:d11ff22a164f 54 tim_->ARR = 10*time - 1; // Auto-reload
MikamiUitOpen 0:d11ff22a164f 55 tim_->PSC = maxClock_/10000 - 1; // Prescaler
MikamiUitOpen 0:d11ff22a164f 56 }
MikamiUitOpen 0:d11ff22a164f 57
MikamiUitOpen 0:d11ff22a164f 58 // 割り込みサービス・ルーチン
MikamiUitOpen 0:d11ff22a164f 59 void MyTicker7::Isr()
MikamiUitOpen 0:d11ff22a164f 60 {
MikamiUitOpen 0:d11ff22a164f 61 tim_->SR &= ~TIM_SR_UIF; // Update 割込みをクリア
MikamiUitOpen 0:d11ff22a164f 62 fp(); // Attach_us(), Attach_ms() の引数として渡された関数を実行
MikamiUitOpen 0:d11ff22a164f 63 }
MikamiUitOpen 0:d11ff22a164f 64
MikamiUitOpen 0:d11ff22a164f 65 // 割り込みサービス・ルーチンの準備と割り込み許可
MikamiUitOpen 0:d11ff22a164f 66 void MyTicker7::SetIsr(void (*Func)(), uint16_t time)
MikamiUitOpen 0:d11ff22a164f 67 {
MikamiUitOpen 0:d11ff22a164f 68 fp = Func;
MikamiUitOpen 0:d11ff22a164f 69 NVIC_SetVector(TIM7_IRQn, (uint32_t)Isr);
MikamiUitOpen 0:d11ff22a164f 70 NVIC_EnableIRQ(TIM7_IRQn);
MikamiUitOpen 0:d11ff22a164f 71 }
MikamiUitOpen 0:d11ff22a164f 72
MikamiUitOpen 0:d11ff22a164f 73 // タイマ設定の共通の処理
MikamiUitOpen 0:d11ff22a164f 74 void MyTicker7::SetCommon(void (*Func)(), uint16_t time)
MikamiUitOpen 0:d11ff22a164f 75 {
MikamiUitOpen 0:d11ff22a164f 76 // CR1 の ARPE ビットを 1 にすることで,ARR の更新を
MikamiUitOpen 0:d11ff22a164f 77 // Update event (UVE) に合わせて行うように設定できる
MikamiUitOpen 0:d11ff22a164f 78 // リファレンス・マニュアル (RM0390) p.587 参照
MikamiUitOpen 0:d11ff22a164f 79 tim_->CR1 = TIM_CR1_CEN // Counter 有効
MikamiUitOpen 0:d11ff22a164f 80 | TIM_CR1_ARPE; // ARR のバッファ有効
MikamiUitOpen 0:d11ff22a164f 81 tim_->DIER |= TIM_DIER_UIE; // Update 割込み有効
MikamiUitOpen 0:d11ff22a164f 82
MikamiUitOpen 0:d11ff22a164f 83 SetIsr(Func, time);
MikamiUitOpen 0:d11ff22a164f 84 }
MikamiUitOpen 0:d11ff22a164f 85
MikamiUitOpen 0:d11ff22a164f 86 void (*MyTicker7::fp)();
MikamiUitOpen 0:d11ff22a164f 87 TIM_TypeDef* const MyTicker7::tim_ = TIM7;
MikamiUitOpen 0:d11ff22a164f 88 }