[HAL] Add tones support for the RPi Pico (#1239)
* Add tones support for RPi Pico * Add dependencies to CMakeLists * Address review
This commit is contained in:
parent
42ae7c92ed
commit
83e05701fe
2 changed files with 60 additions and 5 deletions
|
@ -23,11 +23,11 @@ add_executable(${PROJECT_NAME}
|
||||||
)
|
)
|
||||||
|
|
||||||
# Pull in common dependencies
|
# Pull in common dependencies
|
||||||
target_link_libraries(${PROJECT_NAME} pico_stdlib hardware_spi hardware_gpio hardware_timer RadioLib)
|
target_link_libraries(${PROJECT_NAME} pico_stdlib hardware_spi hardware_gpio hardware_timer pico_multicore hardware_pwm RadioLib)
|
||||||
|
|
||||||
|
|
||||||
pico_enable_stdio_usb(${PROJECT_NAME} 1)
|
pico_enable_stdio_usb(${PROJECT_NAME} 1)
|
||||||
pico_enable_stdio_uart(${PROJECT_NAME} 0)
|
pico_enable_stdio_uart(${PROJECT_NAME} 0)
|
||||||
|
|
||||||
# Create map/bin/hex file etc.
|
# Create map/bin/hex file etc.
|
||||||
pico_add_extra_outputs(${PROJECT_NAME})
|
pico_add_extra_outputs(${PROJECT_NAME})
|
||||||
|
|
|
@ -8,6 +8,45 @@
|
||||||
#include <pico/stdlib.h>
|
#include <pico/stdlib.h>
|
||||||
#include "hardware/spi.h"
|
#include "hardware/spi.h"
|
||||||
#include "hardware/timer.h"
|
#include "hardware/timer.h"
|
||||||
|
#include "hardware/pwm.h"
|
||||||
|
#include "hardware/clocks.h"
|
||||||
|
#include "pico/multicore.h"
|
||||||
|
|
||||||
|
uint32_t toneLoopPin;
|
||||||
|
unsigned int toneLoopFrequency;
|
||||||
|
unsigned long toneLoopDuration;
|
||||||
|
|
||||||
|
// 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
|
||||||
|
|
||||||
|
// === 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.
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// create a new Raspberry Pi Pico hardware abstraction
|
// create a new Raspberry Pi Pico hardware abstraction
|
||||||
// layer using the Pico SDK
|
// layer using the Pico SDK
|
||||||
|
@ -21,8 +60,7 @@ public:
|
||||||
_spiSpeed(spiSpeed),
|
_spiSpeed(spiSpeed),
|
||||||
_misoPin(misoPin),
|
_misoPin(misoPin),
|
||||||
_mosiPin(mosiPin),
|
_mosiPin(mosiPin),
|
||||||
_sckPin(sckPin) {
|
_sckPin(sckPin){}
|
||||||
}
|
|
||||||
|
|
||||||
void init() override {
|
void init() override {
|
||||||
stdio_init_all();
|
stdio_init_all();
|
||||||
|
@ -110,6 +148,19 @@ public:
|
||||||
return (this->micros() - start);
|
return (this->micros() - start);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tone(uint32_t pin, unsigned int frequency, unsigned long duration = 0) override {
|
||||||
|
// 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
void noTone(uint32_t pin) override {
|
||||||
|
multicore_reset_core1();
|
||||||
|
}
|
||||||
|
|
||||||
void spiBegin() {
|
void spiBegin() {
|
||||||
spi_init(_spiChannel, _spiSpeed);
|
spi_init(_spiChannel, _spiSpeed);
|
||||||
spi_set_format(_spiChannel, 8, SPI_CPOL_0, SPI_CPHA_0, SPI_MSB_FIRST);
|
spi_set_format(_spiChannel, 8, SPI_CPOL_0, SPI_CPHA_0, SPI_MSB_FIRST);
|
||||||
|
@ -125,6 +176,10 @@ public:
|
||||||
spi_write_read_blocking(_spiChannel, out, in, len);
|
spi_write_read_blocking(_spiChannel, out, in, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void yield() override {
|
||||||
|
tight_loop_contents();
|
||||||
|
}
|
||||||
|
|
||||||
void spiEndTransaction() {}
|
void spiEndTransaction() {}
|
||||||
|
|
||||||
void spiEnd() {
|
void spiEnd() {
|
||||||
|
@ -140,4 +195,4 @@ private:
|
||||||
uint32_t _sckPin;
|
uint32_t _sckPin;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue