mbed library sources

Fork of mbed-src by mbed official

Files at this revision

API Documentation at this revision

Comitter:
mbed_official
Date:
Wed May 21 10:30:07 2014 +0100
Parent:
200:a6b296b34609
Child:
202:bd6461c07541
Commit message:
Synchronized with git revision 29b91e5636c1001db3c38fb7841f278542728631

Full URL: https://github.com/mbedmicro/mbed/commit/29b91e5636c1001db3c38fb7841f278542728631/

[NUCLEO_L053R8] Fix baudrate issue with LPUART1

Changed in this revision

targets/hal/TARGET_STM/TARGET_NUCLEO_L053R8/analogout_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_NUCLEO_L053R8/objects.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_NUCLEO_L053R8/serial_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_NUCLEO_L053R8/spi_api.c Show annotated file Show diff for this revision Revisions of this file
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_L053R8/analogout_api.c	Tue May 20 16:45:06 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_L053R8/analogout_api.c	Wed May 21 10:30:07 2014 +0100
@@ -75,10 +75,11 @@
 }
 
 void analogout_free(dac_t *obj) {
-    // Disable DAC
+    // Reset DAC and disable clock
     __DAC_FORCE_RESET();
     __DAC_RELEASE_RESET();
     __DAC_CLK_DISABLE();
+
     // Configure GPIO
     pin_function(obj->channel, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
 }
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_L053R8/objects.h	Tue May 20 16:45:06 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_L053R8/objects.h	Wed May 21 10:30:07 2014 +0100
@@ -71,8 +71,8 @@
     uint32_t databits;
     uint32_t stopbits;
     uint32_t parity;
-    PinName  tx_pin;
-    PinName  rx_pin;
+    PinName  pin_tx;
+    PinName  pin_rx;
 };
 
 struct spi_s {
@@ -83,6 +83,10 @@
     uint32_t mode;
     uint32_t nss;
     uint32_t br_presc;
+    PinName  pin_miso;
+    PinName  pin_mosi;
+    PinName  pin_sclk;
+    PinName  pin_ssel;
 };
 
 struct i2c_s {
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_L053R8/serial_api.c	Tue May 20 16:45:06 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_L053R8/serial_api.c	Wed May 21 10:30:07 2014 +0100
@@ -65,7 +65,6 @@
 static uart_irq_handler irq_handler;
 
 UART_HandleTypeDef UartHandle;
-USART_HandleTypeDef UsartHandle;
 
 int stdio_uart_inited = 0;
 serial_t stdio_uart;
@@ -73,25 +72,29 @@
 static void init_uart(serial_t *obj) {
     UartHandle.Instance = (USART_TypeDef *)(obj->uart);
 
-    UartHandle.Init.BaudRate   = obj->baudrate;
+    // [TODO] Workaround to be removed after HAL driver is corrected
+    if (obj->uart == LPUART_1) {
+        UartHandle.Init.BaudRate = obj->baudrate >> 1;
+    } else {
+        UartHandle.Init.BaudRate = obj->baudrate;
+    }
     UartHandle.Init.WordLength = obj->databits;
     UartHandle.Init.StopBits   = obj->stopbits;
     UartHandle.Init.Parity     = obj->parity;
     UartHandle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;
-    if (obj->rx_pin == NC) {
-        UartHandle.Init.Mode     = UART_MODE_TX;
-    } else if (obj->tx_pin == NC) {
-        UartHandle.Init.Mode     = UART_MODE_RX;
+
+    if (obj->pin_rx == NC) {
+        UartHandle.Init.Mode = UART_MODE_TX;
+    } else if (obj->pin_tx == NC) {
+        UartHandle.Init.Mode = UART_MODE_RX;
     } else {
-        UartHandle.Init.Mode     = UART_MODE_TX_RX;
+        UartHandle.Init.Mode = UART_MODE_TX_RX;
     }
 
     HAL_UART_Init(&UartHandle);
 }
 
 void serial_init(serial_t *obj, PinName tx, PinName rx) {
-    //RCC_OscInitTypeDef RCC_OscInitStruct;
-
     // Determine the UART to use (UART_1, UART_2, ...)
     UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX);
     UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX);
@@ -117,20 +120,6 @@
     if (obj->uart == LPUART_1) {
         __LPUART1_CLK_ENABLE();
         obj->index = 2;
-        /* DEBUG
-        // Enable Power clock
-        __PWR_CLK_ENABLE();
-        // Enable access to Backup domain
-        HAL_PWR_EnableBkUpAccess();
-        // Reset Backup domain
-        __HAL_RCC_BACKUPRESET_FORCE();
-        __HAL_RCC_BACKUPRESET_RELEASE();
-        // Enable LSE Oscillator
-        RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
-        RCC_OscInitStruct.PLL.PLLState   = RCC_PLL_NONE; // Mandatory, otherwise the PLL is reconfigured!
-        RCC_OscInitStruct.LSEState       = RCC_LSE_ON; // External 32.768 kHz clock on OSC_IN/OSC_OUT
-        if (HAL_RCC_OscConfig(&RCC_OscInitStruct) == HAL_OK) {
-        }*/
     }
 
     // Configure the UART pins
@@ -144,8 +133,8 @@
     obj->databits = UART_WORDLENGTH_8B;
     obj->stopbits = UART_STOPBITS_1;
     obj->parity   = UART_PARITY_NONE;
-    obj->tx_pin   = tx;
-    obj->rx_pin   = rx;
+    obj->pin_tx   = tx;
+    obj->pin_rx   = rx;
 
     init_uart(obj);
 
@@ -154,10 +143,32 @@
         stdio_uart_inited = 1;
         memcpy(&stdio_uart, obj, sizeof(serial_t));
     }
-
 }
 
 void serial_free(serial_t *obj) {
+    // Reset UART and disable clock
+    if (obj->uart == UART_1) {
+        __USART1_FORCE_RESET();
+        __USART1_RELEASE_RESET();
+        __USART1_CLK_DISABLE();
+    }
+
+    if (obj->uart == UART_2) {
+        __USART2_FORCE_RESET();
+        __USART2_RELEASE_RESET();
+        __USART2_CLK_DISABLE();
+    }
+
+    if (obj->uart == LPUART_1) {
+        __LPUART1_FORCE_RESET();
+        __LPUART1_RELEASE_RESET();
+        __LPUART1_CLK_DISABLE();
+    }
+
+    // Configure GPIOs
+    pin_function(obj->pin_tx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
+    pin_function(obj->pin_rx, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
+
     serial_irq_ids[obj->index] = 0;
 }
 
@@ -217,9 +228,11 @@
 static void uart1_irq(void) {
     uart_irq(UART_1, 0);
 }
+
 static void uart2_irq(void) {
     uart_irq(UART_2, 1);
 }
+
 static void lpuart1_irq(void) {
     uart_irq(LPUART_1, 2);
 }
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_L053R8/spi_api.c	Tue May 20 16:45:06 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_L053R8/spi_api.c	Wed May 21 10:30:07 2014 +0100
@@ -142,8 +142,24 @@
 }
 
 void spi_free(spi_t *obj) {
-    SpiHandle.Instance = (SPI_TypeDef *)(obj->spi);
-    HAL_SPI_DeInit(&SpiHandle);
+    // Reset SPI and disable clock
+    if (obj->spi == SPI_1) {
+        __SPI1_FORCE_RESET();
+        __SPI1_RELEASE_RESET();
+        __SPI1_CLK_DISABLE();
+    }
+
+    if (obj->spi == SPI_2) {
+        __SPI2_FORCE_RESET();
+        __SPI2_RELEASE_RESET();
+        __SPI2_CLK_DISABLE();
+    }
+
+    // Configure GPIO
+    pin_function(obj->pin_miso, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
+    pin_function(obj->pin_mosi, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
+    pin_function(obj->pin_sclk, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
+    pin_function(obj->pin_ssel, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
 }
 
 void spi_format(spi_t *obj, int bits, int mode, int slave) {