-
Notifications
You must be signed in to change notification settings - Fork 34
Open
Labels
featurerequestFeature requestFeature request
Description
Summary
As per my post in the /silabs subreddit, it seems as though this core doesn't allow Arduino users to make use of more than 3 PWM pins, despite the MCU supporting more than that.
It was confusing to me because the Arduino Nano Matter product page specifies that up to 5 PWM channels can be used concurrently.
I know this repo isn't accepting community PRs right now, but here's what I've tried so far (without success):
- On
cores/gecko/pwm.h, change line 127 from:
static const uint8_t max_pwm_channels = 3u;
to:
static const uint8_t max_pwm_channels = 5u;
- On
cores/gecko/pwm.cpp, add below line 27:
#include "em_cmu.h"
and change line 74 from:
this->pwm_pins[pwm_channel_idx].inst.channel = pwm_channel_idx;
to:
// Map pwm_channel_idx to (timer, channel) pairs
// Each timer has 3 channels (0, 1, 2)
// Channels 0-2 use TIMER0, channels 3-5 use TIMER1, etc.
uint8_t timer_num = pwm_channel_idx / 3;
uint8_t channel_num = pwm_channel_idx % 3;
TIMER_TypeDef* timer_map[] = {TIMER0, TIMER1, TIMER2, TIMER3, TIMER4};
this->pwm_pins[pwm_channel_idx].inst.timer = timer_map[timer_num];
this->pwm_pins[pwm_channel_idx].inst.channel = channel_num;
// Enable the clock for the timer peripheral
CMU_Clock_TypeDef timer_clocks[] = {cmuClock_TIMER0, cmuClock_TIMER1, cmuClock_TIMER2, cmuClock_TIMER3, cmuClock_TIMER4};
CMU_ClockEnable(timer_clocks[timer_num], true);
and change line 78 from:
sl_pwm_init(&this->pwm_pins[pwm_channel_idx].inst, &pwm_config);
to:
// Initialize the PWM - check if it succeeds
sl_status_t status = sl_pwm_init(&this->pwm_pins[pwm_channel_idx].inst, &pwm_config);
if (status != SL_STATUS_OK) {
// PWM init failed - mark channel as free again
this->pwm_pins[pwm_channel_idx].pin = PIN_NAME_MAX;
return false;
}
Metadata
Metadata
Assignees
Labels
featurerequestFeature requestFeature request