50 lines
1.3 KiB
C++
50 lines
1.3 KiB
C++
#include "PicoHal.h"
|
|
|
|
#if defined(RADIOLIB_BUILD_RPI_PICO)
|
|
|
|
// pre-calculated pulse-widths for 1200 and 2200Hz
|
|
// we do this to save calculation time (see https://github.com/khoih-prog/RP2040_PWM/issues/6)
|
|
#define SLEEP_1200 416.666
|
|
#define SLEEP_2200 227.272
|
|
|
|
static uint32_t toneLoopPin;
|
|
static unsigned int toneLoopFrequency;
|
|
static unsigned long toneLoopDuration;
|
|
|
|
// === NOTE ===
|
|
// The tone(...) implementation uses the second core on the RPi Pico. This is to diminish as much
|
|
// jitter in the output tones as possible.
|
|
|
|
static void toneLoop() {
|
|
gpio_set_dir(toneLoopPin, GPIO_OUT);
|
|
|
|
uint32_t sleep_dur;
|
|
if(toneLoopFrequency == 1200) {
|
|
sleep_dur = SLEEP_1200;
|
|
} else if(toneLoopFrequency == 2200) {
|
|
sleep_dur = SLEEP_2200;
|
|
} else {
|
|
sleep_dur = 500000 / toneLoopFrequency;
|
|
}
|
|
|
|
// tone bitbang
|
|
while(1) {
|
|
gpio_put(toneLoopPin, 1);
|
|
sleep_us(sleep_dur);
|
|
gpio_put(toneLoopPin, 0);
|
|
sleep_us(sleep_dur);
|
|
tight_loop_contents();
|
|
}
|
|
}
|
|
|
|
void PicoHal::tone(uint32_t pin, unsigned int frequency, unsigned long duration) {
|
|
// tones on the Pico are generated using bitbanging. This process is offloaded to the Pico's second core
|
|
multicore_reset_core1();
|
|
toneLoopPin = pin;
|
|
toneLoopFrequency = frequency;
|
|
toneLoopDuration = duration;
|
|
multicore_launch_core1(toneLoop);
|
|
}
|
|
|
|
#endif
|