diff --git a/miosix/arch/cortexM3_efm32gg/efm32gg332f1024_wandstem/interfaces-impl/high_resolution_timer_base.cpp b/miosix/arch/cortexM3_efm32gg/efm32gg332f1024_wandstem/interfaces-impl/high_resolution_timer_base.cpp index 3b1b96387437f98b4b0174b1759b568a95ef52aa..e8289c73777779e91c8782f22704f27d50a08d48 100644 --- a/miosix/arch/cortexM3_efm32gg/efm32gg332f1024_wandstem/interfaces-impl/high_resolution_timer_base.cpp +++ b/miosix/arch/cortexM3_efm32gg/efm32gg332f1024_wandstem/interfaces-impl/high_resolution_timer_base.cpp @@ -32,7 +32,6 @@ #include "kernel/timeconversion.h" #include "gpio_timer.h" #include "transceiver_timer.h" -#include "virtual_high_resolution_timer_base.cpp" #include "../../../../debugpin.h" using namespace miosix; @@ -195,7 +194,10 @@ void __attribute__((used)) cstirqhnd2(){ if ((TIMER2->IEN & TIMER_IEN_CC0) && (TIMER2->IF & TIMER_IF_CC0) ){ TIMER2->IEN &= ~ TIMER_IEN_CC0; TIMER2->IFC = TIMER_IFC_CC0; - + //disable the timeout + TIMER2->IEN &= ~ TIMER_IEN_CC1; + TIMER2->IFC = TIMER_IFC_CC1; + ms32chkp[0]=ms32time; //really in the past, the overflow of TIMER3 is occurred but the timer wasn't updated long long a=ms32chkp[0] | TIMER3->CC[0].CCV<<16 | TIMER2->CC[0].CCV;; @@ -210,7 +212,8 @@ void __attribute__((used)) cstirqhnd2(){ if ((TIMER2->IEN & TIMER_IEN_CC1) && (TIMER2->IF & TIMER_IF_CC1) ){ TIMER2->IFC = TIMER_IFC_CC1; - if(TIMER2->CC[2].CTRL & TIMER_CC_CTRL_MODE_OUTPUTCOMPARE){ + //if PEN, it means that we want to trigger, otherwise we are in timeout for input/capture + if(TIMER2->ROUTE & TIMER_ROUTE_CC1PEN){ if(faseTransceiver==0){ //get nextInterrupt long long t=ms32chkp[0]|TIMER2->CC[1].CCV; @@ -230,6 +233,7 @@ void __attribute__((used)) cstirqhnd2(){ long long diff=t-IRQgetTick(); if(diff<0){ TIMER2->IEN &= ~TIMER_IEN_CC1; + //Disable the input capture interrupt TIMER2->IEN &= ~TIMER_IEN_CC0; TIMER2->IFC = TIMER_IFC_CC0; //Reactivating the thread that is waiting for the event, WITHOUT changing the tWaiting @@ -340,9 +344,10 @@ void HighResolutionTimerBase::enableCC2InterruptTim1(bool enable){ } void HighResolutionTimerBase::enableCC0InterruptTim2(bool enable){ - if(enable) + if(enable){ + TIMER2->IFC= TIMER_IF_CC0; TIMER2->IEN|=TIMER_IEN_CC0; - else + }else TIMER2->IEN&=~TIMER_IEN_CC0; } @@ -475,22 +480,9 @@ void HighResolutionTimerBase::setModeGPIOTimer(bool input){ } } -void HighResolutionTimerBase::cleanBufferGPIO(){ - falseRead(&TIMER3->CC[2].CCV); - falseRead(&TIMER1->CC[2].CCV); - falseRead(&TIMER3->CC[2].CCV); - falseRead(&TIMER1->CC[2].CCV); -} - -void HighResolutionTimerBase::cleanBufferTrasceiver(){ - falseRead(&TIMER3->CC[0].CCV); - falseRead(&TIMER2->CC[0].CCV); - falseRead(&TIMER3->CC[0].CCV); - falseRead(&TIMER2->CC[0].CCV); -} - void HighResolutionTimerBase::setModeTransceiverTimer(bool input){ - //For input capture feature: + if(input){ + //For input capture feature: //Connect TIMER2->CC0 to pin PA8 aka excChB TIMER2->ROUTE |= TIMER_ROUTE_CC0PEN | TIMER_ROUTE_LOCATION_LOC0; @@ -510,15 +502,29 @@ void HighResolutionTimerBase::setModeTransceiverTimer(bool input){ | TIMER_CC_CTRL_INSEL_PRS | TIMER_CC_CTRL_ICEDGE_RISING | TIMER_CC_CTRL_MODE_INPUTCAPTURE; - + + TIMER2->CC[1].CTRL = TIMER_CC_CTRL_MODE_OUTPUTCOMPARE; + TIMER2->ROUTE &= ~TIMER_ROUTE_CC1PEN; //used as timeout the incoming event + }else{ //For output capture feature: //Connect TIMER2->CC1 to pin PA9 aka stxon - if(input){ - TIMER2->ROUTE |= TIMER_ROUTE_CC1PEN; //used to trigger at a give time on the stxon - }else{ - TIMER2->ROUTE &= ~TIMER_ROUTE_CC1PEN; //used as timeout the incoming event - } + TIMER2->ROUTE |= TIMER_ROUTE_CC1PEN; //used to trigger at a give time on the stxon TIMER2->CC[1].CTRL = TIMER_CC_CTRL_MODE_OUTPUTCOMPARE; + } +} + +void HighResolutionTimerBase::cleanBufferGPIO(){ + falseRead(&TIMER3->CC[2].CCV); + falseRead(&TIMER1->CC[2].CCV); + falseRead(&TIMER3->CC[2].CCV); + falseRead(&TIMER1->CC[2].CCV); +} + +void HighResolutionTimerBase::cleanBufferTrasceiver(){ + falseRead(&TIMER3->CC[0].CCV); + falseRead(&TIMER2->CC[0].CCV); + falseRead(&TIMER3->CC[0].CCV); + falseRead(&TIMER2->CC[0].CCV); } WaitResult HighResolutionTimerBase::IRQsetGPIOtimeout(long long tick){ @@ -630,4 +636,6 @@ HighResolutionTimerBase::HighResolutionTimerBase() { HighResolutionTimerBase::~HighResolutionTimerBase() { delete tc; -} \ No newline at end of file +} + +int HighResolutionTimerBase::aux=0; \ No newline at end of file diff --git a/miosix/arch/cortexM3_efm32gg/efm32gg332f1024_wandstem/interfaces-impl/high_resolution_timer_base.h b/miosix/arch/cortexM3_efm32gg/efm32gg332f1024_wandstem/interfaces-impl/high_resolution_timer_base.h index d4f79423bea6134374a4f531a0fd0965e2c6a836..84eb4f34a257ee227f857f2238ebfd1b623fdbef 100644 --- a/miosix/arch/cortexM3_efm32gg/efm32gg332f1024_wandstem/interfaces-impl/high_resolution_timer_base.h +++ b/miosix/arch/cortexM3_efm32gg/efm32gg332f1024_wandstem/interfaces-impl/high_resolution_timer_base.h @@ -112,7 +112,7 @@ class HighResolutionTimerBase { WaitResult IRQsetTransceiverTimeout(long long tick); virtual ~HighResolutionTimerBase(); - + static int aux; protected: HighResolutionTimerBase(); static const unsigned int freq; diff --git a/miosix/arch/cortexM3_efm32gg/efm32gg332f1024_wandstem/interfaces-impl/transceiver.cpp b/miosix/arch/cortexM3_efm32gg/efm32gg332f1024_wandstem/interfaces-impl/transceiver.cpp index 72426b1c58306c2531e2edb1e2e6a08abd5677da..f02343647a3f7ef94edc7eeb91fef0e62617c6e4 100644 --- a/miosix/arch/cortexM3_efm32gg/efm32gg332f1024_wandstem/interfaces-impl/transceiver.cpp +++ b/miosix/arch/cortexM3_efm32gg/efm32gg332f1024_wandstem/interfaces-impl/transceiver.cpp @@ -77,7 +77,7 @@ const auto timePerByte=32000; /// Time to send the first part of each packet (4 bytes preamble + 1 byte SFD) const auto preambleSfdTime=timePerByte*5; -/// Timeout from sending STXON to when the SFD should be sent +/// Timeout from sending STXON to when the SFD should be sent, around 500us const auto sfdTimeout=slack+turnaround+preambleSfdTime; /// Timeout from an SFD to when the maximum length packet should end diff --git a/miosix/arch/cortexM3_efm32gg/efm32gg332f1024_wandstem/interfaces-impl/transceiver_timer.cpp b/miosix/arch/cortexM3_efm32gg/efm32gg332f1024_wandstem/interfaces-impl/transceiver_timer.cpp index 895e53f65b672ff96a499aaa520a63fcd0a4b396..8c6b3e7637516a9d106c0ea89bdd6232c454fe34 100644 --- a/miosix/arch/cortexM3_efm32gg/efm32gg332f1024_wandstem/interfaces-impl/transceiver_timer.cpp +++ b/miosix/arch/cortexM3_efm32gg/efm32gg332f1024_wandstem/interfaces-impl/transceiver_timer.cpp @@ -67,7 +67,8 @@ bool TransceiverTimer::absoluteWaitTrigger(long long tick){ bool TransceiverTimer::absoluteWaitTimeoutOrEvent(long long tick){ FastInterruptDisableLock dLock; if(b.IRQsetTransceiverTimeout(tick)==WaitResult::WAKEUP_IN_THE_PAST){ - return true; + HighResolutionTimerBase::aux=1; + return true; } b.setModeTransceiverTimer(true); b.cleanBufferTrasceiver(); @@ -83,8 +84,10 @@ bool TransceiverTimer::absoluteWaitTimeoutOrEvent(long long tick){ } while(tWaiting && tick>b.getCurrentTick()); if(tWaiting==nullptr){ + HighResolutionTimerBase::aux=2; return false; }else{ + HighResolutionTimerBase::aux=3; return true; } }