Skip to content

Commit 2326f98

Browse files
committed
working on silabs support
1 parent 7feddea commit 2326f98

File tree

2 files changed

+21
-14
lines changed

2 files changed

+21
-14
lines changed

src/drivers/hardware_specific/silabs/silabs_mcu.cpp

+19-13
Original file line numberDiff line numberDiff line change
@@ -16,27 +16,33 @@
1616
#pragma message("")
1717

1818
void setupPWM(int pin_nr, long pwm_frequency, bool active_high, SilabsDriverParams* params, uint8_t index) {
19+
GPIO_Port_TypeDef port = getSilabsPortFromArduinoPin(pin_nr);
20+
uint32_t pin = getSilabsPinFromArduinoPin(pin_nr);
21+
TIMER_TypeDef* timer = TIMER0; // TODO determine correct timer
1922
uint32_t timerFreq = 0;
2023
uint32_t topValue = 0;
2124
//CMU_ClockEnable(cmuClock_GPIO, true); assume this is done by Arduino core
2225
CMU_ClockEnable(cmuClock_TIMER0, true); // enable timer clock
2326

2427
TIMER_Init_TypeDef timerInit = TIMER_INIT_DEFAULT;
2528
timerInit.enable = false;
29+
timerInit.mode = timerModeUpDown;
2630
// TODO adjust pre-scaler as needed to get the desired frequency
31+
uint32_t max = TIMER_MaxCount(timer);
2732
timerFreq = CMU_ClockFreqGet(cmuClock_TIMER0) / (timerInit.prescale + 1);
2833
topValue = (timerFreq / pwm_frequency);
29-
TIMER_TopSet(TIMER0, topValue);
34+
TIMER_TopSet(timer, topValue);
3035

3136
TIMER_InitCC_TypeDef timerCCInit = TIMER_INITCC_DEFAULT;
3237
timerCCInit.mode = timerCCModePWM;
38+
timerCCInit.outInvert = !active_high;
3339
GPIO->TIMERROUTE[0].ROUTEEN = GPIO_TIMER_ROUTEEN_CC0PEN;
34-
GPIO->TIMERROUTE[0].CC0ROUTE = (gpioPortA << _GPIO_TIMER_CC0ROUTE_PORT_SHIFT)
35-
| (6 << _GPIO_TIMER_CC0ROUTE_PIN_SHIFT);
36-
TIMER_InitCC(TIMER0, 0, &timerCCInit);
40+
GPIO->TIMERROUTE[0].CC0ROUTE = (port << _GPIO_TIMER_CC0ROUTE_PORT_SHIFT)
41+
| (pin << _GPIO_TIMER_CC0ROUTE_PIN_SHIFT);
42+
TIMER_InitCC(timer, 0, &timerCCInit);
3743

3844
// TODO enable all the timers at the same time?
39-
TIMER_Enable(TIMER0, true);
45+
TIMER_Enable(timer, true);
4046
}
4147

4248

@@ -83,23 +89,23 @@ void* _configure4PWM(long pwm_frequency, const int pin1A, const int pin1B, const
8389

8490

8591
void* _configure6PWM(long pwm_frequency, float dead_zone, const int pinA_h, const int pinA_l, const int pinB_h, const int pinB_l, const int pinC_h, const int pinC_l) {
86-
// non-PIO solution...
8792
SilabsDriverParams* params = new SilabsDriverParams();
8893
params->dead_zone = dead_zone;
89-
setupPWM(pinA_h, pwm_frequency, SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH, params, 0);
90-
setupPWM(pinB_h, pwm_frequency, SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH, params, 2);
91-
setupPWM(pinC_h, pwm_frequency, SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH, params, 4);
92-
setupPWM(pinA_l, pwm_frequency, SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH, params, 1);
93-
setupPWM(pinB_l, pwm_frequency, SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH, params, 3);
94-
setupPWM(pinC_l, pwm_frequency, SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH, params, 5);
94+
// TODO init using DTI if posssible
95+
// setupPWM(pinA_h, pwm_frequency, SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH, params, 0);
96+
// setupPWM(pinB_h, pwm_frequency, SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH, params, 2);
97+
// setupPWM(pinC_h, pwm_frequency, SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH, params, 4);
98+
// setupPWM(pinA_l, pwm_frequency, SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH, params, 1);
99+
// setupPWM(pinB_l, pwm_frequency, SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH, params, 3);
100+
// setupPWM(pinC_l, pwm_frequency, SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH, params, 5);
95101
return params;
96102
}
97103

98104

99105

100106

101107

102-
void writeDutyCycle(float val, uint8_t slice, uint8_t chan) {
108+
void writeDutyCycle(float val, TIMER_TypeDef* timer, uint8_t chan) {
103109
//pwm_set_chan_level(slice, chan, (wrapvalues[slice]+1) * val);
104110
}
105111

src/drivers/hardware_specific/silabs/silabs_mcu.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66

77
#if defined(ARDUINO_ARCH_SILABS)
88

9+
#include "em_timer.h"
910

1011
typedef struct SilabsDriverParams {
1112
int pins[6];
12-
uint8_t timer[6];
13+
TIMER_TypeDef* timer[6];
1314
uint8_t channel[6];
1415
long pwm_frequency;
1516
float dead_zone;

0 commit comments

Comments
 (0)