タイマと同期する関数と周期的割込みとサポートする.登録した際のプログラム名:Demo_MyTicker7.
Dependents: Demo_MyTicker7 F446_DSP_FunctionGenerator TrG_FunctionGenerator DSP_Seminar_FunctionGenerator
MyTicker7.cpp@1:f4269105fae0, 2020-10-17 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Sat Oct 17 00:41:36 2020 +0000
- Revision:
- 1:f4269105fae0
- Parent:
- 0:329029faa850
2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:329029faa850 | 1 | //----------------------------------------------------------- |
MikamiUitOpen | 0:329029faa850 | 2 | // タイマを使った正確な同期の実現, TIM7 を使用 |
MikamiUitOpen | 0:329029faa850 | 3 | // |
MikamiUitOpen | 1:f4269105fae0 | 4 | // 2020/10/16, Copyright (c) 2020 MIKAMI, Naoki |
MikamiUitOpen | 0:329029faa850 | 5 | //----------------------------------------------------------- |
MikamiUitOpen | 0:329029faa850 | 6 | |
MikamiUitOpen | 0:329029faa850 | 7 | #include "MyTicker7.hpp" |
MikamiUitOpen | 0:329029faa850 | 8 | |
MikamiUitOpen | 0:329029faa850 | 9 | namespace Mikami |
MikamiUitOpen | 0:329029faa850 | 10 | { |
MikamiUitOpen | 0:329029faa850 | 11 | // コンストラクタ |
MikamiUitOpen | 0:329029faa850 | 12 | // period 時間間隔 [μs] |
MikamiUitOpen | 0:329029faa850 | 13 | MyTicker7::MyTicker7(float period) |
MikamiUitOpen | 0:329029faa850 | 14 | { |
MikamiUitOpen | 0:329029faa850 | 15 | // このクラスのオブジェクトの多重生成禁止のため |
MikamiUitOpen | 0:329029faa850 | 16 | MBED_ASSERT(!created_); |
MikamiUitOpen | 0:329029faa850 | 17 | created_ = true; |
MikamiUitOpen | 0:329029faa850 | 18 | |
MikamiUitOpen | 0:329029faa850 | 19 | __HAL_RCC_TIM7_CLK_ENABLE(); // クロック供給. "stm32f4xx_hal_rcc.h" 参照 |
MikamiUitOpen | 0:329029faa850 | 20 | |
MikamiUitOpen | 0:329029faa850 | 21 | uint32_t maxClock; |
MikamiUitOpen | 0:329029faa850 | 22 | if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RCC_DCKCFGR_TIMPRE) |
MikamiUitOpen | 0:329029faa850 | 23 | maxClock = SystemCoreClock; |
MikamiUitOpen | 0:329029faa850 | 24 | else |
MikamiUitOpen | 0:329029faa850 | 25 | maxClock = SystemCoreClock/2; |
MikamiUitOpen | 0:329029faa850 | 26 | |
MikamiUitOpen | 0:329029faa850 | 27 | float arrF = period*maxClock/1000000.0f + 0.5f; |
MikamiUitOpen | 0:329029faa850 | 28 | MBED_ASSERT(arrF < 32768.5f); |
MikamiUitOpen | 0:329029faa850 | 29 | MY_TIM_->ARR = (uint32_t)arrF - 1; // Auto-reload レジスタの設定 |
MikamiUitOpen | 0:329029faa850 | 30 | MY_TIM_->PSC = 0; // Prescaler の設定 |
MikamiUitOpen | 0:329029faa850 | 31 | MY_TIM_->CR1 = TIM_CR1_CEN; // TIM7 を有効にする |
MikamiUitOpen | 0:329029faa850 | 32 | } |
MikamiUitOpen | 0:329029faa850 | 33 | |
MikamiUitOpen | 0:329029faa850 | 34 | // コンストラクタで設定した時間が経過するまで待つ |
MikamiUitOpen | 0:329029faa850 | 35 | void MyTicker7::Sync() |
MikamiUitOpen | 0:329029faa850 | 36 | { |
MikamiUitOpen | 0:329029faa850 | 37 | // タイマの Update イベントが発生するまで待つ |
MikamiUitOpen | 0:329029faa850 | 38 | while ((MY_TIM_->SR & TIM_SR_UIF_Msk) != TIM_SR_UIF) {} |
MikamiUitOpen | 0:329029faa850 | 39 | // Update interrupt flag をクリア |
MikamiUitOpen | 0:329029faa850 | 40 | MY_TIM_->SR &= ~TIM_SR_UIF; |
MikamiUitOpen | 0:329029faa850 | 41 | } |
MikamiUitOpen | 0:329029faa850 | 42 | |
MikamiUitOpen | 0:329029faa850 | 43 | // クラス内 ISR で実行する関数の割当て,割込みを有効にする |
MikamiUitOpen | 0:329029faa850 | 44 | void MyTicker7::Attach(void (*Func)()) |
MikamiUitOpen | 0:329029faa850 | 45 | { |
MikamiUitOpen | 0:329029faa850 | 46 | NVIC_SetVector(TIM7_IRQn, (uint32_t)Isr); |
MikamiUitOpen | 0:329029faa850 | 47 | NVIC_EnableIRQ(TIM7_IRQn); |
MikamiUitOpen | 0:329029faa850 | 48 | |
MikamiUitOpen | 0:329029faa850 | 49 | fp = Func; // 外部で定義されている関数を割り当てる |
MikamiUitOpen | 0:329029faa850 | 50 | |
MikamiUitOpen | 0:329029faa850 | 51 | Enable(); // Update 割込みを有効にする |
MikamiUitOpen | 0:329029faa850 | 52 | } |
MikamiUitOpen | 0:329029faa850 | 53 | |
MikamiUitOpen | 0:329029faa850 | 54 | // 割込みサービス・ルーチン(ISR) |
MikamiUitOpen | 0:329029faa850 | 55 | void MyTicker7::Isr() |
MikamiUitOpen | 0:329029faa850 | 56 | { |
MikamiUitOpen | 0:329029faa850 | 57 | MY_TIM_->SR &= ~TIM_SR_UIF; // Update 割込みをクリア |
MikamiUitOpen | 0:329029faa850 | 58 | fp(); // 外部で定義されている関数を実行 |
MikamiUitOpen | 0:329029faa850 | 59 | } |
MikamiUitOpen | 0:329029faa850 | 60 | |
MikamiUitOpen | 0:329029faa850 | 61 | // static オブジェクトの実体 |
MikamiUitOpen | 0:329029faa850 | 62 | TIM_TypeDef* const MyTicker7::MY_TIM_ = TIM7; |
MikamiUitOpen | 0:329029faa850 | 63 | void (*MyTicker7::fp)(); |
MikamiUitOpen | 0:329029faa850 | 64 | bool MyTicker7::created_ = false; |
MikamiUitOpen | 0:329029faa850 | 65 | } |