[EFM32] Backport changes from mbed OS 3.

pull/2070/head
Aksel Skauge Mellbye 2016-06-16 17:56:16 +01:00
parent da2a4ccbae
commit a81fdc461d
7 changed files with 44 additions and 16 deletions

View File

@ -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}
};

View File

@ -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}
};

View File

@ -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}
};

View File

@ -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}
};

View File

@ -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);

View File

@ -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

View File

@ -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);