@@ -28,6 +28,7 @@ typedef struct {
28
28
pin_size_t pin;
29
29
PIO pio;
30
30
int sm;
31
+ int off;
31
32
alarm_id_t alarm;
32
33
} Tone;
33
34
@@ -38,10 +39,18 @@ auto_init_mutex(_toneMutex);
38
39
static PIOProgram _tone2Pgm (&tone2_program);
39
40
static std::map<pin_size_t , Tone *> _toneMap;
40
41
42
+ static inline bool pio_sm_get_enabled (PIO pio, uint sm) {
43
+ check_pio_param (pio);
44
+ check_sm_param (sm);
45
+ return (pio->ctrl & ~(1u << sm)) & (1 << sm);
46
+ }
47
+
41
48
int64_t _stopTonePIO (alarm_id_t id, void *user_data) {
42
49
(void ) id;
43
50
Tone *tone = (Tone *)user_data;
44
51
tone->alarm = 0 ;
52
+ digitalWrite (tone->pin , LOW);
53
+ pinMode (tone->pin , OUTPUT);
45
54
pio_sm_set_enabled (tone->pio , tone->sm , false );
46
55
return 0 ;
47
56
}
@@ -72,14 +81,12 @@ void tone(uint8_t pin, unsigned int frequency, unsigned long duration) {
72
81
newTone = new Tone ();
73
82
newTone->pin = pin;
74
83
pinMode (pin, OUTPUT);
75
- int off;
76
- if (!_tone2Pgm.prepare (&newTone->pio , &newTone->sm , &off)) {
84
+ if (!_tone2Pgm.prepare (&newTone->pio , &newTone->sm , &newTone->off )) {
77
85
DEBUGCORE (" ERROR: tone unable to start, out of PIO resources\n " );
78
86
// ERROR, no free slots
79
87
delete newTone;
80
88
return ;
81
89
}
82
- tone2_program_init (newTone->pio , newTone->sm , off, pin);
83
90
newTone->alarm = 0 ;
84
91
} else {
85
92
newTone = entry->second ;
@@ -88,6 +95,9 @@ void tone(uint8_t pin, unsigned int frequency, unsigned long duration) {
88
95
newTone->alarm = 0 ;
89
96
}
90
97
}
98
+ if (!pio_sm_get_enabled (newTone->pio , newTone->sm )) {
99
+ tone2_program_init (newTone->pio , newTone->sm , newTone->off , pin);
100
+ }
91
101
pio_sm_clear_fifos (newTone->pio , newTone->sm ); // Remove any old updates that haven't yet taken effect
92
102
pio_sm_put_blocking (newTone->pio , newTone->sm , RP2040::usToPIOCycles (us));
93
103
pio_sm_set_enabled (newTone->pio , newTone->sm , true );
0 commit comments