diff --git a/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/TARGET_EFM32GG_STK3700/PeripheralPins.c b/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/TARGET_EFM32GG_STK3700/PeripheralPins.c index c5596175d1..9a0d3708f5 100644 --- a/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/TARGET_EFM32GG_STK3700/PeripheralPins.c +++ b/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/TARGET_EFM32GG_STK3700/PeripheralPins.c @@ -86,9 +86,15 @@ const PinMap PinMap_I2C_SDA[] = { /************PWM***************/ const PinMap PinMap_PWM[] = { - {PA12, PWM_CH0, 0}, - {PA13, PWM_CH1, 0}, - {PA14, PWM_CH2, 0}, + {PA8, PWM_CH0, 0}, + {PA9, PWM_CH1, 0}, + {PA10, PWM_CH2, 0}, + {PA12, PWM_CH0, 1}, + {PA13, PWM_CH1, 1}, + {PA14, PWM_CH2, 1}, + {PC8, PWM_CH0, 2}, + {PC9, PWM_CH1, 2}, + {PC10, PWM_CH2, 2}, {NC , NC , 0} }; diff --git a/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/TARGET_EFM32HG_STK3400/PeripheralPins.c b/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/TARGET_EFM32HG_STK3400/PeripheralPins.c index ab148d0359..4f1712296f 100644 --- a/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/TARGET_EFM32HG_STK3400/PeripheralPins.c +++ b/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/TARGET_EFM32HG_STK3400/PeripheralPins.c @@ -62,6 +62,9 @@ const PinMap PinMap_PWM[] = { {PA0, PWM_CH0, 0}, {PA1, PWM_CH1, 0}, {PA2, PWM_CH2, 0}, + {PF0, PWM_CH0, 5}, + {PF1, PWM_CH1, 5}, + {PF2, PWM_CH2, 5}, {NC , NC , NC} }; diff --git a/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/TARGET_EFM32LG_STK3600/PeripheralPins.c b/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/TARGET_EFM32LG_STK3600/PeripheralPins.c index c5596175d1..9a0d3708f5 100644 --- a/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/TARGET_EFM32LG_STK3600/PeripheralPins.c +++ b/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/TARGET_EFM32LG_STK3600/PeripheralPins.c @@ -86,9 +86,15 @@ const PinMap PinMap_I2C_SDA[] = { /************PWM***************/ const PinMap PinMap_PWM[] = { - {PA12, PWM_CH0, 0}, - {PA13, PWM_CH1, 0}, - {PA14, PWM_CH2, 0}, + {PA8, PWM_CH0, 0}, + {PA9, PWM_CH1, 0}, + {PA10, PWM_CH2, 0}, + {PA12, PWM_CH0, 1}, + {PA13, PWM_CH1, 1}, + {PA14, PWM_CH2, 1}, + {PC8, PWM_CH0, 2}, + {PC9, PWM_CH1, 2}, + {PC10, PWM_CH2, 2}, {NC , NC , 0} }; diff --git a/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/TARGET_EFM32WG_STK3800/PeripheralPins.c b/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/TARGET_EFM32WG_STK3800/PeripheralPins.c index c5596175d1..9a0d3708f5 100644 --- a/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/TARGET_EFM32WG_STK3800/PeripheralPins.c +++ b/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/TARGET_EFM32WG_STK3800/PeripheralPins.c @@ -86,9 +86,15 @@ const PinMap PinMap_I2C_SDA[] = { /************PWM***************/ const PinMap PinMap_PWM[] = { - {PA12, PWM_CH0, 0}, - {PA13, PWM_CH1, 0}, - {PA14, PWM_CH2, 0}, + {PA8, PWM_CH0, 0}, + {PA9, PWM_CH1, 0}, + {PA10, PWM_CH2, 0}, + {PA12, PWM_CH0, 1}, + {PA13, PWM_CH1, 1}, + {PA14, PWM_CH2, 1}, + {PC8, PWM_CH0, 2}, + {PC9, PWM_CH1, 2}, + {PC10, PWM_CH2, 2}, {NC , NC , 0} }; diff --git a/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/gpio_irq_api.c b/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/gpio_irq_api.c index c189c1b102..1e106f478c 100644 --- a/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/gpio_irq_api.c +++ b/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/gpio_irq_api.c @@ -96,8 +96,10 @@ int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32 // Init pins gpio_irq_preinit(obj, pin); // Initialize GPIO interrupt dispatcher + NVIC_SetVector(GPIO_ODD_IRQn, (uint32_t)GPIO_ODD_IRQHandler); NVIC_ClearPendingIRQ(GPIO_ODD_IRQn); NVIC_EnableIRQ(GPIO_ODD_IRQn); + NVIC_SetVector(GPIO_EVEN_IRQn, (uint32_t)GPIO_EVEN_IRQHandler); NVIC_ClearPendingIRQ(GPIO_EVEN_IRQn); NVIC_EnableIRQ(GPIO_EVEN_IRQn); diff --git a/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/pwmout_api.c b/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/pwmout_api.c index 67c1b24dad..e3c713a09a 100644 --- a/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/pwmout_api.c +++ b/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/pwmout_api.c @@ -37,7 +37,7 @@ #include "em_gpio.h" #include "em_timer.h" -static int pwm_prescaler_div; +static uint32_t pwm_prescaler_div; float pwmout_calculate_duty(uint32_t width_cycles, uint32_t period_cycles); void pwmout_write_channel(uint32_t channel, float value); @@ -132,7 +132,7 @@ bool pwmout_all_inactive(void) { return true; } #else - if(PWM_TIMER->ROUTE == PWM_ROUTE) { + if(PWM_TIMER->ROUTE & (TIMER_ROUTE_CC0PEN | TIMER_ROUTE_CC1PEN | TIMER_ROUTE_CC2PEN)) { return true; } #endif @@ -211,7 +211,11 @@ void pwmout_init(pwmout_t *obj, PinName pin) #else // On P1, the route location is statically defined for the entire timer. PWM_TIMER->ROUTE &= ~_TIMER_ROUTE_LOCATION_MASK; - PWM_TIMER->ROUTE |= PWM_ROUTE; +if(pwmout_all_inactive()) { + PWM_TIMER->ROUTE |= pinmap_find_function(pin,PinMap_PWM) << _TIMER_ROUTE_LOCATION_SHIFT; + } else { + MBED_ASSERT((pinmap_find_function(pin,PinMap_PWM) << _TIMER_ROUTE_LOCATION_SHIFT) == (PWM_TIMER->ROUTE & _TIMER_ROUTE_LOCATION_MASK)); + } #endif // Set default 20ms frequency and 0ms pulse width @@ -281,7 +285,7 @@ void pwmout_period(pwmout_t *obj, float seconds) // This gives us max resolution for a given period //The value of the top register if prescaler is set to 0 - int cycles = REFERENCE_FREQUENCY * seconds; + uint32_t cycles = (uint32_t)REFERENCE_FREQUENCY * seconds; pwm_prescaler_div = 0; //The top register is only 16 bits, so we keep dividing till we are below 0xFFFF diff --git a/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/rtc_api.c b/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/rtc_api.c index fd157202ec..1b8919c803 100644 --- a/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/rtc_api.c +++ b/hal/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/rtc_api.c @@ -71,7 +71,8 @@ void RTC_IRQHandler(void) uint32_t rtc_get_32bit(void) { - return (RTC_CounterGet() + (time_extend << RTC_NUM_BITS)); + uint32_t pending = (RTC_IntGet() & RTC_IF_OF) ? 1 : 0; + return (RTC_CounterGet() + ((time_extend + pending) << RTC_NUM_BITS)); } uint64_t rtc_get_full(void) @@ -104,8 +105,8 @@ void rtc_init_real(uint32_t flags) /* Enable Interrupt from RTC */ RTC_IntEnable(RTC_IEN_OF); - NVIC_EnableIRQ(RTC_IRQn); NVIC_SetVector(RTC_IRQn, (uint32_t)RTC_IRQHandler); + NVIC_EnableIRQ(RTC_IRQn); /* Initialize */ RTC_Init(&init); @@ -198,8 +199,8 @@ void rtc_init_real(uint32_t flags) /* Enable Interrupt from RTC */ RTCC_IntEnable(RTCC_IEN_OF); - NVIC_EnableIRQ(RTCC_IRQn); NVIC_SetVector(RTCC_IRQn, (uint32_t)RTCC_IRQHandler); + NVIC_EnableIRQ(RTCC_IRQn); /* Initialize */ RTCC_Init(&init);