16#include "timer_rp2350.h"
17#include "system_rp2350.h"
20using namespace _TIMER1_;
21using namespace _RESETS_;
24function<void()> timer_rp2350::_callback[8];
26timer_rp2350::timer_rp2350(int8_t index) {
30 for (index=0; index < 7; ++index) {
31 if (!_timerinst[index])
break;
35 assert(_timerinst[index] ==
nullptr);
39 _mask = 1 << (index % 4);
40 _mode = TIMER::ONE_SHOT;
46 _alarm = &(TIMER0.ALARM[index]);
47 TIMER0_SET.INTE = _mask;
50 _alarm = &(TIMER1.ALARM[index-4]);
51 TIMER1_SET.INTE = _mask;
54 _timerinst[index] =
this;
56 NVIC_EnableIRQ(IRQn_Type(TIMER0_IRQ_0_IRQn + index));
59timer_rp2350::~timer_rp2350() {
60 if (_timer->ARMED & _mask) {
61 _timer->ARMED = _mask;
63 _timerinst[_index] =
nullptr;
66void timer_rp2350::setPeriod(uint32_t us, TIMER::timer_mode mode) {
67 _period = us * timer_ticks_per_us;
71void timer_rp2350::setPeriod_ns(uint32_t ns, TIMER::timer_mode mode) {
72 _period = (ns * timer_ticks_per_us) / 1000;
76uint32_t timer_rp2350::getPeriod() {
77 return _period / timer_ticks_per_us;
80void timer_rp2350::setCallback(function<
void()> f) {
81 timer_rp2350::_callback[_index] = f;
84void timer_rp2350::start() {
85 *_alarm = _timer->TIMERAWL + _period;
88void timer_rp2350::stop() {
91 _timer->ARMED = _mask;
95bool timer_rp2350::isRunning() {
96 return _timer->ARMED & _mask;
99void timer_rp2350::reset() {
102 if (isRunning()) start();
105void timer_rp2350::irqHandler() {
107 _timer->INTR = _mask;
109 if (_mode == TIMER::PERIODIC) {
120void TIMER0_IRQ_0_Handler(
void) {
121 timer_rp2350::_timerinst[0]->irqHandler();
124void TIMER0_IRQ_1_Handler(
void) {
125 timer_rp2350::_timerinst[1]->irqHandler();
128void TIMER0_IRQ_2_Handler(
void) {
129 timer_rp2350::_timerinst[2]->irqHandler();
132void TIMER0_IRQ_3_Handler(
void) {
133 timer_rp2350::_timerinst[3]->irqHandler();
136void TIMER1_IRQ_0_Handler(
void) {
137 timer_rp2350::_timerinst[4]->irqHandler();
140void TIMER1_IRQ_1_Handler(
void) {
141 timer_rp2350::_timerinst[5]->irqHandler();
144void TIMER1_IRQ_2_Handler(
void) {
145 timer_rp2350::_timerinst[6]->irqHandler();
148void TIMER1_IRQ_3_Handler(
void) {
149 timer_rp2350::_timerinst[7]->irqHandler();