Changes to support running on smaller memory LPC device LPC1764

Fork of mbed-dev by mbed official

Files at this revision

API Documentation at this revision

Comitter:
mbed_official
Date:
Sun Apr 17 17:45:10 2016 +0100
Parent:
111:86e691153a57
Child:
113:b3775bf36a83
Commit message:
Synchronized with git revision 92a345200dc74ae7d0db944a94f028baaa129d7c

Full URL: https://github.com/mbedmicro/mbed/commit/92a345200dc74ae7d0db944a94f028baaa129d7c/

Changed in this revision

targets/hal/TARGET_Freescale/TARGET_KPSDK_MCUS/TARGET_MCU_K64F/TARGET_FRDM/PeripheralPins.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_STM32L4/PeripheralPins.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_STM32L4/TARGET_NUCLEO_L476RG/PeripheralPins.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_STM32L4/TARGET_NUCLEO_L476RG/device.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_STM32L4/TARGET_NUCLEO_L476RG/objects.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_STM32L4/serial_api.c Show annotated file Show diff for this revision Revisions of this file
--- a/targets/hal/TARGET_Freescale/TARGET_KPSDK_MCUS/TARGET_MCU_K64F/TARGET_FRDM/PeripheralPins.c	Fri Apr 15 11:00:11 2016 +0100
+++ b/targets/hal/TARGET_Freescale/TARGET_KPSDK_MCUS/TARGET_MCU_K64F/TARGET_FRDM/PeripheralPins.c	Sun Apr 17 17:45:10 2016 +0100
@@ -108,7 +108,7 @@
     {PTC3 , UART_1, 3},
     {PTC14, UART_4, 3},
     {PTD2 , UART_2, 3},
-    {PTC6 , UART_0, 3},
+    {PTD6 , UART_0, 3},
     {NC  ,  NC    , 0}
 };
 
--- a/targets/hal/TARGET_STM/TARGET_STM32L4/PeripheralPins.h	Fri Apr 15 11:00:11 2016 +0100
+++ b/targets/hal/TARGET_STM/TARGET_STM32L4/PeripheralPins.h	Sun Apr 17 17:45:10 2016 +0100
@@ -55,6 +55,8 @@
 
 extern const PinMap PinMap_UART_TX[];
 extern const PinMap PinMap_UART_RX[];
+extern const PinMap PinMap_UART_RTS[];
+extern const PinMap PinMap_UART_CTS[];
 
 //*** SPI ***
 
--- a/targets/hal/TARGET_STM/TARGET_STM32L4/TARGET_NUCLEO_L476RG/PeripheralPins.c	Fri Apr 15 11:00:11 2016 +0100
+++ b/targets/hal/TARGET_STM/TARGET_STM32L4/TARGET_NUCLEO_L476RG/PeripheralPins.c	Sun Apr 17 17:45:10 2016 +0100
@@ -184,6 +184,28 @@
     {NC,    NC,     0}
 };
 
+const PinMap PinMap_UART_RTS[] = {
+    {PA_1,  UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},
+    {PA_12, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},
+//  {PA_15, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},
+//  {PB_14, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // MEMs
+//  {PC_8,  UART_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART5)},
+//  {PD_4,  UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},
+//  {PD_12, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART3)}, // LED D4
+    {NC,    NC,     0}
+};
+ 
+const PinMap PinMap_UART_CTS[] = {
+    {PA_0,  UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},
+    {PA_11, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},
+//  {PB_0,  UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},
+//  {PB_13, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
+//  {PC_9,  UART_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART5)}, 
+//  {PD_3,  UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},
+//  {PD_11, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART3)}, // LED D4
+    {NC,    NC,     0}
+};
+
 //*** SPI ***
 
 const PinMap PinMap_SPI_MOSI[] = {
--- a/targets/hal/TARGET_STM/TARGET_STM32L4/TARGET_NUCLEO_L476RG/device.h	Fri Apr 15 11:00:11 2016 +0100
+++ b/targets/hal/TARGET_STM/TARGET_STM32L4/TARGET_NUCLEO_L476RG/device.h	Sun Apr 17 17:45:10 2016 +0100
@@ -40,6 +40,7 @@
 #define DEVICE_ANALOGOUT        1
 
 #define DEVICE_SERIAL           1
+#define DEVICE_SERIAL_FC        1
 
 #define DEVICE_I2C              1
 #define DEVICE_I2CSLAVE         1
--- a/targets/hal/TARGET_STM/TARGET_STM32L4/TARGET_NUCLEO_L476RG/objects.h	Fri Apr 15 11:00:11 2016 +0100
+++ b/targets/hal/TARGET_STM/TARGET_STM32L4/TARGET_NUCLEO_L476RG/objects.h	Sun Apr 17 17:45:10 2016 +0100
@@ -75,6 +75,11 @@
     uint32_t parity;
     PinName  pin_tx;
     PinName  pin_rx;
+#if DEVICE_SERIAL_FC
+    uint32_t hw_flow_ctl;
+    PinName pin_rts;
+    PinName pin_cts;
+#endif
 };
 
 struct spi_s {
--- a/targets/hal/TARGET_STM/TARGET_STM32L4/serial_api.c	Fri Apr 15 11:00:11 2016 +0100
+++ b/targets/hal/TARGET_STM/TARGET_STM32L4/serial_api.c	Sun Apr 17 17:45:10 2016 +0100
@@ -49,6 +49,12 @@
 int stdio_uart_inited = 0;
 serial_t stdio_uart;
 
+#if DEVICE_SERIAL_ASYNCH
+#define SERIAL_OBJ(X) (obj->serial.X)
+#else
+#define SERIAL_OBJ(X) (obj->X)
+#endif
+
 static void init_uart(serial_t *obj)
 {
     UartHandle.Instance = (USART_TypeDef *)(obj->uart);
@@ -57,7 +63,11 @@
     UartHandle.Init.WordLength     = obj->databits;
     UartHandle.Init.StopBits       = obj->stopbits;
     UartHandle.Init.Parity         = obj->parity;
+#if DEVICE_SERIAL_FC
+    UartHandle.Init.HwFlowCtl      = SERIAL_OBJ(hw_flow_ctl);
+#else
     UartHandle.Init.HwFlowCtl      = UART_HWCONTROL_NONE;
+#endif    
     UartHandle.Init.OverSampling   = UART_OVERSAMPLING_16;
     UartHandle.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_ENABLE;
 
@@ -231,6 +241,62 @@
     init_uart(obj);
 }
 
+#if DEVICE_SERIAL_FC
+/** Set HW Control Flow
+ * @param obj    The serial object
+ * @param type   The Control Flow type (FlowControlNone, FlowControlRTS, FlowControlCTS, FlowControlRTSCTS)
+ * @param rxflow Pin for the rxflow
+ * @param txflow Pin for the txflow
+ */
+void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, PinName txflow)
+{
+ 
+    // Determine the UART to use (UART_1, UART_2, ...)
+    UARTName uart_rts = (UARTName)pinmap_peripheral(rxflow, PinMap_UART_RTS);
+    UARTName uart_cts = (UARTName)pinmap_peripheral(txflow, PinMap_UART_CTS);
+ 
+    // Get the peripheral name (UART_1, UART_2, ...) from the pin and assign it to the object
+    SERIAL_OBJ(uart) = (UARTName)pinmap_merge(uart_cts, uart_rts);
+ 
+    MBED_ASSERT(SERIAL_OBJ(uart) != (UARTName)NC);
+    UartHandle.Instance = (USART_TypeDef *)(SERIAL_OBJ(uart));
+ 
+    if(type == FlowControlNone) {
+        // Disable hardware flow control
+      SERIAL_OBJ(hw_flow_ctl) = UART_HWCONTROL_NONE;
+    }
+    if (type == FlowControlRTS) {
+        // Enable RTS
+        MBED_ASSERT(uart_rts != (UARTName)NC);
+        SERIAL_OBJ(hw_flow_ctl) = UART_HWCONTROL_RTS;
+        SERIAL_OBJ(pin_rts) = rxflow;
+        // Enable the pin for RTS function
+        pinmap_pinout(rxflow, PinMap_UART_RTS);
+    }
+    if (type == FlowControlCTS) {
+        // Enable CTS
+        MBED_ASSERT(uart_cts != (UARTName)NC);
+        SERIAL_OBJ(hw_flow_ctl) = UART_HWCONTROL_CTS;
+        SERIAL_OBJ(pin_cts) = txflow;
+        // Enable the pin for CTS function
+        pinmap_pinout(txflow, PinMap_UART_CTS);
+    }
+    if (type == FlowControlRTSCTS) {
+        // Enable CTS & RTS
+        MBED_ASSERT(uart_rts != (UARTName)NC);
+        MBED_ASSERT(uart_cts != (UARTName)NC);
+        SERIAL_OBJ(hw_flow_ctl) = UART_HWCONTROL_RTS_CTS;
+        SERIAL_OBJ(pin_rts) = rxflow;
+        SERIAL_OBJ(pin_cts) = txflow;
+        // Enable the pin for CTS function
+        pinmap_pinout(txflow, PinMap_UART_CTS);
+        // Enable the pin for RTS function
+        pinmap_pinout(rxflow, PinMap_UART_RTS);
+    }
+    init_uart(obj);
+}
+#endif
+
 /******************************************************************************
  * INTERRUPTS HANDLING
  ******************************************************************************/