CQ出版社セミナ "実習・Armマイコン内蔵ペリフェラルを活用するためのC++プログラミング" で使う外付け回路のテスト

Dependencies:   mbed UIT_SetOutputPortType UIT_AQM1602 UIT_ADT7410

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers F446_AdcIntr.hpp Source File

F446_AdcIntr.hpp

00001 //-------------------------------------------------------------
00002 //  F446 内蔵 ADC2 を割込み方式で使うための派生クラス
00003 //      基底クラス: AdcF446_Base
00004 //
00005 //  2020/02/23, Copyright (c) 2020 MIKAMI, Naoki
00006 //-------------------------------------------------------------
00007 
00008 #include "F446_AdcBase.hpp"
00009 
00010 #ifndef ADC_F446_INTERRUPT_HPP
00011 #define ADC_F446_INTERRUPT_HPP
00012 
00013 namespace Mikami
00014 {
00015     class AdcF446_Intr : public AdcF446_Base
00016     {
00017     public:
00018         // コンストラクタ
00019         //      fSampling 標本化周波数 [kHz]
00020         //      pin     入力ピンの名前
00021         AdcF446_Intr(float fSampling, PinName pin)
00022             : AdcF446_Base(fSampling, pin)
00023         {   myAdc_->CR1 |= ADC_CR1_EOCIE; }     // AD 変換終了割り込みを許可
00024 
00025         virtual ~AdcF446_Intr() {}
00026 
00027         // 割込みベクタの設定と AD 変換割込みを有効にする
00028         void SetIntrVec(void (*Func)())
00029         {
00030             fp_ = Func;         // 引数として渡された処理を割り当てる
00031             NVIC_SetVector(ADC_IRQn, (uint32_t)Isr);    // "core_cm4.h" 参照
00032             NVIC_EnableIRQ(ADC_IRQn);                   // "core_cm4.h" 参照
00033         }    
00034 
00035         // AD 変換された値を読み込む
00036         //      -1.0f <= AD変換された値 < 1.0f
00037         virtual float Read() const { return ToFloat(myAdc_->DR); }
00038 
00039     private:
00040         static void (*fp_)();   // 割込みサービス・ルーチンの中で実行される関数のポインタ
00041 
00042         // 割込みサービス・ルーチン,このクラスで使っている ADC であることを確認
00043         static void Isr()
00044         {   if ((myAdc_->SR & ADC_SR_EOC_Msk) == ADC_SR_EOC) fp_(); }
00045     };
00046 
00047     // static メンバの実体
00048     void (*AdcF446_Intr::fp_)();
00049 }
00050 #endif  // ADC_F446_INTERRUPT_HPP
00051