8#include "timer_rp2040.h"
9#include "system_rp2040.h"
14function<void()> timer_rp2040::_callback[4];
16timer_rp2040::timer_rp2040(int8_t index) {
19 for (index=0; index < 4; ++index) {
20 if (!_timerinst[index])
break;
24 assert(_timerinst[index] ==
nullptr);
28 _ALARM = &(_TIMER_::TIMER.ALARM0) + index;
29 _mode = TIMER::ONE_SHOT;
32 _tick_factor= CLK_TICK / 1000000;
34 _timerinst[index] =
this;
36 _TIMER_::TIMER_SET.INTE = _mask;
38 NVIC_EnableIRQ(IRQn_Type(TIMER_IRQ_0_IRQn + index));
41timer_rp2040::~timer_rp2040() {
43 _timerinst[_index] =
nullptr;
46void timer_rp2040::setPeriod(uint32_t us, TIMER::timer_mode mode) {
47 _period = us * _tick_factor;
51void timer_rp2040::setPeriod_ns(uint32_t ns, TIMER::timer_mode mode) {
52 _period = (ns * _tick_factor) / 1000;
56uint32_t timer_rp2040::getPeriod() {
57 return _period / _tick_factor;
60void timer_rp2040::setCallback(function<
void()> f) {
61 timer_rp2040::_callback[_index] = f;
64void timer_rp2040::start() {
65 *_ALARM = _TIMER_::TIMER.TIMERAWL + _period;
68void timer_rp2040::stop() {
71 _TIMER_::TIMER.ARMED = _mask;
75bool timer_rp2040::isRunning() {
76 return _TIMER_::TIMER.ARMED & _mask;
79void timer_rp2040::reset() {
82 if (isRunning()) start();
85void timer_rp2040::irqHandler() {
87 _TIMER_::TIMER.INTR = _mask;
89 if (_mode == TIMER::PERIODIC) {
100void TIMER_IRQ_0_Handler(
void) {
101 timer_rp2040::_timerinst[0]->irqHandler();
104void TIMER_IRQ_1_Handler(
void) {
105 timer_rp2040::_timerinst[1]->irqHandler();
108void TIMER_IRQ_2_Handler(
void) {
109 timer_rp2040::_timerinst[2]->irqHandler();
112void TIMER_IRQ_3_Handler(
void) {
113 timer_rp2040::_timerinst[3]->irqHandler();