mbed w/ spi bug fig
Fork of mbed-src by
Revision 201:fa203361dc70, committed 2014-05-21
- 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
--- 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) {