Update README.md and use allman astyle

This commit is contained in:
Khoi Hoang
2022-11-18 21:55:30 -05:00
committed by GitHub
parent f9b2692779
commit df10f8d531
7 changed files with 243 additions and 200 deletions
+81 -80
View File
@@ -1,41 +1,41 @@
/****************************************************************************************************************************
RPi_Pico_ISR_Timer-Impl.h
For RP2040-based boards such as RASPBERRY_PI_PICO, ADAFRUIT_FEATHER_RP2040 and GENERIC_RP2040.
Written by Khoi Hoang
RPi_Pico_ISR_Timer-Impl.h
For RP2040-based boards such as RASPBERRY_PI_PICO, ADAFRUIT_FEATHER_RP2040 and GENERIC_RP2040.
Written by Khoi Hoang
Built by Khoi Hoang https://github.com/khoih-prog/RPI_PICO_TimerInterrupt
Licensed under MIT license
Built by Khoi Hoang https://github.com/khoih-prog/RPI_PICO_TimerInterrupt
Licensed under MIT license
The RPI_PICO system timer peripheral provides a global microsecond timebase for the system, and generates
interrupts based on this timebase. It supports the following features:
The RPI_PICO system timer peripheral provides a global microsecond timebase for the system, and generates
interrupts based on this timebase. It supports the following features:
• A single 64-bit counter, incrementing once per microsecond
• This counter can be read from a pair of latching registers, for race-free reads over a 32-bit bus.
• Four alarms: match on the lower 32 bits of counter, IRQ on match: TIMER_IRQ_0-TIMER_IRQ_3
Now even you use all these new 16 ISR-based timers,with their maximum interval practically unlimited (limited only by
unsigned long miliseconds), you just consume only one RPI_PICO timer and avoid conflicting with other cores' tasks.
The accuracy is nearly perfect compared to software timers. The most important feature is they're ISR-based timers
Therefore, their executions are not blocked by bad-behaving functions / tasks.
This important feature is absolutely necessary for mission-critical tasks.
Now even you use all these new 16 ISR-based timers,with their maximum interval practically unlimited (limited only by
unsigned long miliseconds), you just consume only one RPI_PICO timer and avoid conflicting with other cores' tasks.
The accuracy is nearly perfect compared to software timers. The most important feature is they're ISR-based timers
Therefore, their executions are not blocked by bad-behaving functions / tasks.
This important feature is absolutely necessary for mission-critical tasks.
Based on SimpleTimer - A timer library for Arduino.
Author: mromani@ottotecnica.com
Copyright (c) 2010 OTTOTECNICA Italy
Based on SimpleTimer - A timer library for Arduino.
Author: mromani@ottotecnica.com
Copyright (c) 2010 OTTOTECNICA Italy
Based on BlynkTimer.h
Author: Volodymyr Shymanskyy
Based on BlynkTimer.h
Author: Volodymyr Shymanskyy
Version: 1.3.1
Version: 1.3.1
Version Modified By Date Comments
------- ----------- ---------- -----------
1.0.0 K Hoang 11/05/2021 Initial coding to support RP2040-based boards such as RASPBERRY_PI_PICO. etc.
1.0.1 K Hoang 18/05/2021 Update README and Packages' Patches to match core arduino-pico core v1.4.0
1.1.0 K Hoang 10/00/2021 Add support to new boards using the arduino-pico core
1.1.1 K Hoang 22/10/2021 Fix platform in library.json for PIO
1.2.0 K.Hoang 21/01/2022 Fix `multiple-definitions` linker error
1.3.0 K.Hoang 25/09/2022 Fix severe bug affecting time between the starts
1.3.1 K.Hoang 29/09/2022 Using float instead of ulong for interval
Version Modified By Date Comments
------- ----------- ---------- -----------
1.0.0 K Hoang 11/05/2021 Initial coding to support RP2040-based boards such as RASPBERRY_PI_PICO. etc.
1.0.1 K Hoang 18/05/2021 Update README and Packages' Patches to match core arduino-pico core v1.4.0
1.1.0 K Hoang 10/00/2021 Add support to new boards using the arduino-pico core
1.1.1 K Hoang 22/10/2021 Fix platform in library.json for PIO
1.2.0 K.Hoang 21/01/2022 Fix `multiple-definitions` linker error
1.3.0 K.Hoang 25/09/2022 Fix severe bug affecting time between the starts
1.3.1 K.Hoang 29/09/2022 Using float instead of ulong for interval
*****************************************************************************************************************************/
#pragma once
@@ -54,11 +54,11 @@ RPI_PICO_ISR_Timer::RPI_PICO_ISR_Timer()
////////////////////////////////////////////////////////////////
void RPI_PICO_ISR_Timer::init()
void RPI_PICO_ISR_Timer::init()
{
unsigned long current_millis = millis(); //elapsed();
for (uint8_t i = 0; i < RPI_PICO_MAX_TIMERS; i++)
for (uint8_t i = 0; i < RPI_PICO_MAX_TIMERS; i++)
{
memset((void*) &timer[i], 0, sizeof (timer_t));
timer[i].prev_millis = current_millis;
@@ -69,7 +69,7 @@ void RPI_PICO_ISR_Timer::init()
////////////////////////////////////////////////////////////////
void RPI_PICO_ISR_Timer::run()
void RPI_PICO_ISR_Timer::run()
{
uint8_t i;
unsigned long current_millis;
@@ -79,43 +79,43 @@ void RPI_PICO_ISR_Timer::run()
// RPI_PICO is a multi core / multi processing chip. It is mandatory to disable task switches during ISR
rp2040.idleOtherCore();
for (i = 0; i < RPI_PICO_MAX_TIMERS; i++)
for (i = 0; i < RPI_PICO_MAX_TIMERS; i++)
{
timer[i].toBeCalled = RPI_PICO_DEFCALL_DONTRUN;
// no callback == no timer, i.e. jump over empty slots
if (timer[i].callback != NULL)
if (timer[i].callback != NULL)
{
// is it time to process this timer ?
// see http://arduino.cc/forum/index.php/topic,124048.msg932592.html#msg932592
if ((current_millis - timer[i].prev_millis) >= timer[i].delay)
if ((current_millis - timer[i].prev_millis) >= timer[i].delay)
{
unsigned long skipTimes = (current_millis - timer[i].prev_millis) / timer[i].delay;
// update time
timer[i].prev_millis += timer[i].delay * skipTimes;
// check if the timer callback has to be executed
if (timer[i].enabled)
if (timer[i].enabled)
{
// "run forever" timers must always be executed
if (timer[i].maxNumRuns == RPI_PICO_RUN_FOREVER)
if (timer[i].maxNumRuns == RPI_PICO_RUN_FOREVER)
{
timer[i].toBeCalled = RPI_PICO_DEFCALL_RUNONLY;
}
// other timers get executed the specified number of times
else if (timer[i].numRuns < timer[i].maxNumRuns)
else if (timer[i].numRuns < timer[i].maxNumRuns)
{
timer[i].toBeCalled = RPI_PICO_DEFCALL_RUNONLY;
timer[i].numRuns++;
// after the last run, delete the timer
if (timer[i].numRuns >= timer[i].maxNumRuns)
if (timer[i].numRuns >= timer[i].maxNumRuns)
{
timer[i].toBeCalled = RPI_PICO_DEFCALL_RUNANDDEL;
}
@@ -125,7 +125,7 @@ void RPI_PICO_ISR_Timer::run()
}
}
for (i = 0; i < RPI_PICO_MAX_TIMERS; i++)
for (i = 0; i < RPI_PICO_MAX_TIMERS; i++)
{
if (timer[i].toBeCalled == RPI_PICO_DEFCALL_DONTRUN)
continue;
@@ -148,18 +148,18 @@ void RPI_PICO_ISR_Timer::run()
// find the first available slot
// return -1 if none found
int RPI_PICO_ISR_Timer::findFirstFreeSlot()
int RPI_PICO_ISR_Timer::findFirstFreeSlot()
{
// all slots are used
if (numTimers >= RPI_PICO_MAX_TIMERS)
if (numTimers >= RPI_PICO_MAX_TIMERS)
{
return -1;
}
// return the first slot with no callback (i.e. free)
for (uint8_t i = 0; i < RPI_PICO_MAX_TIMERS; i++)
for (uint8_t i = 0; i < RPI_PICO_MAX_TIMERS; i++)
{
if (timer[i].callback == NULL)
if (timer[i].callback == NULL)
{
return i;
}
@@ -171,22 +171,23 @@ int RPI_PICO_ISR_Timer::findFirstFreeSlot()
////////////////////////////////////////////////////////////////
int RPI_PICO_ISR_Timer::setupTimer(const float& d, void* f, void* p, bool h, const unsigned& n)
int RPI_PICO_ISR_Timer::setupTimer(const float& d, void* f, void* p, bool h, const unsigned& n)
{
int freeTimer;
if (numTimers < 0)
if (numTimers < 0)
{
init();
}
freeTimer = findFirstFreeSlot();
if (freeTimer < 0)
if (freeTimer < 0)
{
return -1;
}
if (f == NULL)
if (f == NULL)
{
return -1;
}
@@ -206,57 +207,57 @@ int RPI_PICO_ISR_Timer::setupTimer(const float& d, void* f, void* p, bool h, con
////////////////////////////////////////////////////////////////
int RPI_PICO_ISR_Timer::setTimer(const float& d, timer_callback f, const unsigned& n)
int RPI_PICO_ISR_Timer::setTimer(const float& d, timer_callback f, const unsigned& n)
{
return setupTimer(d, (void *)f, NULL, false, n);
}
////////////////////////////////////////////////////////////////
int RPI_PICO_ISR_Timer::setTimer(const float& d, timer_callback_p f, void* p, const unsigned& n)
int RPI_PICO_ISR_Timer::setTimer(const float& d, timer_callback_p f, void* p, const unsigned& n)
{
return setupTimer(d, (void *)f, p, true, n);
}
////////////////////////////////////////////////////////////////
int RPI_PICO_ISR_Timer::setInterval(const float& d, timer_callback f)
int RPI_PICO_ISR_Timer::setInterval(const float& d, timer_callback f)
{
return setupTimer(d, (void *)f, NULL, false, RPI_PICO_RUN_FOREVER);
}
////////////////////////////////////////////////////////////////
int RPI_PICO_ISR_Timer::setInterval(const float& d, timer_callback_p f, void* p)
int RPI_PICO_ISR_Timer::setInterval(const float& d, timer_callback_p f, void* p)
{
return setupTimer(d, (void *)f, p, true, RPI_PICO_RUN_FOREVER);
}
////////////////////////////////////////////////////////////////
int RPI_PICO_ISR_Timer::setTimeout(const float& d, timer_callback f)
int RPI_PICO_ISR_Timer::setTimeout(const float& d, timer_callback f)
{
return setupTimer(d, (void *)f, NULL, false, RPI_PICO_RUN_ONCE);
}
////////////////////////////////////////////////////////////////
int RPI_PICO_ISR_Timer::setTimeout(const float& d, timer_callback_p f, void* p)
int RPI_PICO_ISR_Timer::setTimeout(const float& d, timer_callback_p f, void* p)
{
return setupTimer(d, (void *)f, p, true, RPI_PICO_RUN_ONCE);
}
////////////////////////////////////////////////////////////////
bool RPI_PICO_ISR_Timer::changeInterval(const unsigned& numTimer, const float& d)
bool RPI_PICO_ISR_Timer::changeInterval(const unsigned& numTimer, const float& d)
{
if (numTimer >= RPI_PICO_MAX_TIMERS)
if (numTimer >= RPI_PICO_MAX_TIMERS)
{
return false;
}
// Updates interval of existing specified timer
if (timer[numTimer].callback != NULL)
if (timer[numTimer].callback != NULL)
{
// RPI_PICO is a multi core / multi processing chip. It is mandatory to disable task switches during modifying shared vars
rp2040.idleOtherCore();
@@ -269,28 +270,28 @@ bool RPI_PICO_ISR_Timer::changeInterval(const unsigned& numTimer, const float& d
return true;
}
// false return for non-used numTimer, no callback
return false;
}
////////////////////////////////////////////////////////////////
void RPI_PICO_ISR_Timer::deleteTimer(const unsigned& timerId)
void RPI_PICO_ISR_Timer::deleteTimer(const unsigned& timerId)
{
if (timerId >= RPI_PICO_MAX_TIMERS)
if (timerId >= RPI_PICO_MAX_TIMERS)
{
return;
}
// nothing to delete if no timers are in use
if (numTimers == 0)
if (numTimers == 0)
{
return;
}
// don't decrease the number of timers if the specified slot is already empty
if (timer[timerId].callback != NULL)
if (timer[timerId].callback != NULL)
{
// RPI_PICO is a multi core / multi processing chip. It is mandatory to disable task switches during modifying shared vars
rp2040.idleOtherCore();
@@ -310,9 +311,9 @@ void RPI_PICO_ISR_Timer::deleteTimer(const unsigned& timerId)
////////////////////////////////////////////////////////////////
// function contributed by code@rowansimms.com
void RPI_PICO_ISR_Timer::restartTimer(const unsigned& numTimer)
void RPI_PICO_ISR_Timer::restartTimer(const unsigned& numTimer)
{
if (numTimer >= RPI_PICO_MAX_TIMERS)
if (numTimer >= RPI_PICO_MAX_TIMERS)
{
return;
}
@@ -328,9 +329,9 @@ void RPI_PICO_ISR_Timer::restartTimer(const unsigned& numTimer)
////////////////////////////////////////////////////////////////
bool RPI_PICO_ISR_Timer::isEnabled(const unsigned& numTimer)
bool RPI_PICO_ISR_Timer::isEnabled(const unsigned& numTimer)
{
if (numTimer >= RPI_PICO_MAX_TIMERS)
if (numTimer >= RPI_PICO_MAX_TIMERS)
{
return false;
}
@@ -340,9 +341,9 @@ bool RPI_PICO_ISR_Timer::isEnabled(const unsigned& numTimer)
////////////////////////////////////////////////////////////////
void RPI_PICO_ISR_Timer::enable(const unsigned& numTimer)
void RPI_PICO_ISR_Timer::enable(const unsigned& numTimer)
{
if (numTimer >= RPI_PICO_MAX_TIMERS)
if (numTimer >= RPI_PICO_MAX_TIMERS)
{
return;
}
@@ -352,9 +353,9 @@ void RPI_PICO_ISR_Timer::enable(const unsigned& numTimer)
////////////////////////////////////////////////////////////////
void RPI_PICO_ISR_Timer::disable(const unsigned& numTimer)
void RPI_PICO_ISR_Timer::disable(const unsigned& numTimer)
{
if (numTimer >= RPI_PICO_MAX_TIMERS)
if (numTimer >= RPI_PICO_MAX_TIMERS)
{
return;
}
@@ -364,16 +365,16 @@ void RPI_PICO_ISR_Timer::disable(const unsigned& numTimer)
////////////////////////////////////////////////////////////////
void RPI_PICO_ISR_Timer::enableAll()
void RPI_PICO_ISR_Timer::enableAll()
{
// Enable all timers with a callback assigned (used)
// RPI_PICO is a multi core / multi processing chip. It is mandatory to disable task switches during modifying shared vars
rp2040.idleOtherCore();
for (uint8_t i = 0; i < RPI_PICO_MAX_TIMERS; i++)
for (uint8_t i = 0; i < RPI_PICO_MAX_TIMERS; i++)
{
if (timer[i].callback != NULL && timer[i].numRuns == RPI_PICO_RUN_FOREVER)
if (timer[i].callback != NULL && timer[i].numRuns == RPI_PICO_RUN_FOREVER)
{
timer[i].enabled = true;
}
@@ -385,16 +386,16 @@ void RPI_PICO_ISR_Timer::enableAll()
////////////////////////////////////////////////////////////////
void RPI_PICO_ISR_Timer::disableAll()
void RPI_PICO_ISR_Timer::disableAll()
{
// Disable all timers with a callback assigned (used)
// RPI_PICO is a multi core / multi processing chip. It is mandatory to disable task switches during modifying shared vars
rp2040.idleOtherCore();
for (uint8_t i = 0; i < RPI_PICO_MAX_TIMERS; i++)
for (uint8_t i = 0; i < RPI_PICO_MAX_TIMERS; i++)
{
if (timer[i].callback != NULL && timer[i].numRuns == RPI_PICO_RUN_FOREVER)
if (timer[i].callback != NULL && timer[i].numRuns == RPI_PICO_RUN_FOREVER)
{
timer[i].enabled = false;
}
@@ -407,9 +408,9 @@ void RPI_PICO_ISR_Timer::disableAll()
////////////////////////////////////////////////////////////////
void RPI_PICO_ISR_Timer::toggle(const unsigned& numTimer)
void RPI_PICO_ISR_Timer::toggle(const unsigned& numTimer)
{
if (numTimer >= RPI_PICO_MAX_TIMERS)
if (numTimer >= RPI_PICO_MAX_TIMERS)
{
return;
}
@@ -419,7 +420,7 @@ void RPI_PICO_ISR_Timer::toggle(const unsigned& numTimer)
////////////////////////////////////////////////////////////////
unsigned RPI_PICO_ISR_Timer::getNumTimers()
unsigned RPI_PICO_ISR_Timer::getNumTimers()
{
return numTimers;
}
+27 -27
View File
@@ -1,41 +1,41 @@
/****************************************************************************************************************************
RPi_Pico_ISR_Timer.h
For RP2040-based boards such as RASPBERRY_PI_PICO, ADAFRUIT_FEATHER_RP2040 and GENERIC_RP2040.
Written by Khoi Hoang
RPi_Pico_ISR_Timer.h
For RP2040-based boards such as RASPBERRY_PI_PICO, ADAFRUIT_FEATHER_RP2040 and GENERIC_RP2040.
Written by Khoi Hoang
Built by Khoi Hoang https://github.com/khoih-prog/RPI_PICO_TimerInterrupt
Licensed under MIT license
Built by Khoi Hoang https://github.com/khoih-prog/RPI_PICO_TimerInterrupt
Licensed under MIT license
The RPI_PICO system timer peripheral provides a global microsecond timebase for the system, and generates
interrupts based on this timebase. It supports the following features:
The RPI_PICO system timer peripheral provides a global microsecond timebase for the system, and generates
interrupts based on this timebase. It supports the following features:
• A single 64-bit counter, incrementing once per microsecond
• This counter can be read from a pair of latching registers, for race-free reads over a 32-bit bus.
• Four alarms: match on the lower 32 bits of counter, IRQ on match: TIMER_IRQ_0-TIMER_IRQ_3
Now even you use all these new 16 ISR-based timers,with their maximum interval practically unlimited (limited only by
unsigned long miliseconds), you just consume only one RPI_PICO timer and avoid conflicting with other cores' tasks.
The accuracy is nearly perfect compared to software timers. The most important feature is they're ISR-based timers
Therefore, their executions are not blocked by bad-behaving functions / tasks.
This important feature is absolutely necessary for mission-critical tasks.
Now even you use all these new 16 ISR-based timers,with their maximum interval practically unlimited (limited only by
unsigned long miliseconds), you just consume only one RPI_PICO timer and avoid conflicting with other cores' tasks.
The accuracy is nearly perfect compared to software timers. The most important feature is they're ISR-based timers
Therefore, their executions are not blocked by bad-behaving functions / tasks.
This important feature is absolutely necessary for mission-critical tasks.
Based on SimpleTimer - A timer library for Arduino.
Author: mromani@ottotecnica.com
Copyright (c) 2010 OTTOTECNICA Italy
Based on SimpleTimer - A timer library for Arduino.
Author: mromani@ottotecnica.com
Copyright (c) 2010 OTTOTECNICA Italy
Based on BlynkTimer.h
Author: Volodymyr Shymanskyy
Based on BlynkTimer.h
Author: Volodymyr Shymanskyy
Version: 1.3.1
Version: 1.3.1
Version Modified By Date Comments
------- ----------- ---------- -----------
1.0.0 K Hoang 11/05/2021 Initial coding to support RP2040-based boards such as RASPBERRY_PI_PICO. etc.
1.0.1 K Hoang 18/05/2021 Update README and Packages' Patches to match core arduino-pico core v1.4.0
1.1.0 K Hoang 10/00/2021 Add support to new boards using the arduino-pico core
1.1.1 K Hoang 22/10/2021 Fix platform in library.json for PIO
1.2.0 K.Hoang 21/01/2022 Fix `multiple-definitions` linker error
1.3.0 K.Hoang 25/09/2022 Fix severe bug affecting time between the starts
1.3.1 K.Hoang 29/09/2022 Using float instead of ulong for interval
Version Modified By Date Comments
------- ----------- ---------- -----------
1.0.0 K Hoang 11/05/2021 Initial coding to support RP2040-based boards such as RASPBERRY_PI_PICO. etc.
1.0.1 K Hoang 18/05/2021 Update README and Packages' Patches to match core arduino-pico core v1.4.0
1.1.0 K Hoang 10/00/2021 Add support to new boards using the arduino-pico core
1.1.1 K Hoang 22/10/2021 Fix platform in library.json for PIO
1.2.0 K.Hoang 21/01/2022 Fix `multiple-definitions` linker error
1.3.0 K.Hoang 25/09/2022 Fix severe bug affecting time between the starts
1.3.1 K.Hoang 29/09/2022 Using float instead of ulong for interval
*****************************************************************************************************************************/
#pragma once
+55 -55
View File
@@ -1,42 +1,42 @@
/****************************************************************************************************************************
RPi_Pico_TimerInterrupt.h
For RP2040-based boards such as RASPBERRY_PI_PICO, ADAFRUIT_FEATHER_RP2040 and GENERIC_RP2040.
Written by Khoi Hoang
RPi_Pico_TimerInterrupt.h
For RP2040-based boards such as RASPBERRY_PI_PICO, ADAFRUIT_FEATHER_RP2040 and GENERIC_RP2040.
Written by Khoi Hoang
Built by Khoi Hoang https://github.com/khoih-prog/RPI_PICO_TimerInterrupt
Licensed under MIT license
Built by Khoi Hoang https://github.com/khoih-prog/RPI_PICO_TimerInterrupt
Licensed under MIT license
The RPI_PICO system timer peripheral provides a global microsecond timebase for the system, and generates
interrupts based on this timebase. It supports the following features:
The RPI_PICO system timer peripheral provides a global microsecond timebase for the system, and generates
interrupts based on this timebase. It supports the following features:
• A single 64-bit counter, incrementing once per microsecond
• This counter can be read from a pair of latching registers, for race-free reads over a 32-bit bus.
• Four alarms: match on the lower 32 bits of counter, IRQ on match: TIMER_IRQ_0-TIMER_IRQ_3
Now even you use all these new 16 ISR-based timers,with their maximum interval practically unlimited (limited only by
unsigned long miliseconds), you just consume only one RPI_PICO timer and avoid conflicting with other cores' tasks.
The accuracy is nearly perfect compared to software timers. The most important feature is they're ISR-based timers
Therefore, their executions are not blocked by bad-behaving functions / tasks.
This important feature is absolutely necessary for mission-critical tasks.
Now even you use all these new 16 ISR-based timers,with their maximum interval practically unlimited (limited only by
unsigned long miliseconds), you just consume only one RPI_PICO timer and avoid conflicting with other cores' tasks.
The accuracy is nearly perfect compared to software timers. The most important feature is they're ISR-based timers
Therefore, their executions are not blocked by bad-behaving functions / tasks.
This important feature is absolutely necessary for mission-critical tasks.
Based on SimpleTimer - A timer library for Arduino.
Author: mromani@ottotecnica.com
Copyright (c) 2010 OTTOTECNICA Italy
Based on SimpleTimer - A timer library for Arduino.
Author: mromani@ottotecnica.com
Copyright (c) 2010 OTTOTECNICA Italy
Based on BlynkTimer.h
Author: Volodymyr Shymanskyy
Based on BlynkTimer.h
Author: Volodymyr Shymanskyy
Version: 1.3.1
Version: 1.3.1
Version Modified By Date Comments
------- ----------- ---------- -----------
1.0.0 K Hoang 11/05/2021 Initial coding to support RP2040-based boards such as RASPBERRY_PI_PICO. etc.
1.0.1 K Hoang 18/05/2021 Update README and Packages' Patches to match core arduino-pico core v1.4.0
1.1.0 K Hoang 10/00/2021 Add support to new boards using the arduino-pico core
1.1.1 K Hoang 22/10/2021 Fix platform in library.json for PIO
1.2.0 K.Hoang 21/01/2022 Fix `multiple-definitions` linker error
1.3.0 K.Hoang 25/09/2022 Fix severe bug affecting time between the starts
1.3.1 K.Hoang 29/09/2022 Using float instead of ulong for interval
Version Modified By Date Comments
------- ----------- ---------- -----------
1.0.0 K Hoang 11/05/2021 Initial coding to support RP2040-based boards such as RASPBERRY_PI_PICO. etc.
1.0.1 K Hoang 18/05/2021 Update README and Packages' Patches to match core arduino-pico core v1.4.0
1.1.0 K Hoang 10/00/2021 Add support to new boards using the arduino-pico core
1.1.1 K Hoang 22/10/2021 Fix platform in library.json for PIO
1.2.0 K.Hoang 21/01/2022 Fix `multiple-definitions` linker error
1.3.0 K.Hoang 25/09/2022 Fix severe bug affecting time between the starts
1.3.1 K.Hoang 29/09/2022 Using float instead of ulong for interval
*****************************************************************************************************************************/
#pragma once
@@ -44,11 +44,11 @@
#ifndef RPI_PICO_TIMERINTERRUPT_H
#define RPI_PICO_TIMERINTERRUPT_H
#if ( defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_RASPBERRY_PI_PICO) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) || defined(ARDUINO_GENERIC_RP2040) ) && !defined(ARDUINO_ARCH_MBED)
#if ( defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_RASPBERRY_PI_PICO) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) || defined(ARDUINO_GENERIC_RP2040) ) && !defined(ARDUINO_ARCH_MBED)
#if defined(USING_RPI_PICO_TIMER_INTERRUPT)
#undef USING_RPI_PICO_TIMER_INTERRUPT
#endif
#define USING_RPI_PICO_TIMER_INTERRUPT true
#endif
#define USING_RPI_PICO_TIMER_INTERRUPT true
#else
#error This code is intended to run on the non-mbed RP2040 arduino-pico platform! Please check your Tools->Board setting.
#endif
@@ -57,7 +57,7 @@
#ifndef RPI_PICO_TIMER_INTERRUPT_VERSION
#define RPI_PICO_TIMER_INTERRUPT_VERSION "RPi_Pico_TimerInterrupt v1.3.1"
#define RPI_PICO_TIMER_INTERRUPT_VERSION_MAJOR 1
#define RPI_PICO_TIMER_INTERRUPT_VERSION_MINOR 3
#define RPI_PICO_TIMER_INTERRUPT_VERSION_PATCH 1
@@ -85,13 +85,13 @@
////////////////////////////////////////////////////////////////
/*
To enable an alarm:
• Enable the interrupt at the timer with a write to the appropriate alarm bit in INTE: i.e. (1 << 0) for ALARM0
• Enable the appropriate timer interrupt at the processor (see Section 2.3.2)
• Write the time you would like the interrupt to fire to ALARM0 (i.e. the current value in TIMERAWL plus your desired
To enable an alarm:
• Enable the interrupt at the timer with a write to the appropriate alarm bit in INTE: i.e. (1 << 0) for ALARM0
• Enable the appropriate timer interrupt at the processor (see Section 2.3.2)
• Write the time you would like the interrupt to fire to ALARM0 (i.e. the current value in TIMERAWL plus your desired
alarm time in microseconds). Writing the time to the ALARM register sets the ARMED bit as a side effect.
Once the alarm has fired, the ARMED bit will be set to 0 . To clear the latched interrupt, write a 1 to the appropriate bit in
INTR.
Once the alarm has fired, the ARMED bit will be set to 0 . To clear the latched interrupt, write a 1 to the appropriate bit in
INTR.
*/
@@ -109,64 +109,64 @@ typedef bool (*pico_timer_callback) (struct repeating_timer *t);
class RPI_PICO_TimerInterrupt
{
private:
uint8_t _timerNo;
pico_timer_callback _callback; // pointer to the callback function
float _frequency; // Timer frequency
int64_t _timerCount; // count to activate timer, in us
struct repeating_timer _timer;
public:
RPI_PICO_TimerInterrupt(uint8_t timerNo)
{
{
_timerNo = timerNo;
_callback = NULL;
};
////////////////////////////////////////////////////////////////
#define TIM_CLOCK_FREQ ( (float) 1000000.0f )
#define TIM_CLOCK_FREQ ( (float) 1000000.0f )
// frequency (in hertz) and duration (in milliseconds). Duration = 0 or not specified => run indefinitely
// No params and duration now. To be added in the future by adding similar functions here
bool setFrequency(const float& frequency, pico_timer_callback callback)
{
if (_timerNo < MAX_RPI_PICO_NUM_TIMERS)
{
{
if ( (frequency == 0.0f) || (frequency > 100000.0f) || (callback == NULL) )
{
TISR_LOGERROR(F("Error. frequency == 0, higher than 100KHz or callback == NULL "));
return false;
}
// select timer frequency is 1MHz for better accuracy. We don't use 16-bit prescaler for now.
// Will use later if very low frequency is needed.
// Will use later if very low frequency is needed.
_frequency = frequency;
_timerCount = (int64_t) (TIM_CLOCK_FREQ / frequency);
TISR_LOGWARN5(F("_timerNo = "), _timerNo, F(", Clock (Hz) = "), TIM_CLOCK_FREQ, F(", _fre (Hz) = "), _frequency);
TISR_LOGWARN3(F("_count = "), (uint32_t) (_timerCount >> 32) , F("-"), (uint32_t) (_timerCount));
TISR_LOGWARN3(F("_count = "), (uint32_t) (_timerCount >> 32), F("-"), (uint32_t) (_timerCount));
_callback = callback;
// static bool add_repeating_timer_us(int64_t delay_us, repeating_timer_callback_t callback, void *user_data, repeating_timer_t *out);
// static bool add_repeating_timer_ms(int64_t delay_ms, repeating_timer_callback_t callback, void *user_data, repeating_timer_t *out);
// bool cancel_repeating_timer (repeating_timer_t *timer);
//////////////////////////////////////////////////////////////////////////
// Important Notes
// delay_ms the repeat delay in milliseconds; if >0 then this is the delay between one callback ending and the next
// starting; if <0 then this is the negative of the time between the starts of the callbacks.
// starting; if <0 then this is the negative of the time between the starts of the callbacks.
// The value of 0 is treated as 1 microsecond
//////////////////////////////////////////////////////////////////////////
cancel_repeating_timer(&_timer);
// Use negative value to select time between the starts of the callbacks
add_repeating_timer_us(-(_timerCount), _callback, NULL, &_timer);
TISR_LOGWARN1(F("add_repeating_timer_us between starts = "), _timerCount);
return true;
@@ -174,7 +174,7 @@ class RPI_PICO_TimerInterrupt
else
{
TISR_LOGERROR(F("Error. Timer must be 0-3"));
return false;
}
}
@@ -259,7 +259,7 @@ class RPI_PICO_TimerInterrupt
};
////////////////////////////////////////////////////////////////
}; // class RPI_PICO_TimerInterrupt
#endif // RPI_PICO_TIMERINTERRUPT_H
+27 -27
View File
@@ -1,41 +1,41 @@
/****************************************************************************************************************************
TimerInterrupt_Generic_Debug.h
For RP2040-based boards such as RASPBERRY_PI_PICO, ADAFRUIT_FEATHER_RP2040 and GENERIC_RP2040.
Written by Khoi Hoang
TimerInterrupt_Generic_Debug.h
For RP2040-based boards such as RASPBERRY_PI_PICO, ADAFRUIT_FEATHER_RP2040 and GENERIC_RP2040.
Written by Khoi Hoang
Built by Khoi Hoang https://github.com/khoih-prog/RPI_PICO_TimerInterrupt
Licensed under MIT license
Built by Khoi Hoang https://github.com/khoih-prog/RPI_PICO_TimerInterrupt
Licensed under MIT license
The RPI_PICO system timer peripheral provides a global microsecond timebase for the system, and generates
interrupts based on this timebase. It supports the following features:
The RPI_PICO system timer peripheral provides a global microsecond timebase for the system, and generates
interrupts based on this timebase. It supports the following features:
• A single 64-bit counter, incrementing once per microsecond
• This counter can be read from a pair of latching registers, for race-free reads over a 32-bit bus.
• Four alarms: match on the lower 32 bits of counter, IRQ on match: TIMER_IRQ_0-TIMER_IRQ_3
Now even you use all these new 16 ISR-based timers,with their maximum interval practically unlimited (limited only by
unsigned long miliseconds), you just consume only one RPI_PICO timer and avoid conflicting with other cores' tasks.
The accuracy is nearly perfect compared to software timers. The most important feature is they're ISR-based timers
Therefore, their executions are not blocked by bad-behaving functions / tasks.
This important feature is absolutely necessary for mission-critical tasks.
Now even you use all these new 16 ISR-based timers,with their maximum interval practically unlimited (limited only by
unsigned long miliseconds), you just consume only one RPI_PICO timer and avoid conflicting with other cores' tasks.
The accuracy is nearly perfect compared to software timers. The most important feature is they're ISR-based timers
Therefore, their executions are not blocked by bad-behaving functions / tasks.
This important feature is absolutely necessary for mission-critical tasks.
Based on SimpleTimer - A timer library for Arduino.
Author: mromani@ottotecnica.com
Copyright (c) 2010 OTTOTECNICA Italy
Based on SimpleTimer - A timer library for Arduino.
Author: mromani@ottotecnica.com
Copyright (c) 2010 OTTOTECNICA Italy
Based on BlynkTimer.h
Author: Volodymyr Shymanskyy
Based on BlynkTimer.h
Author: Volodymyr Shymanskyy
Version: 1.3.1
Version: 1.3.1
Version Modified By Date Comments
------- ----------- ---------- -----------
1.0.0 K Hoang 11/05/2021 Initial coding to support RP2040-based boards such as RASPBERRY_PI_PICO. etc.
1.0.1 K Hoang 18/05/2021 Update README and Packages' Patches to match core arduino-pico core v1.4.0
1.1.0 K Hoang 10/00/2021 Add support to new boards using the arduino-pico core
1.1.1 K Hoang 22/10/2021 Fix platform in library.json for PIO
1.2.0 K.Hoang 21/01/2022 Fix `multiple-definitions` linker error
1.3.0 K.Hoang 25/09/2022 Fix severe bug affecting time between the starts
1.3.1 K.Hoang 29/09/2022 Using float instead of ulong for interval
Version Modified By Date Comments
------- ----------- ---------- -----------
1.0.0 K Hoang 11/05/2021 Initial coding to support RP2040-based boards such as RASPBERRY_PI_PICO. etc.
1.0.1 K Hoang 18/05/2021 Update README and Packages' Patches to match core arduino-pico core v1.4.0
1.1.0 K Hoang 10/00/2021 Add support to new boards using the arduino-pico core
1.1.1 K Hoang 22/10/2021 Fix platform in library.json for PIO
1.2.0 K.Hoang 21/01/2022 Fix `multiple-definitions` linker error
1.3.0 K.Hoang 25/09/2022 Fix severe bug affecting time between the starts
1.3.1 K.Hoang 29/09/2022 Using float instead of ulong for interval
*****************************************************************************************************************************/
#pragma once