@@ -216,6 +216,8 @@ PinStatus digitalRead(pin_size_t pinNumber) {
216216#define MAX_TONE_PINS DT_PROP_LEN (DT_PATH(zephyr_user), digital_pin_gpios)
217217#endif
218218
219+ #define TOGGLES_PER_CYCLE 2ULL
220+
219221struct pin_timer {
220222 struct k_timer timer;
221223 uint32_t count;
@@ -241,9 +243,15 @@ void tone_expiry_cb(struct k_timer *timer) {
241243void tone (pin_size_t pinNumber, unsigned int frequency,
242244 unsigned long duration) {
243245 const struct gpio_dt_spec *spec = &arduino_pins[pinNumber];
244- struct k_timer *timer = &arduino_pin_timers[pinNumber]. timer ;
246+ struct k_timer *timer;
245247 k_timeout_t timeout;
246248
249+ if (pinNumber >= MAX_TONE_PINS) {
250+ return ;
251+ }
252+
253+ timer = &arduino_pin_timers[pinNumber].timer ;
254+
247255 pinMode (pinNumber, OUTPUT);
248256 k_timer_stop (&arduino_pin_timers[pinNumber].timer );
249257
@@ -252,13 +260,13 @@ void tone(pin_size_t pinNumber, unsigned int frequency,
252260 return ;
253261 }
254262
255- timeout = K_NSEC (NSEC_PER_SEC / (2 * frequency));
263+ timeout = K_NSEC (NSEC_PER_SEC / (TOGGLES_PER_CYCLE * frequency));
256264 if (timeout.ticks == 0 ) {
257265 timeout.ticks = 1 ;
258266 }
259267
260268 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) ;
262270 arduino_pin_timers[pinNumber].pin = pinNumber;
263271 k_timer_init (timer, tone_expiry_cb, NULL );
264272
0 commit comments