タイマと同期する関数と周期的割込みとサポートする.登録した際のプログラム名:Demo_MyTicker7.

Dependents:   Demo_MyTicker7 F446_DSP_FunctionGenerator TrG_FunctionGenerator DSP_Seminar_FunctionGenerator

Committer:
MikamiUitOpen
Date:
Sat Oct 17 00:41:36 2020 +0000
Revision:
1:f4269105fae0
Parent:
0:329029faa850
2

Who changed what in which revision?

UserRevisionLine numberNew 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 }