Skip to content

Commit d26c7cc

Browse files
committed
x
1 parent 8a232d8 commit d26c7cc

File tree

1 file changed

+11
-3
lines changed

1 file changed

+11
-3
lines changed

cores/arduino/zephyrCommon.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
219221
struct pin_timer {
220222
struct k_timer timer;
221223
uint32_t count;
@@ -241,9 +243,15 @@ void tone_expiry_cb(struct k_timer *timer) {
241243
void 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

Comments
 (0)