From 02d6b3200a9d2421b0d7c1efe63c07da31fa4aa7 Mon Sep 17 00:00:00 2001 From: Steven Cooreman Date: Tue, 26 May 2015 13:30:44 +0200 Subject: [PATCH 1/3] Add pin definitions for Silicon Labs parts --- .../tests/mbed/digitalin_digitalout/main.cpp | 12 ++++++++++++ libraries/tests/mbed/digitalinout/main.cpp | 12 ++++++++++++ libraries/tests/mbed/i2c_master/main.cpp | 12 ++++++++++++ libraries/tests/mbed/spi_master/main.cpp | 9 +++++++++ .../i2c_eeprom_asynch/i2c_eeprom_asynch.cpp | 13 +++++++++++++ .../utest/serial_asynch/serial_asynch.cpp | 11 +++++++++++ .../utest/spi_asynch/spi_master_asynch.cpp | 19 +++++++++++++++++++ 7 files changed, 88 insertions(+) diff --git a/libraries/tests/mbed/digitalin_digitalout/main.cpp b/libraries/tests/mbed/digitalin_digitalout/main.cpp index 08fc12b784..140c05ac7f 100644 --- a/libraries/tests/mbed/digitalin_digitalout/main.cpp +++ b/libraries/tests/mbed/digitalin_digitalout/main.cpp @@ -45,6 +45,18 @@ DigitalIn in(TP4); DigitalOut out(P1_0); DigitalIn in(P4_7); +#elif defined(TARGET_EFM32LG_STK3600) || defined(TARGET_EFM32GG_STK3700) || defined(TARGET_EFM32WG_STK3800) +DigitalInOut d1(PD0); +DigitalInOut d2(PC4); + +#elif defined(TARGET_EFM32ZG_STK3200) +DigitalInOut d1(PD7); +DigitalInOut d2(PC1); + +#elif defined(TARGET_EFM32HG_STK3400) +DigitalInOut d1(PE10); +DigitalInOut d2(PC1); + #else DigitalOut out(p5); DigitalIn in(p25); diff --git a/libraries/tests/mbed/digitalinout/main.cpp b/libraries/tests/mbed/digitalinout/main.cpp index 9335651769..c9d659fcbf 100644 --- a/libraries/tests/mbed/digitalinout/main.cpp +++ b/libraries/tests/mbed/digitalinout/main.cpp @@ -45,6 +45,18 @@ DigitalInOut d2(TP4); DigitalInOut d1(P1_0); DigitalInOut d2(P4_7); +#elif defined(TARGET_EFM32LG_STK3600) || defined(TARGET_EFM32GG_STK3700) || defined(TARGET_EFM32WG_STK3800) +DigitalInOut d1(PD0); +DigitalInOut d2(PC4); + +#elif defined(TARGET_EFM32ZG_STK3200) +DigitalInOut d1(PD7); +DigitalInOut d2(PC1); + +#elif defined(TARGET_EFM32HG_STK3400) +DigitalInOut d1(PE10); +DigitalInOut d2(PC1); + #else DigitalInOut d1(p5); DigitalInOut d2(p25); diff --git a/libraries/tests/mbed/i2c_master/main.cpp b/libraries/tests/mbed/i2c_master/main.cpp index 392be3218c..a2f462217b 100644 --- a/libraries/tests/mbed/i2c_master/main.cpp +++ b/libraries/tests/mbed/i2c_master/main.cpp @@ -10,6 +10,18 @@ I2C i2c(PTE0, PTE1); I2C i2c(p22,p20); #elif defined(TARGET_FF_ARDUINO) || defined(TARGET_MAXWSNENV) I2C i2c(I2C_SDA, I2C_SCL); +#elif defined(TARGET_EFM32LG_STK3600) || defined(TARGET_EFM32GG_STK3700) || defined(TARGET_EFM32WG_STK3800) +#define TEST_SDA_PIN PD6 +#define TEST_SCL_PIN PD7 +I2C i2c(TEST_SDA_PIN, TEST_SCL_PIN); +#elif defined(TARGET_EFM32ZG_STK3200) +#define TEST_SDA_PIN PE12 +#define TEST_SCL_PIN PE13 +I2C i2c(TEST_SDA_PIN, TEST_SCL_PIN); +#elif defined(TARGET_EFM32HG_STK3400) +#define TEST_SDA_PIN PD6 +#define TEST_SCL_PIN PD7 +I2C i2c(TEST_SDA_PIN, TEST_SCL_PIN); #else I2C i2c(p28, p27); #endif diff --git a/libraries/tests/mbed/spi_master/main.cpp b/libraries/tests/mbed/spi_master/main.cpp index 9392072438..b5cb5442e5 100644 --- a/libraries/tests/mbed/spi_master/main.cpp +++ b/libraries/tests/mbed/spi_master/main.cpp @@ -13,6 +13,15 @@ DigitalOut cs(PTA13); #elif defined(TARGET_FF_ARDUINO) SPI spi(D11, D12, D13); // mosi, miso, sclk DigitalOut cs(D10); +#elif defined(TARGET_EFM32LG_STK3600) || defined(TARGET_EFM32GG_STK3700) || defined(TARGET_EFM32WG_STK3800) +SPI spi(PD0, PD1, PD2); // mosi, miso, sclk +DigitalOut cs(PD3); +#elif defined(TARGET_EFM32ZG_STK3200) +SPI spi(PD7, PD6, PC15); // mosi, miso, sclk +DigitalOut cs(PC14); +#elif defined(TARGET_EFM32HG_STK3400) +SPI spi(PE10, PE11, PE12); // mosi, miso, sclk +DigitalOut cs(PE13); #else SPI spi(p5, p6, p7); // mosi, miso, sclk DigitalOut cs(p8); diff --git a/libraries/tests/utest/i2c_eeprom_asynch/i2c_eeprom_asynch.cpp b/libraries/tests/utest/i2c_eeprom_asynch/i2c_eeprom_asynch.cpp index a188abc207..0034acd0a7 100644 --- a/libraries/tests/utest/i2c_eeprom_asynch/i2c_eeprom_asynch.cpp +++ b/libraries/tests/utest/i2c_eeprom_asynch/i2c_eeprom_asynch.cpp @@ -27,6 +27,19 @@ #if defined(TARGET_K64F) #define TEST_SDA_PIN PTE25 #define TEST_SCL_PIN PTE24 + +#elif defined(TARGET_EFM32LG_STK3600) || defined(TARGET_EFM32GG_STK3700) || defined(TARGET_EFM32WG_STK3800) +#define TEST_SDA_PIN PD6 +#define TEST_SCL_PIN PD7 + +#elif defined(TARGET_EFM32ZG_STK3200) +#define TEST_SDA_PIN PE12 +#define TEST_SCL_PIN PE13 + +#elif defined(TARGET_EFM32HG_STK3400) +#define TEST_SDA_PIN PD6 +#define TEST_SCL_PIN PD7 + #else #error Target not supported #endif diff --git a/libraries/tests/utest/serial_asynch/serial_asynch.cpp b/libraries/tests/utest/serial_asynch/serial_asynch.cpp index 44169e194c..436ea6580b 100644 --- a/libraries/tests/utest/serial_asynch/serial_asynch.cpp +++ b/libraries/tests/utest/serial_asynch/serial_asynch.cpp @@ -28,6 +28,17 @@ #define TEST_SERIAL_ONE_TX_PIN PTC17 // uart3 #define TEST_SERIAL_TWO_RX_PIN PTD2 // uart2 +#elif defined(TARGET_EFM32LG_STK3600) || defined(TARGET_EFM32GG_STK3700) || defined(TARGET_EFM32WG_STK3800) +#define TEST_SERIAL_ONE_TX_PIN PD0 // usart1 +#define TEST_SERIAL_TWO_RX_PIN PC4 // usart2 + +#elif defined(TARGET_EFM32ZG_STK3200) +#error "Target not supported (only 2 serial ports available, need 3)" + +#elif defined(TARGET_EFM32HG_STK3400) +#define TEST_SERIAL_ONE_TX_PIN PE10 // usart0 +#define TEST_SERIAL_TWO_RX_PIN PC1 // usart1 + #else #error Target not supported diff --git a/libraries/tests/utest/spi_asynch/spi_master_asynch.cpp b/libraries/tests/utest/spi_asynch/spi_master_asynch.cpp index 0a0a42702a..68b85c4ebb 100644 --- a/libraries/tests/utest/spi_asynch/spi_master_asynch.cpp +++ b/libraries/tests/utest/spi_asynch/spi_master_asynch.cpp @@ -39,6 +39,25 @@ #define TEST_MISO_PIN PTD3 #define TEST_SCLK_PIN PTD1 #define TEST_CS_PIN PTD0 + +#elif defined(TARGET_EFM32LG_STK3600) || defined(TARGET_EFM32GG_STK3700) || defined(TARGET_EFM32WG_STK3800) +#define TEST_MOSI_PIN PD0 +#define TEST_MISO_PIN PD1 +#define TEST_SCLK_PIN PD2 +#define TEST_CS_PIN PD3 + +#elif defined(TARGET_EFM32ZG_STK3200) +#define TEST_MOSI_PIN PD7 +#define TEST_MISO_PIN PD6 +#define TEST_SCLK_PIN PC15 +#define TEST_CS_PIN PC14 + +#elif defined(TARGET_EFM32HG_STK3400) +#define TEST_MOSI_PIN PE10 +#define TEST_MISO_PIN PE11 +#define TEST_SCLK_PIN PE12 +#define TEST_CS_PIN PE13 + #else #error Target not supported #endif From d49d21cdca0db537eafdf025fe68096aabb3d42c Mon Sep 17 00:00:00 2001 From: Steven Cooreman Date: Wed, 27 May 2015 16:07:40 +0200 Subject: [PATCH 2/3] Pin definition update --- .../tests/mbed/digitalin_digitalout/main.cpp | 12 ++++---- libraries/tests/mbed/digitalinout/main.cpp | 2 +- libraries/tests/mbed/interruptin/main.cpp | 12 ++++++++ libraries/tests/mbed/portinout/main.cpp | 28 +++++++++++++++++++ libraries/tests/mbed/portout_portin/main.cpp | 28 +++++++++++++++++++ .../utest/serial_asynch/serial_asynch.cpp | 2 +- 6 files changed, 76 insertions(+), 8 deletions(-) diff --git a/libraries/tests/mbed/digitalin_digitalout/main.cpp b/libraries/tests/mbed/digitalin_digitalout/main.cpp index 140c05ac7f..9f19dd94d8 100644 --- a/libraries/tests/mbed/digitalin_digitalout/main.cpp +++ b/libraries/tests/mbed/digitalin_digitalout/main.cpp @@ -46,16 +46,16 @@ DigitalOut out(P1_0); DigitalIn in(P4_7); #elif defined(TARGET_EFM32LG_STK3600) || defined(TARGET_EFM32GG_STK3700) || defined(TARGET_EFM32WG_STK3800) -DigitalInOut d1(PD0); -DigitalInOut d2(PC4); +DigitalOut out(PD0); +DigitalIn in(PC3); #elif defined(TARGET_EFM32ZG_STK3200) -DigitalInOut d1(PD7); -DigitalInOut d2(PC1); +DigitalOut out(PD7); +DigitalIn in(PC1); #elif defined(TARGET_EFM32HG_STK3400) -DigitalInOut d1(PE10); -DigitalInOut d2(PC1); +DigitalOut out(PE10); +DigitalIn in(PC1); #else DigitalOut out(p5); diff --git a/libraries/tests/mbed/digitalinout/main.cpp b/libraries/tests/mbed/digitalinout/main.cpp index c9d659fcbf..131f3eb83f 100644 --- a/libraries/tests/mbed/digitalinout/main.cpp +++ b/libraries/tests/mbed/digitalinout/main.cpp @@ -47,7 +47,7 @@ DigitalInOut d2(P4_7); #elif defined(TARGET_EFM32LG_STK3600) || defined(TARGET_EFM32GG_STK3700) || defined(TARGET_EFM32WG_STK3800) DigitalInOut d1(PD0); -DigitalInOut d2(PC4); +DigitalInOut d2(PC3); #elif defined(TARGET_EFM32ZG_STK3200) DigitalInOut d1(PD7); diff --git a/libraries/tests/mbed/interruptin/main.cpp b/libraries/tests/mbed/interruptin/main.cpp index 53da68f5b6..dc08427e6b 100644 --- a/libraries/tests/mbed/interruptin/main.cpp +++ b/libraries/tests/mbed/interruptin/main.cpp @@ -74,6 +74,18 @@ void in_handler() { #define PIN_OUT P1_0 #define PIN_IN P4_7 +#elif defined(TARGET_EFM32LG_STK3600) || defined(TARGET_EFM32GG_STK3700) || defined(TARGET_EFM32WG_STK3800) +#define PIN_OUT PD0 +#define PIN_IN PC3 + +#elif defined(TARGET_EFM32ZG_STK3200) +#define PIN_OUT PD7 +#define PIN_IN PC1 + +#elif defined(TARGET_EFM32HG_STK3400) +#define PIN_OUT PE10 +#define PIN_IN PC1 + #else #define PIN_IN (p5) #define PIN_OUT (p25) diff --git a/libraries/tests/mbed/portinout/main.cpp b/libraries/tests/mbed/portinout/main.cpp index 22f2c66b3b..dbd9dcc7c0 100644 --- a/libraries/tests/mbed/portinout/main.cpp +++ b/libraries/tests/mbed/portinout/main.cpp @@ -101,6 +101,34 @@ #define P2_1 (1 << 8) // PB_8 #define P2_2 (1 << 9) // PB_9 #define PORT_2 PortB + +#elif defined(TARGET_EFM32LG_STK3600) || defined(TARGET_EFM32GG_STK3700) || defined(TARGET_EFM32WG_STK3800) +#define P1_1 (1 << 0) // PD0 +#define P1_2 (1 << 1) // PD1 +#define PORT_1 PortD + +#define P2_1 (1 << 3) // PC3 +#define P2_2 (1 << 4) // PC4 +#define PORT_2 PortC + +#elif defined(TARGET_EFM32ZG_STK3200) +#define P1_1 (1 << 7) // PD7 +#define P1_2 (1 << 6) // PD6 +#define PORT_1 PortD + +#define P2_1 (1 << 1) // PC1 +#define P2_2 (1 << 2) // PC2 +#define PORT_2 PortC + +#elif defined(TARGET_EFM32HG_STK3400) +#define P1_1 (1 << 10) // PE10 +#define P1_2 (1 << 11) // PE11 +#define PORT_1 PortE + +#define P2_1 (1 << 1) // PC1 +#define P2_2 (1 << 2) // PC2 +#define PORT_2 PortC + #endif #define MASK_1 (P1_1 | P1_2) diff --git a/libraries/tests/mbed/portout_portin/main.cpp b/libraries/tests/mbed/portout_portin/main.cpp index 6fb02990e6..aa44bb09ae 100644 --- a/libraries/tests/mbed/portout_portin/main.cpp +++ b/libraries/tests/mbed/portout_portin/main.cpp @@ -101,6 +101,34 @@ #define P2_1 (1 << 8) // PB_8 #define P2_2 (1 << 9) // PB_9 #define PORT_2 PortB + +#elif defined(TARGET_EFM32LG_STK3600) || defined(TARGET_EFM32GG_STK3700) || defined(TARGET_EFM32WG_STK3800) +#define P1_1 (1 << 0) // PD0 +#define P1_2 (1 << 1) // PD1 +#define PORT_1 PortD + +#define P2_1 (1 << 3) // PC3 +#define P2_2 (1 << 4) // PC4 +#define PORT_2 PortC + +#elif defined(TARGET_EFM32ZG_STK3200) +#define P1_1 (1 << 7) // PD7 +#define P1_2 (1 << 6) // PD6 +#define PORT_1 PortD + +#define P2_1 (1 << 1) // PC1 +#define P2_2 (1 << 2) // PC2 +#define PORT_2 PortC + +#elif defined(TARGET_EFM32HG_STK3400) +#define P1_1 (1 << 10) // PE10 +#define P1_2 (1 << 11) // PE11 +#define PORT_1 PortE + +#define P2_1 (1 << 1) // PC1 +#define P2_2 (1 << 2) // PC2 +#define PORT_2 PortC + #endif #define MASK_1 (P1_1 | P1_2) diff --git a/libraries/tests/utest/serial_asynch/serial_asynch.cpp b/libraries/tests/utest/serial_asynch/serial_asynch.cpp index 436ea6580b..9d55c7d4b4 100644 --- a/libraries/tests/utest/serial_asynch/serial_asynch.cpp +++ b/libraries/tests/utest/serial_asynch/serial_asynch.cpp @@ -30,7 +30,7 @@ #elif defined(TARGET_EFM32LG_STK3600) || defined(TARGET_EFM32GG_STK3700) || defined(TARGET_EFM32WG_STK3800) #define TEST_SERIAL_ONE_TX_PIN PD0 // usart1 -#define TEST_SERIAL_TWO_RX_PIN PC4 // usart2 +#define TEST_SERIAL_TWO_RX_PIN PC3 // usart2 #elif defined(TARGET_EFM32ZG_STK3200) #error "Target not supported (only 2 serial ports available, need 3)" From 51518f0d4c8f23b1b23bb7342f56a1082adb9ec4 Mon Sep 17 00:00:00 2001 From: Steven Cooreman Date: Mon, 1 Jun 2015 11:37:34 +0200 Subject: [PATCH 3/3] Failed to account for PWM prescaler on high frequencies. --- .../targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/pwmout_api.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/mbed/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/pwmout_api.c b/libraries/mbed/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/pwmout_api.c index ae0f981a16..f956f57533 100644 --- a/libraries/mbed/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/pwmout_api.c +++ b/libraries/mbed/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/pwmout_api.c @@ -139,7 +139,7 @@ void pwmout_write(pwmout_t *obj, float value) value = 1; } - float pulse_period_in_s = obj->period_cycles / (float) pwm_clockfreq; + float pulse_period_in_s = obj->period_cycles / ((float) (pwm_clockfreq >> pwm_prescaler_div)); pwmout_pulsewidth(obj, value * pulse_period_in_s); } @@ -192,7 +192,7 @@ void pwmout_period_us(pwmout_t *obj, int us) void pwmout_pulsewidth(pwmout_t *obj, float seconds) { - obj->width_cycles = pwm_clockfreq * seconds; + obj->width_cycles = (uint32_t) (((float) (pwm_clockfreq >> pwm_prescaler_div)) * seconds); TIMER_CompareBufSet(PWM_TIMER, obj->channel, obj->width_cycles); }