@@ -216,6 +216,8 @@ PinStatus digitalRead(pin_size_t pinNumber) {
216
216
#define MAX_TONE_PINS DT_PROP_LEN (DT_PATH(zephyr_user), digital_pin_gpios)
217
217
#endif
218
218
219
+ #define TOGGLES_PER_CYCLE 2ULL
220
+
219
221
struct pin_timer {
220
222
struct k_timer timer;
221
223
uint32_t count;
@@ -241,9 +243,15 @@ void tone_expiry_cb(struct k_timer *timer) {
241
243
void tone (pin_size_t pinNumber, unsigned int frequency,
242
244
unsigned long duration) {
243
245
const struct gpio_dt_spec *spec = &arduino_pins[pinNumber];
244
- struct k_timer *timer = &arduino_pin_timers[pinNumber]. timer ;
246
+ struct k_timer *timer;
245
247
k_timeout_t timeout;
246
248
249
+ if (pinNumber >= MAX_TONE_PINS) {
250
+ return ;
251
+ }
252
+
253
+ timer = &arduino_pin_timers[pinNumber].timer ;
254
+
247
255
pinMode (pinNumber, OUTPUT);
248
256
k_timer_stop (&arduino_pin_timers[pinNumber].timer );
249
257
@@ -252,13 +260,13 @@ void tone(pin_size_t pinNumber, unsigned int frequency,
252
260
return ;
253
261
}
254
262
255
- timeout = K_NSEC (NSEC_PER_SEC / (2 * frequency));
263
+ timeout = K_NSEC (NSEC_PER_SEC / (TOGGLES_PER_CYCLE * frequency));
256
264
if (timeout.ticks == 0 ) {
257
265
timeout.ticks = 1 ;
258
266
}
259
267
260
268
arduino_pin_timers[pinNumber].infinity = (duration == 0 );
261
- arduino_pin_timers[pinNumber].count = (( uint64_t )duration * frequency) / 500ULL ;
269
+ arduino_pin_timers[pinNumber].count = (uint64_t )duration * frequency * (MSEC_PER_SEC / TOGGLES_PER_CYCLE) ;
262
270
arduino_pin_timers[pinNumber].pin = pinNumber;
263
271
k_timer_init (timer, tone_expiry_cb, NULL );
264
272
0 commit comments