ファンクション・ジェネレータ.出力信号:正弦波,矩形波,矩形波 (5倍波まで).ノイズの付加が可能.
Dependencies: mbed SerialTxRxIntr Random
MyTicker7.cpp@0:d11ff22a164f, 2018-07-09 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Mon Jul 09 06:05:08 2018 +0000
- Revision:
- 0:d11ff22a164f
1
Who changed what in which revision?
User | Revision | Line number | New 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 | } |