Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: SPIne CH_Communicatuin_Test CH_Communicatuin_Test2 MCP_SPIne ... more
Fork of mbed-dev-f303 by
Revision 171:89b338f31ef1, committed 2017-08-16
- Comitter:
- AnnaBridge
- Date:
- Wed Aug 16 18:27:13 2017 +0100
- Parent:
- 170:19eb464bc2be
- Child:
- 172:7d866c31b3c5
- Commit message:
- This updates the lib to the mbed lib v 149
Changed in this revision
--- a/mbed.h Thu Aug 03 13:13:39 2017 +0100 +++ b/mbed.h Wed Aug 16 18:27:13 2017 +0100 @@ -16,13 +16,13 @@ #ifndef MBED_H #define MBED_H -#define MBED_LIBRARY_VERSION 148 +#define MBED_LIBRARY_VERSION 149 #if MBED_CONF_RTOS_PRESENT // RTOS present, this is valid only for mbed OS 5 #define MBED_MAJOR_VERSION 5 #define MBED_MINOR_VERSION 5 -#define MBED_PATCH_VERSION 4 +#define MBED_PATCH_VERSION 5 #else // mbed 2
--- a/targets/TARGET_Atmel/TARGET_SAM_CortexM0P/i2c_api.c Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_Atmel/TARGET_SAM_CortexM0P/i2c_api.c Wed Aug 16 18:27:13 2017 +0100
@@ -173,7 +173,7 @@
int32_t baud_rate;
int32_t tmp_baud;
int32_t tmp_baud_hs;
- enum status_code tmp_status_code;
+ enum status_code tmp_status_code = STATUS_OK;
/* Sanity check arguments */
MBED_ASSERT(obj);
--- a/targets/TARGET_Atmel/TARGET_SAM_CortexM0P/pwmout_api.c Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_Atmel/TARGET_SAM_CortexM0P/pwmout_api.c Wed Aug 16 18:27:13 2017 +0100
@@ -60,7 +60,7 @@
freq_hz = system_gclk_gen_get_hz(obj->clock_source);
- for (i=0; i<sizeof(tcc_prescaler); i++) {
+ for (i=0; i<sizeof(tcc_prescaler) / sizeof(tcc_prescaler[0]); i++) {
div_freq = freq_hz >> tcc_prescaler[i];
if (!div_freq) break;
us_per_cycle = 1000000.00 / div_freq;
--- a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/drivers/fsl_dspi.c Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/drivers/fsl_dspi.c Wed Aug 16 18:27:13 2017 +0100
@@ -1,32 +1,32 @@
/*
-* Copyright (c) 2015, Freescale Semiconductor, Inc.
-* All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without modification,
-* are permitted provided that the following conditions are met:
-*
-* o Redistributions of source code must retain the above copyright notice, this list
-* of conditions and the following disclaimer.
-*
-* o Redistributions in binary form must reproduce the above copyright notice, this
-* list of conditions and the following disclaimer in the documentation and/or
-* other materials provided with the distribution.
-*
-* o Neither the name of Freescale Semiconductor, Inc. nor the names of its
-* contributors may be used to endorse or promote products derived from this
-* software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
-* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
+ * Copyright (c) 2015, Freescale Semiconductor, Inc.
+ * Copyright 2016-2017 NXP
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * o Redistributions of source code must retain the above copyright notice, this list
+ * of conditions and the following disclaimer.
+ *
+ * o Redistributions in binary form must reproduce the above copyright notice, this
+ * list of conditions and the following disclaimer in the documentation and/or
+ * other materials provided with the distribution.
+ *
+ * o Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
#include "fsl_dspi.h"
@@ -65,27 +65,27 @@
/*!
* @brief Master fill up the TX FIFO with data.
- * This is not a public API as it is called from other driver functions.
+ * This is not a public API.
*/
static void DSPI_MasterTransferFillUpTxFifo(SPI_Type *base, dspi_master_handle_t *handle);
/*!
* @brief Master finish up a transfer.
* It would call back if there is callback function and set the state to idle.
- * This is not a public API as it is called from other driver functions.
+ * This is not a public API.
*/
static void DSPI_MasterTransferComplete(SPI_Type *base, dspi_master_handle_t *handle);
/*!
* @brief Slave fill up the TX FIFO with data.
- * This is not a public API as it is called from other driver functions.
+ * This is not a public API.
*/
static void DSPI_SlaveTransferFillUpTxFifo(SPI_Type *base, dspi_slave_handle_t *handle);
/*!
* @brief Slave finish up a transfer.
* It would call back if there is callback function and set the state to idle.
- * This is not a public API as it is called from other driver functions.
+ * This is not a public API.
*/
static void DSPI_SlaveTransferComplete(SPI_Type *base, dspi_slave_handle_t *handle);
@@ -100,7 +100,7 @@
/*!
* @brief Master prepare the transfer.
* Basically it set up dspi_master_handle .
- * This is not a public API as it is called from other driver functions. fsl_dspi_edma.c also call this function.
+ * This is not a public API.
*/
static void DSPI_MasterTransferPrepare(SPI_Type *base, dspi_master_handle_t *handle, dspi_transfer_t *transfer);
@@ -129,7 +129,7 @@
#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
/*! @brief Pointers to dspi handles for each instance. */
-static void *g_dspiHandle[FSL_FEATURE_SOC_DSPI_COUNT];
+static void *g_dspiHandle[ARRAY_SIZE(s_dspiBases)];
/*! @brief Pointer to master IRQ handler for each instance. */
static dspi_master_isr_t s_dspiMasterIsr;
@@ -137,6 +137,8 @@
/*! @brief Pointer to slave IRQ handler for each instance. */
static dspi_slave_isr_t s_dspiSlaveIsr;
+/* @brief Dummy data for each instance. This data is used when user's tx buffer is NULL*/
+volatile uint8_t s_dummyData[ARRAY_SIZE(s_dspiBases)] = {0};
/**********************************************************************************************************************
* Code
*********************************************************************************************************************/
@@ -145,7 +147,7 @@
uint32_t instance;
/* Find the instance index from base address mappings. */
- for (instance = 0; instance < FSL_FEATURE_SOC_DSPI_COUNT; instance++)
+ for (instance = 0; instance < ARRAY_SIZE(s_dspiBases); instance++)
{
if (s_dspiBases[instance] == base)
{
@@ -153,11 +155,17 @@
}
}
- assert(instance < FSL_FEATURE_SOC_DSPI_COUNT);
+ assert(instance < ARRAY_SIZE(s_dspiBases));
return instance;
}
+void DSPI_SetDummyData(SPI_Type *base, uint8_t dummyData)
+{
+ uint32_t instance = DSPI_GetInstance(base);
+ s_dummyData[instance] = dummyData;
+}
+
void DSPI_MasterInit(SPI_Type *base, const dspi_master_config_t *masterConfig, uint32_t srcClock_Hz)
{
assert(masterConfig);
@@ -202,6 +210,7 @@
DSPI_MasterSetDelayTimes(base, masterConfig->whichCtar, kDSPI_BetweenTransfer, srcClock_Hz,
masterConfig->ctarConfig.betweenTransferDelayInNanoSec);
+ DSPI_SetDummyData(base, DSPI_DUMMY_DATA);
DSPI_StartTransfer(base);
}
@@ -262,6 +271,8 @@
SPI_CTAR_SLAVE_CPOL(slaveConfig->ctarConfig.cpol) |
SPI_CTAR_SLAVE_CPHA(slaveConfig->ctarConfig.cpha);
+ DSPI_SetDummyData(base, DSPI_DUMMY_DATA);
+
DSPI_StartTransfer(base);
}
@@ -582,7 +593,7 @@
uint16_t wordToSend = 0;
uint16_t wordReceived = 0;
- uint8_t dummyData = DSPI_DUMMY_DATA;
+ uint8_t dummyData = s_dummyData[DSPI_GetInstance(base)];
uint8_t bitsPerFrame;
uint32_t command;
@@ -897,13 +908,10 @@
handle->state = kDSPI_Busy;
DSPI_MasterTransferPrepare(base, handle, transfer);
- DSPI_StartTransfer(base);
/* Enable the NVIC for DSPI peripheral. */
EnableIRQ(s_dspiIRQ[DSPI_GetInstance(base)]);
- DSPI_MasterTransferFillUpTxFifo(base, handle);
-
/* RX FIFO Drain request: RFDF_RE to enable RFDF interrupt
* Since SPI is a synchronous interface, we only need to enable the RX interrupt.
* The IRQ handler will get the status of RX and TX interrupt flags.
@@ -911,7 +919,10 @@
s_dspiMasterIsr = DSPI_MasterTransferHandleIRQ;
DSPI_EnableInterrupts(base, kDSPI_RxFifoDrainRequestInterruptEnable);
+ DSPI_StartTransfer(base);
+ /* Fill up the Tx FIFO to trigger the transfer. */
+ DSPI_MasterTransferFillUpTxFifo(base, handle);
return kStatus_Success;
}
@@ -952,13 +963,12 @@
status = kStatus_Success;
}
+ handle->state = kDSPI_Idle;
+
if (handle->callback)
{
handle->callback(base, handle, status, handle->userData);
}
-
- /* The transfer is complete.*/
- handle->state = kDSPI_Idle;
}
static void DSPI_MasterTransferFillUpTxFifo(SPI_Type *base, dspi_master_handle_t *handle)
@@ -966,7 +976,7 @@
assert(handle);
uint16_t wordToSend = 0;
- uint8_t dummyData = DSPI_DUMMY_DATA;
+ uint8_t dummyData = s_dummyData[DSPI_GetInstance(base)];
/* If bits/frame is greater than one byte */
if (handle->bitsPerFrame > 8)
@@ -1257,11 +1267,6 @@
DSPI_FlushFifo(base, true, true);
DSPI_ClearStatusFlags(base, kDSPI_AllStatusFlag);
- DSPI_StartTransfer(base);
-
- /* Prepare data to transmit */
- DSPI_SlaveTransferFillUpTxFifo(base, handle);
-
s_dspiSlaveIsr = DSPI_SlaveTransferHandleIRQ;
/* Enable RX FIFO drain request, the slave only use this interrupt */
@@ -1278,6 +1283,11 @@
DSPI_EnableInterrupts(base, kDSPI_TxFifoUnderflowInterruptEnable);
}
+ DSPI_StartTransfer(base);
+
+ /* Prepare data to transmit */
+ DSPI_SlaveTransferFillUpTxFifo(base, handle);
+
return kStatus_Success;
}
@@ -1306,7 +1316,7 @@
assert(handle);
uint16_t transmitData = 0;
- uint8_t dummyPattern = DSPI_DUMMY_DATA;
+ uint8_t dummyPattern = s_dummyData[DSPI_GetInstance(base)];
/* Service the transmitter, if transmit buffer provided, transmit the data,
* else transmit dummy pattern
@@ -1413,12 +1423,12 @@
status = kStatus_Success;
}
+ handle->state = kDSPI_Idle;
+
if (handle->callback)
{
handle->callback(base, handle, status, handle->userData);
}
-
- handle->state = kDSPI_Idle;
}
void DSPI_SlaveTransferAbort(SPI_Type *base, dspi_slave_handle_t *handle)
@@ -1440,7 +1450,7 @@
{
assert(handle);
- uint8_t dummyPattern = DSPI_DUMMY_DATA;
+ uint8_t dummyPattern = s_dummyData[DSPI_GetInstance(base)];
uint32_t dataReceived;
uint32_t dataSend = 0;
@@ -1617,7 +1627,7 @@
}
}
-#if (FSL_FEATURE_SOC_DSPI_COUNT > 0)
+#if defined(SPI0)
void SPI0_DriverIRQHandler(void)
{
assert(g_dspiHandle[0]);
@@ -1625,7 +1635,7 @@
}
#endif
-#if (FSL_FEATURE_SOC_DSPI_COUNT > 1)
+#if defined(SPI1)
void SPI1_DriverIRQHandler(void)
{
assert(g_dspiHandle[1]);
@@ -1633,7 +1643,7 @@
}
#endif
-#if (FSL_FEATURE_SOC_DSPI_COUNT > 2)
+#if defined(SPI2)
void SPI2_DriverIRQHandler(void)
{
assert(g_dspiHandle[2]);
@@ -1641,7 +1651,7 @@
}
#endif
-#if (FSL_FEATURE_SOC_DSPI_COUNT > 3)
+#if defined(SPI3)
void SPI3_DriverIRQHandler(void)
{
assert(g_dspiHandle[3]);
@@ -1649,7 +1659,7 @@
}
#endif
-#if (FSL_FEATURE_SOC_DSPI_COUNT > 4)
+#if defined(SPI4)
void SPI4_DriverIRQHandler(void)
{
assert(g_dspiHandle[4]);
@@ -1657,7 +1667,7 @@
}
#endif
-#if (FSL_FEATURE_SOC_DSPI_COUNT > 5)
+#if defined(SPI5)
void SPI5_DriverIRQHandler(void)
{
assert(g_dspiHandle[5]);
--- a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/drivers/fsl_dspi.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/drivers/fsl_dspi.h Wed Aug 16 18:27:13 2017 +0100
@@ -1,6 +1,6 @@
/*
* Copyright (c) 2015, Freescale Semiconductor, Inc.
- * All rights reserved.
+ * Copyright 2016-2017 NXP
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
@@ -12,7 +12,7 @@
* list of conditions and the following disclaimer in the documentation and/or
* other materials provided with the distribution.
*
- * o Neither the name of Freescale Semiconductor, Inc. nor the names of its
+ * o Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
@@ -37,15 +37,14 @@
* @{
*/
-
/**********************************************************************************************************************
* Definitions
*********************************************************************************************************************/
/*! @name Driver version */
/*@{*/
-/*! @brief DSPI driver version 2.1.3. */
-#define FSL_DSPI_DRIVER_VERSION (MAKE_VERSION(2, 1, 3))
+/*! @brief DSPI driver version 2.2.0. */
+#define FSL_DSPI_DRIVER_VERSION (MAKE_VERSION(2, 2, 0))
/*@}*/
#ifndef DSPI_DUMMY_DATA
@@ -107,7 +106,8 @@
} dspi_master_slave_mode_t;
/*!
- * @brief DSPI Sample Point: Controls when the DSPI master samples SIN in the Modified Transfer Format. This field is valid
+ * @brief DSPI Sample Point: Controls when the DSPI master samples SIN in the Modified Transfer Format. This field is
+ * valid
* only when the CPHA bit in the CTAR register is 0.
*/
typedef enum _dspi_master_sample_point
@@ -216,8 +216,9 @@
kDSPI_MasterPcs4 = 4U << DSPI_MASTER_PCS_SHIFT, /*!< DSPI master transfer use PCS4 signal. */
kDSPI_MasterPcs5 = 5U << DSPI_MASTER_PCS_SHIFT, /*!< DSPI master transfer use PCS5 signal. */
- kDSPI_MasterPcsContinuous = 1U << 20, /*!< Indicates whether the PCS signal is continuous. */
- kDSPI_MasterActiveAfterTransfer = 1U << 21, /*!< Indicates whether the PCS signal is active after the last frame transfer.*/
+ kDSPI_MasterPcsContinuous = 1U << 20, /*!< Indicates whether the PCS signal is continuous. */
+ kDSPI_MasterActiveAfterTransfer =
+ 1U << 21, /*!< Indicates whether the PCS signal is active after the last frame transfer.*/
};
#define DSPI_SLAVE_CTAR_SHIFT (0U) /*!< DSPI slave CTAR shift macro; used internally. */
@@ -240,7 +241,7 @@
/*! @brief DSPI master command date configuration used for the SPIx_PUSHR.*/
typedef struct _dspi_command_data_config
{
- bool isPcsContinuous; /*!< Option to enable the continuous assertion of the chip select between transfers.*/
+ bool isPcsContinuous; /*!< Option to enable the continuous assertion of the chip select between transfers.*/
dspi_ctar_selection_t whichCtar; /*!< The desired Clock and Transfer Attributes
Register (CTAR) to use for CTAS.*/
dspi_which_pcs_t whichPcs; /*!< The desired PCS signal to use for the data transfer.*/
@@ -257,10 +258,10 @@
dspi_clock_phase_t cpha; /*!< Clock phase. */
dspi_shift_direction_t direction; /*!< MSB or LSB data shift direction. */
- uint32_t pcsToSckDelayInNanoSec; /*!< PCS to SCK delay time in nanoseconds; setting to 0 sets the minimum
- delay. It also sets the boundary value if out of range.*/
- uint32_t lastSckToPcsDelayInNanoSec; /*!< The last SCK to PCS delay time in nanoseconds; setting to 0 sets the
- minimum delay. It also sets the boundary value if out of range.*/
+ uint32_t pcsToSckDelayInNanoSec; /*!< PCS to SCK delay time in nanoseconds; setting to 0 sets the minimum
+ delay. It also sets the boundary value if out of range.*/
+ uint32_t lastSckToPcsDelayInNanoSec; /*!< The last SCK to PCS delay time in nanoseconds; setting to 0 sets the
+ minimum delay. It also sets the boundary value if out of range.*/
uint32_t betweenTransferDelayInNanoSec; /*!< After the SCK delay time in nanoseconds; setting to 0 sets the minimum
delay. It also sets the boundary value if out of range.*/
@@ -370,8 +371,9 @@
uint8_t fifoSize; /*!< FIFO dataSize. */
- volatile bool isPcsActiveAfterTransfer; /*!< Indicates whether the PCS signal is active after the last frame transfer.*/
- volatile bool isThereExtraByte; /*!< Indicates whether there are extra bytes.*/
+ volatile bool
+ isPcsActiveAfterTransfer; /*!< Indicates whether the PCS signal is active after the last frame transfer.*/
+ volatile bool isThereExtraByte; /*!< Indicates whether there are extra bytes.*/
uint8_t *volatile txData; /*!< Send buffer. */
uint8_t *volatile rxData; /*!< Receive buffer. */
@@ -575,6 +577,7 @@
*
* This function configures the various interrupt masks of the DSPI. The parameters are a base and an interrupt mask.
* Note, for Tx Fill and Rx FIFO drain requests, enable the interrupt request and disable the DMA request.
+ * Do not use this API(write to RSER register) while DSPI is in running state.
*
* @code
* DSPI_EnableInterrupts(base, kDSPI_TxCompleteInterruptEnable | kDSPI_EndOfQueueInterruptEnable );
@@ -950,10 +953,12 @@
* @brief Writes a 32-bit data word (16-bit command appended with 16-bit data) into the data
* buffer master mode and waits till complete to return.
*
- * In this function, the user must append the 16-bit data to the 16-bit command information and then provide the total 32-bit word
+ * In this function, the user must append the 16-bit data to the 16-bit command information and then provide the total
+* 32-bit word
* as the data to send.
* The command portion provides characteristics of the data, such as the optional continuous chip select operation
- * between transfers, the desired Clock and Transfer Attributes register to use for the associated SPI frame, the desired PCS
+ * between transfers, the desired Clock and Transfer Attributes register to use for the associated SPI frame, the
+* desired PCS
* signal to use for the data transfer, whether the current transfer is the last in the queue, and whether to clear the
* transfer count (normally needed when sending the first frame of a data packet). The user is responsible for
* appending this command with the data to send. This is an example:
@@ -1023,6 +1028,14 @@
}
/*!
+ * @brief Set up the dummy data.
+ *
+ * @param base DSPI peripheral address.
+ * @param dummyData Data to be transferred when tx buffer is NULL.
+ */
+void DSPI_SetDummyData(SPI_Type *base, uint8_t dummyData);
+
+/*!
*@}
*/
--- a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/drivers/fsl_dspi_edma.c Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/drivers/fsl_dspi_edma.c Wed Aug 16 18:27:13 2017 +0100
@@ -1,32 +1,32 @@
/*
-* Copyright (c) 2015, Freescale Semiconductor, Inc.
-* All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without modification,
-* are permitted provided that the following conditions are met:
-*
-* o Redistributions of source code must retain the above copyright notice, this list
-* of conditions and the following disclaimer.
-*
-* o Redistributions in binary form must reproduce the above copyright notice, this
-* list of conditions and the following disclaimer in the documentation and/or
-* other materials provided with the distribution.
-*
-* o Neither the name of Freescale Semiconductor, Inc. nor the names of its
-* contributors may be used to endorse or promote products derived from this
-* software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
-* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
+ * Copyright (c) 2015, Freescale Semiconductor, Inc.
+ * Copyright 2016-2017 NXP
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * o Redistributions of source code must retain the above copyright notice, this list
+ * of conditions and the following disclaimer.
+ *
+ * o Redistributions in binary form must reproduce the above copyright notice, this
+ * list of conditions and the following disclaimer in the documentation and/or
+ * other materials provided with the distribution.
+ *
+ * o Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
#include "fsl_dspi_edma.h"
@@ -57,7 +57,7 @@
***********************************************************************************************************************/
/*!
* @brief EDMA_DspiMasterCallback after the DSPI master transfer completed by using EDMA.
-* This is not a public API as it is called from other driver functions.
+* This is not a public API.
*/
static void EDMA_DspiMasterCallback(edma_handle_t *edmaHandle,
void *g_dspiEdmaPrivateHandle,
@@ -66,7 +66,7 @@
/*!
* @brief EDMA_DspiSlaveCallback after the DSPI slave transfer completed by using EDMA.
-* This is not a public API as it is called from other driver functions.
+* This is not a public API.
*/
static void EDMA_DspiSlaveCallback(edma_handle_t *edmaHandle,
void *g_dspiEdmaPrivateHandle,
@@ -89,6 +89,8 @@
static dspi_master_edma_private_handle_t s_dspiMasterEdmaPrivateHandle[FSL_FEATURE_SOC_DSPI_COUNT];
static dspi_slave_edma_private_handle_t s_dspiSlaveEdmaPrivateHandle[FSL_FEATURE_SOC_DSPI_COUNT];
+/*! @brief Global variable for dummy data value setting. */
+extern volatile uint8_t s_dummyData[];
/***********************************************************************************************************************
* Code
***********************************************************************************************************************/
@@ -103,7 +105,9 @@
{
assert(handle);
assert(edmaRxRegToRxDataHandle);
+#if (!(defined(FSL_FEATURE_DSPI_HAS_GASKET) && FSL_FEATURE_DSPI_HAS_GASKET))
assert(edmaTxDataToIntermediaryHandle);
+#endif
assert(edmaIntermediaryToTxRegHandle);
/* Zero the handle. */
@@ -145,9 +149,11 @@
return kStatus_DSPI_Busy;
}
+ handle->state = kDSPI_Busy;
+
uint32_t instance = DSPI_GetInstance(base);
uint16_t wordToSend = 0;
- uint8_t dummyData = DSPI_DUMMY_DATA;
+ uint8_t dummyData = s_dummyData[DSPI_GetInstance(base)];
uint8_t dataAlreadyFed = 0;
uint8_t dataFedMax = 2;
@@ -158,9 +164,8 @@
edma_transfer_config_t transferConfigA;
edma_transfer_config_t transferConfigB;
- edma_transfer_config_t transferConfigC;
- handle->txBuffIfNull = ((uint32_t)DSPI_DUMMY_DATA << 8) | DSPI_DUMMY_DATA;
+ handle->txBuffIfNull = ((uint32_t)dummyData << 8) | dummyData;
dspi_command_data_config_t commandStruct;
DSPI_StopTransfer(base);
@@ -196,20 +201,32 @@
handle->remainingReceiveByteCount = transfer->dataSize;
handle->totalByteCount = transfer->dataSize;
- /* This limits the amount of data we can transfer due to the linked channel.
- * The max bytes is 511 if 8-bit/frame or 1022 if 16-bit/frame
+ /* If using a shared RX/TX DMA request, then this limits the amount of data we can transfer
+ * due to the linked channel. The max bytes is 511 if 8-bit/frame or 1022 if 16-bit/frame
*/
+ uint32_t limited_size = 0;
+ if (1 == FSL_FEATURE_DSPI_HAS_SEPARATE_DMA_RX_TX_REQn(base))
+ {
+ limited_size = 32767u;
+ }
+ else
+ {
+ limited_size = 511u;
+ }
+
if (handle->bitsPerFrame > 8)
{
- if (transfer->dataSize > 1022)
+ if (transfer->dataSize > (limited_size << 1u))
{
+ handle->state = kDSPI_Idle;
return kStatus_DSPI_OutOfRange;
}
}
else
{
- if (transfer->dataSize > 511)
+ if (transfer->dataSize > limited_size)
{
+ handle->state = kDSPI_Idle;
return kStatus_DSPI_OutOfRange;
}
}
@@ -217,16 +234,38 @@
/*The data size should be even if the bitsPerFrame is greater than 8 (that is 2 bytes per frame in dspi) */
if ((handle->bitsPerFrame > 8) && (transfer->dataSize & 0x1))
{
+ handle->state = kDSPI_Idle;
return kStatus_InvalidArgument;
}
- handle->state = kDSPI_Busy;
-
DSPI_DisableDMA(base, kDSPI_RxDmaEnable | kDSPI_TxDmaEnable);
EDMA_SetCallback(handle->edmaRxRegToRxDataHandle, EDMA_DspiMasterCallback,
&s_dspiMasterEdmaPrivateHandle[instance]);
+ /*
+ (1)For DSPI instances with shared RX/TX DMA requests: Rx DMA request -> channel_A -> channel_B-> channel_C.
+ channel_A minor link to channel_B , channel_B minor link to channel_C.
+
+ Already pushed 1 or 2 data in SPI_PUSHR , then start the DMA tansfer.
+ channel_A:SPI_POPR to rxData,
+ channel_B:next txData to handle->command (low 16 bits),
+ channel_C:handle->command (32 bits) to SPI_PUSHR, and use the scatter/gather to transfer the last data
+ (handle->lastCommand to SPI_PUSHR).
+
+ (2)For DSPI instances with separate RX and TX DMA requests:
+ Rx DMA request -> channel_A
+ Tx DMA request -> channel_C -> channel_B .
+ channel_C major link to channel_B.
+ So need prepare the first data in "intermediary" before the DMA
+ transfer and then channel_B is used to prepare the next data to "intermediary"
+
+ channel_A:SPI_POPR to rxData,
+ channel_C: handle->command (32 bits) to SPI_PUSHR,
+ channel_B: next txData to handle->command (low 16 bits), and use the scatter/gather to prepare the last data
+ (handle->lastCommand to handle->Command).
+ */
+
/*If dspi has separate dma request , prepare the first data in "intermediary" .
else (dspi has shared dma request) , send first 2 data if there is fifo or send first 1 data if there is no fifo*/
if (1 == FSL_FEATURE_DSPI_HAS_SEPARATE_DMA_RX_TX_REQn(base))
@@ -252,6 +291,7 @@
wordToSend = ((uint32_t)dummyData << 8) | dummyData;
}
handle->lastCommand = (handle->lastCommand & 0xffff0000U) | wordToSend;
+ handle->command = handle->lastCommand;
}
else /* For all words except the last word , frame > 8bits */
{
@@ -284,6 +324,7 @@
if (handle->remainingSendByteCount == 1)
{
handle->lastCommand = (handle->lastCommand & 0xffff0000U) | wordToSend;
+ handle->command = handle->lastCommand;
}
else
{
@@ -293,11 +334,10 @@
}
else /*dspi has shared dma request*/
-
{
/* For DSPI instances with shared RX/TX DMA requests, we'll use the RX DMA request to
- * trigger ongoing transfers and will link to the TX DMA channel from the RX DMA channel.
- */
+ * trigger ongoing transfers and will link to the TX DMA channel from the RX DMA channel.
+ */
/* If bits/frame is greater than one byte */
if (handle->bitsPerFrame > 8)
@@ -388,7 +428,7 @@
}
}
- /***channel_A *** used for carry the data from Rx_Data_Register(POPR) to User_Receive_Buffer*/
+ /***channel_A *** used for carry the data from Rx_Data_Register(POPR) to User_Receive_Buffer(rxData)*/
EDMA_ResetChannel(handle->edmaRxRegToRxDataHandle->base, handle->edmaRxRegToRxDataHandle->channel);
transferConfigA.srcAddr = (uint32_t)rxAddr;
@@ -428,71 +468,7 @@
EDMA_EnableChannelInterrupts(handle->edmaRxRegToRxDataHandle->base, handle->edmaRxRegToRxDataHandle->channel,
kEDMA_MajorInterruptEnable);
- /***channel_B *** used for carry the data from User_Send_Buffer to "intermediary" because the SPIx_PUSHR should
- write the 32bits at once time . Then use channel_C to carry the "intermediary" to SPIx_PUSHR. Note that the
- SPIx_PUSHR upper 16 bits are the "command" and the low 16bits are data */
- EDMA_ResetChannel(handle->edmaTxDataToIntermediaryHandle->base, handle->edmaTxDataToIntermediaryHandle->channel);
-
- if (handle->remainingSendByteCount > 0)
- {
- if (handle->txData)
- {
- transferConfigB.srcAddr = (uint32_t)(handle->txData);
- transferConfigB.srcOffset = 1;
- }
- else
- {
- transferConfigB.srcAddr = (uint32_t)(&handle->txBuffIfNull);
- transferConfigB.srcOffset = 0;
- }
-
- transferConfigB.destAddr = (uint32_t)(&handle->command);
- transferConfigB.destOffset = 0;
-
- transferConfigB.srcTransferSize = kEDMA_TransferSize1Bytes;
-
- if (handle->bitsPerFrame <= 8)
- {
- transferConfigB.destTransferSize = kEDMA_TransferSize1Bytes;
- transferConfigB.minorLoopBytes = 1;
-
- if (1 == FSL_FEATURE_DSPI_HAS_SEPARATE_DMA_RX_TX_REQn(base))
- {
- /*already prepared the first data in "intermediary" , so minus 1 */
- transferConfigB.majorLoopCounts = handle->remainingSendByteCount - 1;
- }
- else
- {
- /*Only enable channel_B minorlink to channel_C , so need to add one count due to the last time is
- majorlink , the majorlink would not trigger the channel_C*/
- transferConfigB.majorLoopCounts = handle->remainingSendByteCount + 1;
- }
- }
- else
- {
- transferConfigB.destTransferSize = kEDMA_TransferSize2Bytes;
- transferConfigB.minorLoopBytes = 2;
- if (1 == FSL_FEATURE_DSPI_HAS_SEPARATE_DMA_RX_TX_REQn(base))
- {
- /*already prepared the first data in "intermediary" , so minus 1 */
- transferConfigB.majorLoopCounts = handle->remainingSendByteCount / 2 - 1;
- }
- else
- {
- /*Only enable channel_B minorlink to channel_C , so need to add one count due to the last time is
- * majorlink*/
- transferConfigB.majorLoopCounts = handle->remainingSendByteCount / 2 + 1;
- }
- }
-
- EDMA_SetTransferConfig(handle->edmaTxDataToIntermediaryHandle->base,
- handle->edmaTxDataToIntermediaryHandle->channel, &transferConfigB, NULL);
- }
-
- /***channel_C ***carry the "intermediary" to SPIx_PUSHR. used the edma Scatter Gather function on channel_C to
- handle the last data */
- EDMA_ResetChannel(handle->edmaIntermediaryToTxRegHandle->base, handle->edmaIntermediaryToTxRegHandle->channel);
-
+ /*Calculate the last data : handle->lastCommand*/
if (((handle->remainingSendByteCount > 0) && (1 != FSL_FEATURE_DSPI_HAS_SEPARATE_DMA_RX_TX_REQn(base))) ||
((((handle->remainingSendByteCount > 1) && (handle->bitsPerFrame <= 8)) ||
((handle->remainingSendByteCount > 2) && (handle->bitsPerFrame > 8))) &&
@@ -543,8 +519,252 @@
}
}
+/* The feature of GASKET is that the SPI supports 8-bit or 16-bit writes to the PUSH TX FIFO,
+ * allowing a single write to the command word followed by multiple writes to the transmit word.
+ * The TX FIFO will save the last command word written, and convert a 8-bit/16-bit write to the
+ * transmit word into a 32-bit write that pushes both the command word and transmit word into
+ * the TX FIFO (PUSH TX FIFO Register In Master Mode)
+ * So, if this feature is supported, we can use use one channel to carry the receive data from
+ * receive regsiter to user data buffer, use the other channel to carry the data from user data buffer
+ * to transmit register,and use the scatter/gather function to prepare the last data.
+ * That is to say, if GASKET feature is supported, we can use only two channels for tansferring data.
+ */
+#if defined(FSL_FEATURE_DSPI_HAS_GASKET) && FSL_FEATURE_DSPI_HAS_GASKET
+ /* For DSPI instances with separate RX and TX DMA requests: use the scatter/gather to prepare the last data
+ * (handle->lastCommand) to PUSHR register.
+ */
+
+ EDMA_ResetChannel(handle->edmaIntermediaryToTxRegHandle->base, handle->edmaIntermediaryToTxRegHandle->channel);
+
if ((1 == FSL_FEATURE_DSPI_HAS_SEPARATE_DMA_RX_TX_REQn(base)) ||
- ((1 != FSL_FEATURE_DSPI_HAS_SEPARATE_DMA_RX_TX_REQn(base)) && (handle->remainingSendByteCount > 0)))
+ ((handle->remainingSendByteCount > 0) && (1 != FSL_FEATURE_DSPI_HAS_SEPARATE_DMA_RX_TX_REQn(base))))
+ {
+ transferConfigB.srcAddr = (uint32_t) & (handle->lastCommand);
+ transferConfigB.destAddr = (uint32_t)txAddr;
+ transferConfigB.srcTransferSize = kEDMA_TransferSize4Bytes;
+ transferConfigB.destTransferSize = kEDMA_TransferSize4Bytes;
+ transferConfigB.srcOffset = 0;
+ transferConfigB.destOffset = 0;
+ transferConfigB.minorLoopBytes = 4;
+ transferConfigB.majorLoopCounts = 1;
+
+ EDMA_TcdReset(softwareTCD);
+ EDMA_TcdSetTransferConfig(softwareTCD, &transferConfigB, NULL);
+ }
+
+ /*User_Send_Buffer(txData) to PUSHR register. */
+ if (((handle->remainingSendByteCount > 2) && (handle->bitsPerFrame <= 8)) ||
+ ((handle->remainingSendByteCount > 4) && (handle->bitsPerFrame > 8)))
+ {
+ if (handle->txData)
+ {
+ if (1 == FSL_FEATURE_DSPI_HAS_SEPARATE_DMA_RX_TX_REQn(base))
+ {
+ /* For DSPI with separate RX and TX DMA requests, one frame data has been carry
+ * to handle->command, so need to reduce the pointer of txData.
+ */
+ transferConfigB.srcAddr =
+ (uint32_t)((uint8_t *)(handle->txData) - ((handle->bitsPerFrame <= 8) ? (1U) : (2U)));
+ transferConfigB.srcOffset = 1;
+ }
+ else
+ {
+ /* For DSPI with shared RX and TX DMA requests, one or two frame data have been carry
+ * to PUSHR register, so no need to change the pointer of txData.
+ */
+ transferConfigB.srcAddr = (uint32_t)((uint8_t *)(handle->txData));
+ transferConfigB.srcOffset = 1;
+ }
+ }
+ else
+ {
+ transferConfigB.srcAddr = (uint32_t)(&handle->txBuffIfNull);
+ transferConfigB.srcOffset = 0;
+ }
+
+ transferConfigB.destAddr = (uint32_t)txAddr;
+ transferConfigB.destOffset = 0;
+
+ transferConfigB.srcTransferSize = kEDMA_TransferSize1Bytes;
+
+ if (handle->bitsPerFrame <= 8)
+ {
+ transferConfigB.destTransferSize = kEDMA_TransferSize1Bytes;
+ transferConfigB.minorLoopBytes = 1;
+
+ transferConfigB.majorLoopCounts = handle->remainingSendByteCount - 1;
+ }
+ else
+ {
+ transferConfigB.destTransferSize = kEDMA_TransferSize2Bytes;
+ transferConfigB.minorLoopBytes = 2;
+ transferConfigB.majorLoopCounts = (handle->remainingSendByteCount / 2) - 1;
+ }
+
+ EDMA_SetTransferConfig(handle->edmaIntermediaryToTxRegHandle->base,
+ handle->edmaIntermediaryToTxRegHandle->channel, &transferConfigB, softwareTCD);
+ }
+ /* If only one word to transmit, only carry the lastcommand. */
+ else
+ {
+ EDMA_SetTransferConfig(handle->edmaIntermediaryToTxRegHandle->base,
+ handle->edmaIntermediaryToTxRegHandle->channel, &transferConfigB, NULL);
+ }
+
+ /*Start the EDMA channel_A , channel_C. */
+ EDMA_StartTransfer(handle->edmaRxRegToRxDataHandle);
+ EDMA_StartTransfer(handle->edmaIntermediaryToTxRegHandle);
+
+ /* Set the channel link.
+ * For DSPI instances with shared TX and RX DMA requests, setup channel minor link, first receive data from the
+ * receive register, and then carry transmit data to PUSHER register.
+ * For DSPI instance with separate TX and RX DMA requests, there is no need to set up channel link.
+ */
+ if (1 != FSL_FEATURE_DSPI_HAS_SEPARATE_DMA_RX_TX_REQn(base))
+ {
+ /*Set channel priority*/
+ uint8_t channelPriorityLow = handle->edmaRxRegToRxDataHandle->channel;
+ uint8_t channelPriorityHigh = handle->edmaIntermediaryToTxRegHandle->channel;
+ uint8_t t = 0;
+
+ if (channelPriorityLow > channelPriorityHigh)
+ {
+ t = channelPriorityLow;
+ channelPriorityLow = channelPriorityHigh;
+ channelPriorityHigh = t;
+ }
+
+ edma_channel_Preemption_config_t preemption_config_t;
+ preemption_config_t.enableChannelPreemption = true;
+ preemption_config_t.enablePreemptAbility = true;
+ preemption_config_t.channelPriority = channelPriorityLow;
+
+ EDMA_SetChannelPreemptionConfig(handle->edmaRxRegToRxDataHandle->base, handle->edmaRxRegToRxDataHandle->channel,
+ &preemption_config_t);
+
+ preemption_config_t.channelPriority = channelPriorityHigh;
+ EDMA_SetChannelPreemptionConfig(handle->edmaIntermediaryToTxRegHandle->base,
+ handle->edmaIntermediaryToTxRegHandle->channel, &preemption_config_t);
+ /*if there is Rx DMA request , carry the 32bits data (handle->command) to user data first , then link to
+ channelC to carry the next data to PUSHER register.(txData to PUSHER) */
+ if (handle->remainingSendByteCount > 0)
+ {
+ EDMA_SetChannelLink(handle->edmaRxRegToRxDataHandle->base, handle->edmaRxRegToRxDataHandle->channel,
+ kEDMA_MinorLink, handle->edmaIntermediaryToTxRegHandle->channel);
+ }
+ }
+
+ DSPI_EnableDMA(base, kDSPI_RxDmaEnable | kDSPI_TxDmaEnable);
+
+ /* Setup control info to PUSHER register. */
+ *((uint16_t *)&(base->PUSHR) + 1) = (handle->command >> 16U);
+#else
+
+ /***channel_B *** used for carry the data from User_Send_Buffer to "intermediary" because the SPIx_PUSHR should
+ write the 32bits at once time . Then use channel_C to carry the "intermediary" to SPIx_PUSHR. Note that the
+ SPIx_PUSHR upper 16 bits are the "command" and the low 16bits are data */
+
+ EDMA_ResetChannel(handle->edmaTxDataToIntermediaryHandle->base, handle->edmaTxDataToIntermediaryHandle->channel);
+
+ /*For DSPI instances with separate RX and TX DMA requests: use the scatter/gather to prepare the last data
+ * (handle->lastCommand) to handle->Command*/
+ if (1 == FSL_FEATURE_DSPI_HAS_SEPARATE_DMA_RX_TX_REQn(base))
+ {
+ transferConfigB.srcAddr = (uint32_t) & (handle->lastCommand);
+ transferConfigB.destAddr = (uint32_t) & (handle->command);
+ transferConfigB.srcTransferSize = kEDMA_TransferSize4Bytes;
+ transferConfigB.destTransferSize = kEDMA_TransferSize4Bytes;
+ transferConfigB.srcOffset = 0;
+ transferConfigB.destOffset = 0;
+ transferConfigB.minorLoopBytes = 4;
+ transferConfigB.majorLoopCounts = 1;
+
+ EDMA_TcdReset(softwareTCD);
+ EDMA_TcdSetTransferConfig(softwareTCD, &transferConfigB, NULL);
+ }
+
+ /*User_Send_Buffer(txData) to intermediary(handle->command)*/
+ if (((((handle->remainingSendByteCount > 2) && (handle->bitsPerFrame <= 8)) ||
+ ((handle->remainingSendByteCount > 4) && (handle->bitsPerFrame > 8))) &&
+ (1 == FSL_FEATURE_DSPI_HAS_SEPARATE_DMA_RX_TX_REQn(base))) ||
+ (1 != FSL_FEATURE_DSPI_HAS_SEPARATE_DMA_RX_TX_REQn(base)))
+ {
+ if (handle->txData)
+ {
+ transferConfigB.srcAddr = (uint32_t)(handle->txData);
+ transferConfigB.srcOffset = 1;
+ }
+ else
+ {
+ transferConfigB.srcAddr = (uint32_t)(&handle->txBuffIfNull);
+ transferConfigB.srcOffset = 0;
+ }
+
+ transferConfigB.destAddr = (uint32_t)(&handle->command);
+ transferConfigB.destOffset = 0;
+
+ transferConfigB.srcTransferSize = kEDMA_TransferSize1Bytes;
+
+ if (handle->bitsPerFrame <= 8)
+ {
+ transferConfigB.destTransferSize = kEDMA_TransferSize1Bytes;
+ transferConfigB.minorLoopBytes = 1;
+
+ if (1 == FSL_FEATURE_DSPI_HAS_SEPARATE_DMA_RX_TX_REQn(base))
+ {
+ transferConfigB.majorLoopCounts = handle->remainingSendByteCount - 2;
+ }
+ else
+ {
+ /*Only enable channel_B minorlink to channel_C , so need to add one count due to the last time is
+ majorlink , the majorlink would not trigger the channel_C*/
+ transferConfigB.majorLoopCounts = handle->remainingSendByteCount + 1;
+ }
+ }
+ else
+ {
+ transferConfigB.destTransferSize = kEDMA_TransferSize2Bytes;
+ transferConfigB.minorLoopBytes = 2;
+ if (1 == FSL_FEATURE_DSPI_HAS_SEPARATE_DMA_RX_TX_REQn(base))
+ {
+ transferConfigB.majorLoopCounts = handle->remainingSendByteCount / 2 - 2;
+ }
+ else
+ {
+ /*Only enable channel_B minorlink to channel_C , so need to add one count due to the last time is
+ * majorlink*/
+ transferConfigB.majorLoopCounts = handle->remainingSendByteCount / 2 + 1;
+ }
+ }
+
+ if (1 == FSL_FEATURE_DSPI_HAS_SEPARATE_DMA_RX_TX_REQn(base))
+ {
+ EDMA_SetTransferConfig(handle->edmaTxDataToIntermediaryHandle->base,
+ handle->edmaTxDataToIntermediaryHandle->channel, &transferConfigB, softwareTCD);
+ EDMA_EnableAutoStopRequest(handle->edmaIntermediaryToTxRegHandle->base,
+ handle->edmaIntermediaryToTxRegHandle->channel, false);
+ }
+ else
+ {
+ EDMA_SetTransferConfig(handle->edmaTxDataToIntermediaryHandle->base,
+ handle->edmaTxDataToIntermediaryHandle->channel, &transferConfigB, NULL);
+ }
+ }
+ else
+ {
+ EDMA_SetTransferConfig(handle->edmaTxDataToIntermediaryHandle->base,
+ handle->edmaTxDataToIntermediaryHandle->channel, &transferConfigB, NULL);
+ }
+
+ /***channel_C ***carry the "intermediary" to SPIx_PUSHR. used the edma Scatter Gather function on channel_C to
+ handle the last data */
+
+ edma_transfer_config_t transferConfigC;
+ EDMA_ResetChannel(handle->edmaIntermediaryToTxRegHandle->base, handle->edmaIntermediaryToTxRegHandle->channel);
+
+ /*For DSPI instances with shared RX/TX DMA requests: use the scatter/gather to prepare the last data
+ * (handle->lastCommand) to SPI_PUSHR*/
+ if (((1 != FSL_FEATURE_DSPI_HAS_SEPARATE_DMA_RX_TX_REQn(base)) && (handle->remainingSendByteCount > 0)))
{
transferConfigC.srcAddr = (uint32_t) & (handle->lastCommand);
transferConfigC.destAddr = (uint32_t)txAddr;
@@ -560,7 +780,8 @@
}
if (((handle->remainingSendByteCount > 1) && (handle->bitsPerFrame <= 8)) ||
- ((handle->remainingSendByteCount > 2) && (handle->bitsPerFrame > 8)))
+ ((handle->remainingSendByteCount > 2) && (handle->bitsPerFrame > 8)) ||
+ (1 == FSL_FEATURE_DSPI_HAS_SEPARATE_DMA_RX_TX_REQn(base)))
{
transferConfigC.srcAddr = (uint32_t)(&(handle->command));
transferConfigC.destAddr = (uint32_t)txAddr;
@@ -570,18 +791,28 @@
transferConfigC.srcOffset = 0;
transferConfigC.destOffset = 0;
transferConfigC.minorLoopBytes = 4;
+ if (1 != FSL_FEATURE_DSPI_HAS_SEPARATE_DMA_RX_TX_REQn(base))
+ {
+ if (handle->bitsPerFrame <= 8)
+ {
+ transferConfigC.majorLoopCounts = handle->remainingSendByteCount - 1;
+ }
+ else
+ {
+ transferConfigC.majorLoopCounts = handle->remainingSendByteCount / 2 - 1;
+ }
- if (handle->bitsPerFrame <= 8)
- {
- transferConfigC.majorLoopCounts = handle->remainingSendByteCount - 1;
+ EDMA_SetTransferConfig(handle->edmaIntermediaryToTxRegHandle->base,
+ handle->edmaIntermediaryToTxRegHandle->channel, &transferConfigC, softwareTCD);
}
else
{
- transferConfigC.majorLoopCounts = handle->remainingSendByteCount / 2 - 1;
+ transferConfigC.majorLoopCounts = 1;
+
+ EDMA_SetTransferConfig(handle->edmaIntermediaryToTxRegHandle->base,
+ handle->edmaIntermediaryToTxRegHandle->channel, &transferConfigC, NULL);
}
- EDMA_SetTransferConfig(handle->edmaIntermediaryToTxRegHandle->base,
- handle->edmaIntermediaryToTxRegHandle->channel, &transferConfigC, softwareTCD);
EDMA_EnableAutoStopRequest(handle->edmaIntermediaryToTxRegHandle->base,
handle->edmaIntermediaryToTxRegHandle->channel, false);
}
@@ -653,20 +884,15 @@
&preemption_config_t);
}
- /*Set the channel link.
- For DSPI instances with shared RX/TX DMA requests: Rx DMA request -> channel_A -> channel_B-> channel_C.
- For DSPI instances with separate RX and TX DMA requests:
- Rx DMA request -> channel_A
- Tx DMA request -> channel_C -> channel_B . (so need prepare the first data in "intermediary" before the DMA
- transfer and then channel_B is used to prepare the next data to "intermediary" ) */
+ /*Set the channel link.*/
if (1 == FSL_FEATURE_DSPI_HAS_SEPARATE_DMA_RX_TX_REQn(base))
{
/*if there is Tx DMA request , carry the 32bits data (handle->command) to PUSHR first , then link to channelB
- to prepare the next 32bits data (User_send_buffer to handle->command) */
+ to prepare the next 32bits data (txData to handle->command) */
if (handle->remainingSendByteCount > 1)
{
EDMA_SetChannelLink(handle->edmaIntermediaryToTxRegHandle->base,
- handle->edmaIntermediaryToTxRegHandle->channel, kEDMA_MinorLink,
+ handle->edmaIntermediaryToTxRegHandle->channel, kEDMA_MajorLink,
handle->edmaTxDataToIntermediaryHandle->channel);
}
@@ -686,7 +912,7 @@
DSPI_EnableDMA(base, kDSPI_RxDmaEnable);
}
-
+#endif
DSPI_StartTransfer(base);
return kStatus_Success;
@@ -805,6 +1031,8 @@
return kStatus_DSPI_Busy;
}
+ handle->state = kDSPI_Busy;
+
uint32_t instance = DSPI_GetInstance(base);
uint8_t whichCtar = (transfer->configFlags & DSPI_SLAVE_CTAR_MASK) >> DSPI_SLAVE_CTAR_SHIFT;
handle->bitsPerFrame =
@@ -813,34 +1041,42 @@
/* If using a shared RX/TX DMA request, then this limits the amount of data we can transfer
* due to the linked channel. The max bytes is 511 if 8-bit/frame or 1022 if 16-bit/frame
*/
- if (1 != FSL_FEATURE_DSPI_HAS_SEPARATE_DMA_RX_TX_REQn(base))
+ uint32_t limited_size = 0;
+ if (1 == FSL_FEATURE_DSPI_HAS_SEPARATE_DMA_RX_TX_REQn(base))
+ {
+ limited_size = 32767u;
+ }
+ else
{
- if (handle->bitsPerFrame > 8)
+ limited_size = 511u;
+ }
+
+ if (handle->bitsPerFrame > 8)
+ {
+ if (transfer->dataSize > (limited_size << 1u))
{
- if (transfer->dataSize > 1022)
- {
- return kStatus_DSPI_OutOfRange;
- }
+ handle->state = kDSPI_Idle;
+ return kStatus_DSPI_OutOfRange;
}
- else
+ }
+ else
+ {
+ if (transfer->dataSize > limited_size)
{
- if (transfer->dataSize > 511)
- {
- return kStatus_DSPI_OutOfRange;
- }
+ handle->state = kDSPI_Idle;
+ return kStatus_DSPI_OutOfRange;
}
}
/*The data size should be even if the bitsPerFrame is greater than 8 (that is 2 bytes per frame in dspi) */
if ((handle->bitsPerFrame > 8) && (transfer->dataSize & 0x1))
{
+ handle->state = kDSPI_Idle;
return kStatus_InvalidArgument;
}
EDMA_SetCallback(handle->edmaRxRegToRxDataHandle, EDMA_DspiSlaveCallback, &s_dspiSlaveEdmaPrivateHandle[instance]);
- handle->state = kDSPI_Busy;
-
/* Store transfer information */
handle->txData = transfer->txData;
handle->rxData = transfer->rxData;
@@ -849,7 +1085,7 @@
handle->totalByteCount = transfer->dataSize;
uint16_t wordToSend = 0;
- uint8_t dummyData = DSPI_DUMMY_DATA;
+ uint8_t dummyData = s_dummyData[DSPI_GetInstance(base)];
uint8_t dataAlreadyFed = 0;
uint8_t dataFedMax = 2;
@@ -1003,11 +1239,11 @@
transferConfigC.srcOffset = 0;
if (handle->bitsPerFrame <= 8)
{
- handle->txBuffIfNull = DSPI_DUMMY_DATA;
+ handle->txBuffIfNull = dummyData;
}
else
{
- handle->txBuffIfNull = (DSPI_DUMMY_DATA << 8) | DSPI_DUMMY_DATA;
+ handle->txBuffIfNull = ((uint32_t)dummyData << 8) | dummyData;
}
}
@@ -1106,13 +1342,13 @@
DSPI_DisableDMA((dspiEdmaPrivateHandle->base), kDSPI_RxDmaEnable | kDSPI_TxDmaEnable);
+ dspiEdmaPrivateHandle->handle->state = kDSPI_Idle;
+
if (dspiEdmaPrivateHandle->handle->callback)
{
dspiEdmaPrivateHandle->handle->callback(dspiEdmaPrivateHandle->base, dspiEdmaPrivateHandle->handle,
kStatus_Success, dspiEdmaPrivateHandle->handle->userData);
}
-
- dspiEdmaPrivateHandle->handle->state = kDSPI_Idle;
}
void DSPI_SlaveTransferAbortEDMA(SPI_Type *base, dspi_slave_edma_handle_t *handle)
--- a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/drivers/fsl_dspi_edma.h Thu Aug 03 13:13:39 2017 +0100 +++ b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/drivers/fsl_dspi_edma.h Wed Aug 16 18:27:13 2017 +0100 @@ -1,6 +1,6 @@ /* * Copyright (c) 2015, Freescale Semiconductor, Inc. - * All rights reserved. + * Copyright 2016-2017 NXP * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -12,7 +12,7 @@ * list of conditions and the following disclaimer in the documentation and/or * other materials provided with the distribution. * - * o Neither the name of Freescale Semiconductor, Inc. nor the names of its + * o Neither the name of the copyright holder nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. *
Binary file targets/TARGET_Maxim/TARGET_MAX32610/TOOLCHAIN_ARM_STD/libexactLE.ar has changed
Binary file targets/TARGET_Maxim/TARGET_MAX32610/TOOLCHAIN_GCC_ARM/libexactLE.a has changed
Binary file targets/TARGET_Maxim/TARGET_MAX32610/TOOLCHAIN_IAR/libexactLE.a has changed
Binary file targets/TARGET_Maxim/TARGET_MAX32620/TOOLCHAIN_ARM_STD/libexactLE.ar has changed
Binary file targets/TARGET_Maxim/TARGET_MAX32620/TOOLCHAIN_GCC_ARM/libexactLE.a has changed
Binary file targets/TARGET_Maxim/TARGET_MAX32620/TOOLCHAIN_IAR/libexactLE.a has changed
--- a/targets/TARGET_Maxim/TARGET_MAX32620/sleep.c Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_Maxim/TARGET_MAX32620/sleep.c Wed Aug 16 18:27:13 2017 +0100
@@ -115,7 +115,7 @@
// Deep Sleep is not working properly on Revisions A3 and earlier
if (part_rev <= REVISION_A3) {
- sleep();
+ hal_sleep();
return;
}
@@ -128,7 +128,7 @@
// Do not enter Deep Sleep if connected to VBUS
if (MXC_USB->dev_intfl & MXC_F_USB_DEV_INTFL_VBUS_ST) {
__enable_irq();
- sleep();
+ hal_sleep();
return;
}
--- a/targets/TARGET_Maxim/TARGET_MAX32630/TARGET_MAX32630FTHR/PinNames.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_Maxim/TARGET_MAX32630/TARGET_MAX32630FTHR/PinNames.h Wed Aug 16 18:27:13 2017 +0100
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
+ * Copyright (C) 2016-2017 Maxim Integrated Products, Inc., All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -144,6 +144,10 @@
OWM = P4_0,
// BTLE Module hardwired
+ BT_TX = P0_0,
+ BT_RX = P0_1,
+ BT_RTS = P0_2,
+ BT_CTS = P0_3,
BT_RST = P1_6,
BT_CLK = P1_7,
Binary file targets/TARGET_Maxim/TARGET_MAX32630/TOOLCHAIN_ARM_STD/libexactLE.ar has changed
Binary file targets/TARGET_Maxim/TARGET_MAX32630/TOOLCHAIN_GCC_ARM/libexactLE.a has changed
Binary file targets/TARGET_Maxim/TARGET_MAX32630/TOOLCHAIN_IAR/libexactLE.a has changed
--- a/targets/TARGET_Maxim/TARGET_MAX32630/gpio_api.c Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_Maxim/TARGET_MAX32630/gpio_api.c Wed Aug 16 18:27:13 2017 +0100
@@ -67,6 +67,13 @@
void gpio_mode(gpio_t *obj, PinMode mode)
{
+#ifdef OPEN_DRAIN_LEDS
+ if ((obj->name == LED1) || (obj->name == LED2) ||
+ (obj->name == LED3) || (obj->name == LED4)) {
+ mode = OpenDrain;
+ }
+#endif
+
obj->mode = mode;
pin_mode(obj->name, mode);
}
--- a/targets/TARGET_ONSEMI/TARGET_NCS36510/device/TOOLCHAIN_IAR/NCS36510.icf Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_ONSEMI/TARGET_NCS36510/device/TOOLCHAIN_IAR/NCS36510.icf Wed Aug 16 18:27:13 2017 +0100
@@ -1,49 +1,82 @@
+/*###ICF### Section handled by ICF editor, don't touch! ****/
+/*-Editor annotation file-*/
+/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_1.xml" */
+/*-Specials-*/
+define symbol __ICFEDIT_intvec_start__ = 0x00003000;
+/*-Memory Regions-*/
+define symbol __ICFEDIT_region_IROM1_start__ = 0x00003000; /* FLASHA program start*/
+define symbol __ICFEDIT_region_IROM1_end__ = 0x00051FFF; /* 316K = 320K - 4K(FIB table), FLASHA end */
+define symbol __ICFEDIT_region_IROM2_start__ = 0x00102000;
+define symbol __ICFEDIT_region_IROM2_end__ = 0x00151FFF; /* 320K */
+define symbol __ICFEDIT_region_EROM1_start__ = 0x0;
+define symbol __ICFEDIT_region_EROM1_end__ = 0x0;
+define symbol __ICFEDIT_region_EROM2_start__ = 0x0;
+define symbol __ICFEDIT_region_EROM2_end__ = 0x0;
+define symbol __ICFEDIT_region_EROM3_start__ = 0x0;
+define symbol __ICFEDIT_region_EROM3_end__ = 0x0;
-/* The memory space denoting the maximum possible amount of addressable memory */
-define memory Mem with size = 4G;
+define symbol __ICFEDIT_region_IRAM1_start__ = 0x3FFFC000; /* RAMA start */
+define symbol __ICFEDIT_region_IRAM1_end__ = 0x3FFFFFFF; /* RAMA end */
+define symbol __ICFEDIT_region_IRAM2_start__ = 0x3FFF8000; /* RAMB start */
+define symbol __ICFEDIT_region_IRAM2_end__ = 0x3FFFBFFF; /* RAMB end */
+define symbol __ICFEDIT_region_IRAM3_start__ = 0x3FFF4000; /* RAMC start */
+define symbol __ICFEDIT_region_IRAM3_end__ = 0x3FFF7FFF; /* RAMC end */
+define symbol __ICFEDIT_region_ERAM1_start__ = 0x0;
+define symbol __ICFEDIT_region_ERAM1_end__ = 0x0;
+define symbol __ICFEDIT_region_ERAM2_start__ = 0x0;
+define symbol __ICFEDIT_region_ERAM2_end__ = 0x0;
+define symbol __ICFEDIT_region_ERAM3_start__ = 0x0;
+define symbol __ICFEDIT_region_ERAM3_end__ = 0x0;
-/* Memory regions in an address space */
-define region FLASHA = Mem:[from 0x00003000 size 0x4D000]; /* 308K = 320K - 4K(FIB table) - 8K(Persistent) */
-define region FLASHB = Mem:[from 0x00100000 size 0x50000];
-define region RAMA = Mem:[from 0x3FFFC000 size 0x4000];
-define region RAMB = Mem:[from 0x3FFF8000 size 0x4000];
-/* G2H ZPRO requires RAMC to be enabled */
-define region RAMC = Mem:[from 0x3FFF4000 + 0x90 size 0x4000 - 0x90]; /* 8_byte_aligned(35 vectors * 4 bytes each) = 0x90 */
-define region RAM_ALL = Mem:[from 0x3FFF4000 + 0x90 size 0xC000 - 0x90]; /* 8_byte_aligned(35 vectors * 4 bytes each) = 0x90 */
+/*-Sizes-*/
+define symbol __ICFEDIT_size_cstack__ = 0x200;
+define symbol __ICFEDIT_size_heap__ = 0x4000;
+/**** End of ICF editor section. ###ICF###*/
+
+
+define memory mem with size = 4G;
+define region FLASH_region = mem:[from __ICFEDIT_region_IROM1_start__ to __ICFEDIT_region_IROM1_end__]
+ | mem:[from __ICFEDIT_region_IROM2_start__ to __ICFEDIT_region_IROM2_end__];
+
+define region RAM_VECTOR_region = mem:[from __ICFEDIT_region_IRAM3_start__ to __ICFEDIT_region_IRAM3_start__ + 0x90 - 1];
+
+define region RAM_region = mem:[from __ICFEDIT_region_IRAM3_start__ + 0x90 to __ICFEDIT_region_IRAM3_end__]
+ | mem:[from __ICFEDIT_region_IRAM2_start__ to __ICFEDIT_region_IRAM2_end__]
+ | mem:[from __ICFEDIT_region_IRAM1_start__ to __ICFEDIT_region_IRAM1_end__ - __ICFEDIT_size_cstack__ ];
+
+define region CSTACK_region = mem:[from __ICFEDIT_region_IRAM1_end__ - __ICFEDIT_size_cstack__ + 1 to __ICFEDIT_region_IRAM1_end__];
-/* Create a stack */
-define block CSTACK with size = 0x200, alignment = 8 { };
-/* No Heap is created for C library, all memory management should be handled by the application */
- define block HEAP with alignment = 8, size = 0x3000 { };
+/* Define overlays for MIB's, ths allows view of one MIB from a application level while
+ * MAC and PHY only know about their own MIB */
+define overlay MIBOVERLAY { section MIBSTARTSECTION };
+define overlay MIBOVERLAY { section MIBSECTION };
-/* Handle initialization */
-do not initialize { section .noinit };
+define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
+define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
+define block RAM_VECTORS with alignment = 8, size = 0x90 { };
+
+initialize by copy { readwrite };
-/* Initialize RW sections, exclude zero-initialized sections */
-initialize by copy with packing = none { readwrite };
+if (isdefinedsymbol(__USE_DLIB_PERTHREAD))
+{
+ // Required in a multi-threaded application
+ initialize by copy with packing = none { section __DLIB_PERTHREAD };
+}
/* Initialize the code in RAM, copied over from FLASH */
initialize by copy with packing = none { readonly code section EXECINRAM };
-/*keep { readonly code section .EXECINRAM* } except { readonly code section EXECINRAM };*/
-/* Place startup code at a fixed address */
-place at start of FLASHA { readonly section .intvec, readonly section SWVERSION,readonly section FIBTABLE,readonly section .cstartup };
-
-/* Place code and data */
-
-/* Place constants and initializers in FLASHA: .rodata and .data_init */
-place in FLASHA { readonly };
-
-/* Place .data, .bss, and .noinit */
-/* and STACK */
-/* The relocatable exception table needs to be aligned at 0x0 or multiple of 0x100,
- * hence, place it as first block in RAM.
- */
-place at start of RAM_ALL { section RAM_VECTORS };
-place in RAM_ALL { readonly code section EXECINRAM };
-place at end of RAM_ALL { block CSTACK };
+/*initialize by copy { readwrite };*/
+do not initialize { section .noinit };
-place in RAM_ALL { readwrite };
-place in RAM_ALL { block HEAP };
+place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec, readonly section SWVERSION, readonly section FIBTABLE };
+
+place in FLASH_region { readonly section .cstartup, readonly };
+
+place at start of RAM_VECTOR_region {block RAM_VECTORS};
+
+place in RAM_region { readwrite, block HEAP, section XHEAP, readonly code section EXECINRAM, overlay MIBOVERLAY, readwrite section MIBENDSECTION};
+
+place at end of CSTACK_region { block CSTACK };
--- a/targets/TARGET_STM/TARGET_STM32F0/TARGET_DISCO_F051R8/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F0/TARGET_DISCO_F051R8/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint32_t channel;
-};
-
#include "common_objects.h"
#ifdef __cplusplus
--- a/targets/TARGET_STM/TARGET_STM32F0/TARGET_NUCLEO_F030R8/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F0/TARGET_NUCLEO_F030R8/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint32_t channel;
-};
-
#include "common_objects.h"
#ifdef __cplusplus
--- a/targets/TARGET_STM/TARGET_STM32F0/TARGET_NUCLEO_F031K6/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F0/TARGET_NUCLEO_F031K6/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint32_t channel;
-};
-
#include "common_objects.h"
#ifdef __cplusplus
--- a/targets/TARGET_STM/TARGET_STM32F0/TARGET_NUCLEO_F042K6/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F0/TARGET_NUCLEO_F042K6/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint32_t channel;
-};
-
struct can_s {
CANName can;
int index;
--- a/targets/TARGET_STM/TARGET_STM32F0/TARGET_NUCLEO_F070RB/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F0/TARGET_NUCLEO_F070RB/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint32_t channel;
-};
-
#include "common_objects.h"
#ifdef __cplusplus
--- a/targets/TARGET_STM/TARGET_STM32F0/TARGET_NUCLEO_F072RB/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F0/TARGET_NUCLEO_F072RB/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint32_t channel;
-};
-
struct can_s {
CANName can;
int index;
--- a/targets/TARGET_STM/TARGET_STM32F0/TARGET_NUCLEO_F091RC/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F0/TARGET_NUCLEO_F091RC/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint32_t channel;
-};
-
struct can_s {
CANName can;
int index;
--- a/targets/TARGET_STM/TARGET_STM32F0/analogin_api.c Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F0/analogin_api.c Wed Aug 16 18:27:13 2017 +0100
@@ -36,15 +36,13 @@
#include "PeripheralPins.h"
#include "mbed_error.h"
-ADC_HandleTypeDef AdcHandle;
-
int adc_inited = 0;
void analogin_init(analogin_t *obj, PinName pin) {
// Get the peripheral name from the pin and assign it to the object
- obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
- MBED_ASSERT(obj->adc != (ADCName)NC);
-
+ obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC);
+ MBED_ASSERT(obj->handle.Instance != (ADC_TypeDef *)NC);
+
// Get the functions (adc channel) from the pin and assign it to the object
uint32_t function = pinmap_function(pin, PinMap_ADC);
MBED_ASSERT(function != (uint32_t)NC);
@@ -67,25 +65,25 @@
__ADC1_CLK_ENABLE();
// Configure ADC
- AdcHandle.Instance = (ADC_TypeDef *)(obj->adc);
- AdcHandle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
- AdcHandle.Init.Resolution = ADC_RESOLUTION12b;
- AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
- AdcHandle.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
- AdcHandle.Init.EOCSelection = EOC_SINGLE_CONV;
- AdcHandle.Init.LowPowerAutoWait = DISABLE;
- AdcHandle.Init.LowPowerAutoPowerOff = DISABLE;
- AdcHandle.Init.ContinuousConvMode = DISABLE;
- AdcHandle.Init.DiscontinuousConvMode = DISABLE;
- AdcHandle.Init.ExternalTrigConv = ADC_SOFTWARE_START;
- AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
- AdcHandle.Init.DMAContinuousRequests = DISABLE;
- AdcHandle.Init.Overrun = OVR_DATA_OVERWRITTEN;
- if (HAL_ADC_Init(&AdcHandle) != HAL_OK) {
+ obj->handle.State = HAL_ADC_STATE_RESET;
+ obj->handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
+ obj->handle.Init.Resolution = ADC_RESOLUTION12b;
+ obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
+ obj->handle.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
+ obj->handle.Init.EOCSelection = EOC_SINGLE_CONV;
+ obj->handle.Init.LowPowerAutoWait = DISABLE;
+ obj->handle.Init.LowPowerAutoPowerOff = DISABLE;
+ obj->handle.Init.ContinuousConvMode = DISABLE;
+ obj->handle.Init.DiscontinuousConvMode = DISABLE;
+ obj->handle.Init.ExternalTrigConv = ADC_SOFTWARE_START;
+ obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
+ obj->handle.Init.DMAContinuousRequests = DISABLE;
+ obj->handle.Init.Overrun = OVR_DATA_OVERWRITTEN;
+ if (HAL_ADC_Init(&obj->handle) != HAL_OK) {
error("Cannot initialize ADC");
}
// Run the ADC calibration
- if (HAL_ADCEx_Calibration_Start(&AdcHandle) != HAL_OK) {
+ if (HAL_ADCEx_Calibration_Start(&obj->handle) != HAL_OK) {
error("Cannot Start ADC_Calibration");
}
}
@@ -94,8 +92,6 @@
static inline uint16_t adc_read(analogin_t *obj) {
ADC_ChannelConfTypeDef sConfig;
- AdcHandle.Instance = (ADC_TypeDef *)(obj->adc);
-
// Configure ADC channel
sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
#if defined (TARGET_STM32F091RC)
@@ -169,15 +165,15 @@
}
// Clear all channels as it is not done in HAL_ADC_ConfigChannel()
- AdcHandle.Instance->CHSELR = 0;
+ obj->handle.Instance->CHSELR = 0;
- HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
+ HAL_ADC_ConfigChannel(&obj->handle, &sConfig);
- HAL_ADC_Start(&AdcHandle); // Start conversion
+ HAL_ADC_Start(&obj->handle); // Start conversion
// Wait end of conversion and get value
- if (HAL_ADC_PollForConversion(&AdcHandle, 10) == HAL_OK) {
- return (HAL_ADC_GetValue(&AdcHandle));
+ if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) {
+ return (HAL_ADC_GetValue(&obj->handle));
} else {
return 0;
}
--- a/targets/TARGET_STM/TARGET_STM32F0/common_objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F0/common_objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -111,6 +111,12 @@
#endif
};
+struct analogin_s {
+ ADC_HandleTypeDef handle;
+ PinName pin;
+ uint8_t channel;
+};
+
#include "gpio_object.h"
#if DEVICE_ANALOGOUT
--- a/targets/TARGET_STM/TARGET_STM32F1/TARGET_BLUEPILL_F103C8/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F1/TARGET_BLUEPILL_F103C8/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint8_t channel;
-};
-
struct can_s {
CANName can;
int index;
--- a/targets/TARGET_STM/TARGET_STM32F1/TARGET_DISCO_F100RB/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F1/TARGET_DISCO_F100RB/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint8_t channel;
-};
-
#include "common_objects.h"
#ifdef __cplusplus
--- a/targets/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint8_t channel;
-};
-
struct can_s {
CANName can;
int index;
--- a/targets/TARGET_STM/TARGET_STM32F1/analogin_api.c Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F1/analogin_api.c Wed Aug 16 18:27:13 2017 +0100
@@ -35,8 +35,6 @@
#include "pinmap.h"
#include "PeripheralPins.h"
-ADC_HandleTypeDef AdcHandle;
-
int adc_inited = 0;
void analogin_init(analogin_t *obj, PinName pin)
@@ -44,9 +42,9 @@
RCC_PeriphCLKInitTypeDef PeriphClkInit;
// Get the peripheral name from the pin and assign it to the object
- obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
- MBED_ASSERT(obj->adc != (ADCName)NC);
-
+ obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC);
+ MBED_ASSERT(obj->handle.Instance != (ADC_TypeDef *)NC);
+
// Get the functions (adc channel) from the pin and assign it to the object
uint32_t function = pinmap_function(pin, PinMap_ADC);
MBED_ASSERT(function != (uint32_t)NC);
@@ -79,15 +77,15 @@
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
// Configure ADC
- AdcHandle.Instance = (ADC_TypeDef *)(obj->adc);
- AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
- AdcHandle.Init.ScanConvMode = DISABLE;
- AdcHandle.Init.ContinuousConvMode = DISABLE;
- AdcHandle.Init.NbrOfConversion = 1;
- AdcHandle.Init.DiscontinuousConvMode = DISABLE;
- AdcHandle.Init.NbrOfDiscConversion = 0;
- AdcHandle.Init.ExternalTrigConv = ADC_SOFTWARE_START;
- HAL_ADC_Init(&AdcHandle);
+ obj->handle.State = HAL_ADC_STATE_RESET;
+ obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
+ obj->handle.Init.ScanConvMode = DISABLE;
+ obj->handle.Init.ContinuousConvMode = DISABLE;
+ obj->handle.Init.NbrOfConversion = 1;
+ obj->handle.Init.DiscontinuousConvMode = DISABLE;
+ obj->handle.Init.NbrOfDiscConversion = 0;
+ obj->handle.Init.ExternalTrigConv = ADC_SOFTWARE_START;
+ HAL_ADC_Init(&obj->handle);
}
}
@@ -95,8 +93,6 @@
{
ADC_ChannelConfTypeDef sConfig;
- AdcHandle.Instance = (ADC_TypeDef *)(obj->adc);
-
// Configure ADC channel
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_7CYCLES_5;
@@ -160,13 +156,13 @@
return 0;
}
- HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
+ HAL_ADC_ConfigChannel(&obj->handle, &sConfig);
- HAL_ADC_Start(&AdcHandle); // Start conversion
+ HAL_ADC_Start(&obj->handle); // Start conversion
// Wait end of conversion and get value
- if (HAL_ADC_PollForConversion(&AdcHandle, 10) == HAL_OK) {
- return (HAL_ADC_GetValue(&AdcHandle));
+ if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) {
+ return (HAL_ADC_GetValue(&obj->handle));
} else {
return 0;
}
--- a/targets/TARGET_STM/TARGET_STM32F1/common_objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F1/common_objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -110,6 +110,12 @@
#endif
};
+struct analogin_s {
+ ADC_HandleTypeDef handle;
+ PinName pin;
+ uint8_t channel;
+};
+
#include "gpio_object.h"
#ifdef __cplusplus
--- a/targets/TARGET_STM/TARGET_STM32F2/analogin_api.c Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F2/analogin_api.c Wed Aug 16 18:27:13 2017 +0100
@@ -36,12 +36,9 @@
#include "mbed_error.h"
#include "PeripheralPins.h"
-ADC_HandleTypeDef AdcHandle;
-
void analogin_init(analogin_t *obj, PinName pin)
{
uint32_t function = (uint32_t)NC;
- obj->adc = (ADCName)NC;
#if defined(ADC1)
static int adc1_inited = 0;
@@ -58,18 +55,18 @@
if ((pin < 0xF0) || (pin >= 0x100)) {
// Normal channels
// Get the peripheral name from the pin and assign it to the object
- obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
+ obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC);
// Get the functions (adc channel) from the pin and assign it to the object
function = pinmap_function(pin, PinMap_ADC);
// Configure GPIO
pinmap_pinout(pin, PinMap_ADC);
} else {
// Internal channels
- obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC_Internal);
+ obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC_Internal);
function = pinmap_function(pin, PinMap_ADC_Internal);
// No GPIO configuration for internal channels
}
- MBED_ASSERT(obj->adc != (ADCName)NC);
+ MBED_ASSERT(obj->handle.Instance != (ADC_TypeDef *)NC);
MBED_ASSERT(function != (uint32_t)NC);
obj->channel = STM_PIN_CHANNEL(function);
@@ -80,41 +77,41 @@
// Check if ADC is already initialized
// Enable ADC clock
#if defined(ADC1)
- if ((obj->adc == ADC_1) && adc1_inited) return;
- if (obj->adc == ADC_1) {
+ if (((ADCName)obj->handle.Instance == ADC_1) && adc1_inited) return;
+ if ((ADCName)obj->handle.Instance == ADC_1) {
__ADC1_CLK_ENABLE();
adc1_inited = 1;
}
#endif
#if defined(ADC2)
- if ((obj->adc == ADC_2) && adc2_inited) return;
- if (obj->adc == ADC_2) {
+ if (((ADCName)obj->handle.Instance == ADC_2) && adc2_inited) return;
+ if ((ADCName)obj->handle.Instance == ADC_2) {
__ADC2_CLK_ENABLE();
adc2_inited = 1;
}
#endif
#if defined(ADC3)
- if ((obj->adc == ADC_3) && adc3_inited) return;
- if (obj->adc == ADC_3) {
+ if (((ADCName)obj->handle.Instance == ADC_3) && adc3_inited) return;
+ if ((ADCName)obj->handle.Instance == ADC_3) {
__ADC3_CLK_ENABLE();
adc3_inited = 1;
}
#endif
// Configure ADC
- AdcHandle.Instance = (ADC_TypeDef *)(obj->adc);
- AdcHandle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV2;
- AdcHandle.Init.Resolution = ADC_RESOLUTION12b;
- AdcHandle.Init.ScanConvMode = DISABLE;
- AdcHandle.Init.ContinuousConvMode = DISABLE;
- AdcHandle.Init.DiscontinuousConvMode = DISABLE;
- AdcHandle.Init.NbrOfDiscConversion = 0;
- AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
- AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
- AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
- AdcHandle.Init.NbrOfConversion = 1;
- AdcHandle.Init.DMAContinuousRequests = DISABLE;
- AdcHandle.Init.EOCSelection = DISABLE;
- if (HAL_ADC_Init(&AdcHandle) != HAL_OK) {
+ obj->handle.State = HAL_ADC_STATE_RESET;
+ obj->handle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV2;
+ obj->handle.Init.Resolution = ADC_RESOLUTION12b;
+ obj->handle.Init.ScanConvMode = DISABLE;
+ obj->handle.Init.ContinuousConvMode = DISABLE;
+ obj->handle.Init.DiscontinuousConvMode = DISABLE;
+ obj->handle.Init.NbrOfDiscConversion = 0;
+ obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
+ obj->handle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
+ obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
+ obj->handle.Init.NbrOfConversion = 1;
+ obj->handle.Init.DMAContinuousRequests = DISABLE;
+ obj->handle.Init.EOCSelection = DISABLE;
+ if (HAL_ADC_Init(&obj->handle) != HAL_OK) {
error("Cannot initialize ADC\n");
}
}
@@ -123,8 +120,6 @@
{
ADC_ChannelConfTypeDef sConfig = {0};
- AdcHandle.Instance = (ADC_TypeDef *)(obj->adc);
-
// Configure ADC channel
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
@@ -192,13 +187,13 @@
return 0;
}
- HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
+ HAL_ADC_ConfigChannel(&obj->handle, &sConfig);
- HAL_ADC_Start(&AdcHandle); // Start conversion
+ HAL_ADC_Start(&obj->handle); // Start conversion
// Wait end of conversion and get value
- if (HAL_ADC_PollForConversion(&AdcHandle, 10) == HAL_OK) {
- return (HAL_ADC_GetValue(&AdcHandle));
+ if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) {
+ return (HAL_ADC_GetValue(&obj->handle));
} else {
return 0;
}
--- a/targets/TARGET_STM/TARGET_STM32F2/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F2/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -55,7 +55,7 @@
};
struct analogin_s {
- ADCName adc;
+ ADC_HandleTypeDef handle;
PinName pin;
uint8_t channel;
};
--- a/targets/TARGET_STM/TARGET_STM32F3/TARGET_STM32F302x8/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F3/TARGET_STM32F302x8/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint32_t channel;
-};
-
struct can_s {
CANName can;
int index;
--- a/targets/TARGET_STM/TARGET_STM32F3/TARGET_STM32F303x8/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F3/TARGET_STM32F303x8/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint32_t channel;
-};
-
struct can_s {
CANName can;
int index;
--- a/targets/TARGET_STM/TARGET_STM32F3/TARGET_STM32F303xC/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F3/TARGET_STM32F303xC/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,13 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint32_t channel;
- DAC_HandleTypeDef handle;
-};
-
struct can_s {
CANName can;
int index;
--- a/targets/TARGET_STM/TARGET_STM32F3/TARGET_STM32F303xE/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F3/TARGET_STM32F303xE/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint32_t channel;
-};
-
struct can_s {
CANName can;
int index;
--- a/targets/TARGET_STM/TARGET_STM32F3/TARGET_STM32F334x8/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F3/TARGET_STM32F334x8/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint32_t channel;
-};
-
#if defined (DEVICE_CAN)
struct can_s {
CANName can;
--- a/targets/TARGET_STM/TARGET_STM32F3/analogin_api.c Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F3/analogin_api.c Wed Aug 16 18:27:13 2017 +0100
@@ -36,7 +36,6 @@
#include "mbed_error.h"
#include "PeripheralPins.h"
-ADC_HandleTypeDef AdcHandle;
void analogin_init(analogin_t *obj, PinName pin)
{
@@ -54,8 +53,8 @@
#endif
// Get the peripheral name from the pin and assign it to the object
- obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
- MBED_ASSERT(obj->adc != (ADCName)NC);
+ obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC);
+ MBED_ASSERT(obj->handle.Instance != (ADC_TypeDef *)NC);
// Get the pin function and assign the used channel to the object
uint32_t function = pinmap_function(pin, PinMap_ADC);
@@ -74,56 +73,52 @@
// Check if ADC is already initialized
// Enable ADC clock
#if defined(ADC1)
- if ((obj->adc == ADC_1) && adc1_inited) return;
- if (obj->adc == ADC_1) {
- AdcHandle.State = HAL_ADC_STATE_RESET;
+ if (((ADCName)obj->handle.Instance == ADC_1) && adc1_inited) return;
+ if ((ADCName)obj->handle.Instance == ADC_1) {
__ADC1_CLK_ENABLE();
adc1_inited = 1;
}
#endif
#if defined(ADC2)
- if ((obj->adc == ADC_2) && adc2_inited) return;
- if (obj->adc == ADC_2) {
- AdcHandle.State = HAL_ADC_STATE_RESET;
+ if (((ADCName)obj->handle.Instance == ADC_2) && adc2_inited) return;
+ if ((ADCName)obj->handle.Instance == ADC_2) {
__ADC2_CLK_ENABLE();
adc2_inited = 1;
}
#endif
#if defined(ADC3)
- if ((obj->adc == ADC_3) && adc3_inited) return;
- if (obj->adc == ADC_3) {
- AdcHandle.State = HAL_ADC_STATE_RESET;
+ if (((ADCName)obj->handle.Instance == ADC_3) && adc3_inited) return;
+ if ((ADCName)obj->handle.Instance == ADC_3) {
__ADC34_CLK_ENABLE();
adc3_inited = 1;
}
#endif
#if defined(ADC4)
- if ((obj->adc == ADC_4) && adc4_inited) return;
- if (obj->adc == ADC_4) {
- AdcHandle.State = HAL_ADC_STATE_RESET;
+ if (((ADCName)obj->handle.Instance == ADC_4) && adc4_inited) return;
+ if ((ADCName)obj->handle.Instance == ADC_4) {
__ADC34_CLK_ENABLE();
adc4_inited = 1;
}
#endif
// Configure ADC
- AdcHandle.Instance = (ADC_TypeDef *)(obj->adc);
- AdcHandle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV2;
- AdcHandle.Init.Resolution = ADC_RESOLUTION12b;
- AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
- AdcHandle.Init.ScanConvMode = DISABLE;
- AdcHandle.Init.EOCSelection = EOC_SINGLE_CONV;
- AdcHandle.Init.LowPowerAutoWait = DISABLE;
- AdcHandle.Init.ContinuousConvMode = DISABLE;
- AdcHandle.Init.NbrOfConversion = 1;
- AdcHandle.Init.DiscontinuousConvMode = DISABLE;
- AdcHandle.Init.NbrOfDiscConversion = 0;
- AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
- AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
- AdcHandle.Init.DMAContinuousRequests = DISABLE;
- AdcHandle.Init.Overrun = OVR_DATA_OVERWRITTEN;
+ obj->handle.State = HAL_ADC_STATE_RESET;
+ obj->handle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV2;
+ obj->handle.Init.Resolution = ADC_RESOLUTION12b;
+ obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
+ obj->handle.Init.ScanConvMode = DISABLE;
+ obj->handle.Init.EOCSelection = EOC_SINGLE_CONV;
+ obj->handle.Init.LowPowerAutoWait = DISABLE;
+ obj->handle.Init.ContinuousConvMode = DISABLE;
+ obj->handle.Init.NbrOfConversion = 1;
+ obj->handle.Init.DiscontinuousConvMode = DISABLE;
+ obj->handle.Init.NbrOfDiscConversion = 0;
+ obj->handle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
+ obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
+ obj->handle.Init.DMAContinuousRequests = DISABLE;
+ obj->handle.Init.Overrun = OVR_DATA_OVERWRITTEN;
- if (HAL_ADC_Init(&AdcHandle) != HAL_OK) {
+ if (HAL_ADC_Init(&obj->handle) != HAL_OK) {
error("Cannot initialize ADC");
}
}
@@ -132,8 +127,6 @@
{
ADC_ChannelConfTypeDef sConfig = {0};
- AdcHandle.Instance = (ADC_TypeDef *)(obj->adc);
-
// Configure ADC channel
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_19CYCLES_5;
@@ -200,13 +193,13 @@
return 0;
}
- HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
+ HAL_ADC_ConfigChannel(&obj->handle, &sConfig);
- HAL_ADC_Start(&AdcHandle); // Start conversion
+ HAL_ADC_Start(&obj->handle); // Start conversion
// Wait end of conversion and get value
- if (HAL_ADC_PollForConversion(&AdcHandle, 10) == HAL_OK) {
- return (HAL_ADC_GetValue(&AdcHandle));
+ if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) {
+ return (HAL_ADC_GetValue(&obj->handle));
} else {
return 0;
}
--- a/targets/TARGET_STM/TARGET_STM32F3/common_objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F3/common_objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -118,6 +118,12 @@
DAC_HandleTypeDef handle;
};
+struct analogin_s {
+ ADC_HandleTypeDef handle;
+ PinName pin;
+ uint8_t channel;
+};
+
#include "gpio_object.h"
#ifdef __cplusplus
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_MTS_DRAGONFLY_F411RE/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_MTS_DRAGONFLY_F411RE/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint8_t channel;
-};
-
#include "common_objects.h"
#ifdef __cplusplus
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_MTS_MDOT_F405RG/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_MTS_MDOT_F405RG/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint8_t channel;
-};
-
#include "common_objects.h"
#ifdef __cplusplus
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_MTS_MDOT_F411RE/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_MTS_MDOT_F411RE/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint8_t channel;
-};
-
#include "common_objects.h"
#ifdef __cplusplus
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F401xC/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F401xC/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint8_t channel;
-};
-
#include "common_objects.h"
#ifdef __cplusplus
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F401xE/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F401xE/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint8_t channel;
-};
-
#include "common_objects.h"
#ifdef __cplusplus
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F407xG/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F407xG/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint8_t channel;
-};
-
#include "common_objects.h"
#ifdef __cplusplus
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F410xB/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F410xB/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint8_t channel;
-};
-
struct trng_s {
RNG_HandleTypeDef handle;
};
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F411xE/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F411xE/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint8_t channel;
-};
-
#include "common_objects.h"
#ifdef __cplusplus
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F412xG/TARGET_NUCLEO_F412ZG/system_clock.c Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F412xG/TARGET_NUCLEO_F412ZG/system_clock.c Wed Aug 16 18:27:13 2017 +0100
@@ -30,6 +30,7 @@
**/
#include "stm32f4xx.h"
+#include "nvic_addr.h"
#include "mbed_assert.h"
/*!< Uncomment the following line if you need to relocate your vector Table in
@@ -92,7 +93,7 @@
#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#else
- SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
+ SCB->VTOR = NVIC_FLASH_VECTOR_ADDRESS; /* Vector Table Relocation in Internal FLASH */
#endif
}
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F412xG/device/TOOLCHAIN_ARM_MICRO/stm32f412xg.sct Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F412xG/device/TOOLCHAIN_ARM_MICRO/stm32f412xg.sct Wed Aug 16 18:27:13 2017 +0100
@@ -1,6 +1,7 @@
+#! armcc -E
; Scatter-Loading Description File
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-; Copyright (c) 2016, STMicroelectronics
+; Copyright (c) 2017, STMicroelectronics
; All rights reserved.
;
; Redistribution and use in source and binary forms, with or without
@@ -27,10 +28,18 @@
; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+#if !defined(MBED_APP_START)
+ #define MBED_APP_START 0x08000000
+#endif
+
+#if !defined(MBED_APP_SIZE)
+ #define MBED_APP_SIZE 0x100000
+#endif
+
; STM32F412ZG: 1024 KB FLASH (0x100000) + 256 KB SRAM (0x40000)
-LR_IROM1 0x08000000 0x100000 { ; load region size_region
+LR_IROM1 MBED_APP_START MBED_APP_SIZE { ; load region size_region
- ER_IROM1 0x08000000 0x100000 { ; load address = execution address
+ ER_IROM1 MBED_APP_START MBED_APP_SIZE { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F412xG/device/TOOLCHAIN_ARM_STD/stm32f412xg.sct Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F412xG/device/TOOLCHAIN_ARM_STD/stm32f412xg.sct Wed Aug 16 18:27:13 2017 +0100
@@ -1,6 +1,7 @@
+#! armcc -E
; Scatter-Loading Description File
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-; Copyright (c) 2016, STMicroelectronics
+; Copyright (c) 2017, STMicroelectronics
; All rights reserved.
;
; Redistribution and use in source and binary forms, with or without
@@ -27,10 +28,18 @@
; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+#if !defined(MBED_APP_START)
+ #define MBED_APP_START 0x08000000
+#endif
+
+#if !defined(MBED_APP_SIZE)
+ #define MBED_APP_SIZE 0x100000
+#endif
+
; STM32F412ZG: 1024 KB FLASH (0x100000) + 256 KB SRAM (0x40000)
-LR_IROM1 0x08000000 0x100000 { ; load region size_region
+LR_IROM1 MBED_APP_START MBED_APP_SIZE { ; load region size_region
- ER_IROM1 0x08000000 0x100000 { ; load address = execution address
+ ER_IROM1 MBED_APP_START MBED_APP_SIZE { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F412xG/device/TOOLCHAIN_GCC_ARM/STM32F412xG.ld Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F412xG/device/TOOLCHAIN_GCC_ARM/STM32F412xG.ld Wed Aug 16 18:27:13 2017 +0100
@@ -1,7 +1,14 @@
+#if !defined(MBED_APP_START)
+ #define MBED_APP_START 0x08000000
+#endif
+
+#if !defined(MBED_APP_SIZE)
+ #define MBED_APP_SIZE 1024K
+#endif
/* Linker script to configure memory regions. */
MEMORY
{
- FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K
+ FLASH (rx) : ORIGIN = MBED_APP_START, LENGTH = MBED_APP_SIZE
RAM (rwx) : ORIGIN = 0x200001C4, LENGTH = 256K - 0x1C4
}
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F412xG/device/TOOLCHAIN_IAR/stm32f412xx.icf Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F412xG/device/TOOLCHAIN_IAR/stm32f412xx.icf Wed Aug 16 18:27:13 2017 +0100
@@ -1,7 +1,10 @@
+if (!isdefinedsymbol(MBED_APP_START)) { define symbol MBED_APP_START = 0x08000000; }
+if (!isdefinedsymbol(MBED_APP_SIZE)) { define symbol MBED_APP_SIZE = 0x100000; }
+
/* [ROM = 1024kb = 0x100000] */
-define symbol __intvec_start__ = 0x08000000;
-define symbol __region_ROM_start__ = 0x08000000;
-define symbol __region_ROM_end__ = 0x080FFFFF;
+define symbol __intvec_start__ = MBED_APP_START;
+define symbol __region_ROM_start__ = MBED_APP_START;
+define symbol __region_ROM_end__ = MBED_APP_START + MBED_APP_SIZE;
/* [RAM = 256kb = 0x40000] Vector table dynamic copy: 113 vectors = 452 bytes (0x1C4) to be reserved in RAM */
define symbol __NVIC_start__ = 0x20000000;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F412xG/device/flash_data.h Wed Aug 16 18:27:13 2017 +0100 @@ -0,0 +1,59 @@ +/* mbed Microcontroller Library + ******************************************************************************* + * Copyright (c) 2016, STMicroelectronics + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ +#ifndef MBED_FLASH_DATA_H +#define MBED_FLASH_DATA_H + +#include "device.h" +#include <stdint.h> + +#if DEVICE_FLASH + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Flash size */ +#define FLASH_SIZE (uint32_t) 0x100000 + +/* Base address of the Flash sectors Bank 1 */ +#define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000) /* Base @ of Sector 0, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_1 ((uint32_t)0x08004000) /* Base @ of Sector 1, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_2 ((uint32_t)0x08008000) /* Base @ of Sector 2, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_3 ((uint32_t)0x0800C000) /* Base @ of Sector 3, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_4 ((uint32_t)0x08010000) /* Base @ of Sector 4, 64 Kbytes */ +#define ADDR_FLASH_SECTOR_5 ((uint32_t)0x08020000) /* Base @ of Sector 5, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_6 ((uint32_t)0x08040000) /* Base @ of Sector 6, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_7 ((uint32_t)0x08060000) /* Base @ of Sector 7, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_8 ((uint32_t)0x08080000) /* Base @ of Sector 8, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_9 ((uint32_t)0x080A0000) /* Base @ of Sector 9, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_10 ((uint32_t)0x080C0000) /* Base @ of Sector 10, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_11 ((uint32_t)0x080E0000) /* Base @ of Sector 11, 128 Kbytes */ + +#endif +#endif
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F412xG/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F412xG/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -40,12 +40,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint8_t channel;
-};
-
struct can_s {
CANName can;
int index;
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F413xH/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F413xH/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -40,12 +40,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint8_t channel;
-};
-
struct can_s {
CANName can;
int index;
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F429xI/device/flash_api.c Thu Aug 03 13:13:39 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,191 +0,0 @@
-/* mbed Microcontroller Library
- *******************************************************************************
- * Copyright (c) 2017, STMicroelectronics
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. Neither the name of STMicroelectronics nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *******************************************************************************
- */
-
-#include "flash_api.h"
-#include "flash_data.h"
-#include "platform/mbed_critical.h"
-
-// This file is automatically generated
-
-#if DEVICE_FLASH
-
-#if defined (STM32F429xx) || defined (STM32F439xx)
-#define FLASH_SIZE (uint32_t) 0x200000
-#endif
-
-static uint32_t GetSector(uint32_t Address);
-static uint32_t GetSectorSize(uint32_t Sector);
-
-int32_t flash_init(flash_t *obj)
-{
- /* Allow Access to Flash control registers and user Falsh */
- if (HAL_FLASH_Unlock()) {
- return -1;
- } else {
- return 0;
- }
-}
-int32_t flash_free(flash_t *obj)
-{
- /* Disable the Flash option control register access (recommended to protect
- the option Bytes against possible unwanted operations) */
- if (HAL_FLASH_Lock()) {
- return -1;
- } else {
- return 0;
- }
-}
-int32_t flash_erase_sector(flash_t *obj, uint32_t address)
-{
- /*Variable used for Erase procedure*/
- static FLASH_EraseInitTypeDef EraseInitStruct;
- uint32_t FirstSector;
- uint32_t SectorError = 0;
-
- if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
-
- return -1;
- }
-
- /* Get the 1st sector to erase */
- FirstSector = GetSector(address);
-
- /* Fill EraseInit structure*/
- EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;
- EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;
- EraseInitStruct.Sector = FirstSector;
- EraseInitStruct.NbSectors = 1;
- if(HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError) != HAL_OK){
- return -1;
- } else {
- return 0;
- }
-}
-
-int32_t flash_program_page(flash_t *obj, uint32_t address, const uint8_t *data, uint32_t size)
-{
-
- if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
- return -1;
- }
-
- /* Note: If an erase operation in Flash memory also concerns data in the data or instruction cache,
- you have to make sure that these data are rewritten before they are accessed during code
- execution. If this cannot be done safely, it is recommended to flush the caches by setting the
- DCRST and ICRST bits in the FLASH_CR register. */
- __HAL_FLASH_DATA_CACHE_DISABLE();
- __HAL_FLASH_INSTRUCTION_CACHE_DISABLE();
-
- __HAL_FLASH_DATA_CACHE_RESET();
- __HAL_FLASH_INSTRUCTION_CACHE_RESET();
-
- __HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
- __HAL_FLASH_DATA_CACHE_ENABLE();
-
- while (size > 0) {
- if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, address, (uint64_t)*data) != HAL_OK) {
- return -1;
- } else {
- size--;
- address++;
- data++;
- }
- }
- return 0;
-}
-
-uint32_t flash_get_sector_size(const flash_t *obj, uint32_t address)
-{
-
- if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
- return MBED_FLASH_INVALID_SIZE;
- }
-
- return (GetSectorSize(GetSector(address)));
-}
-
-uint32_t flash_get_page_size(const flash_t *obj)
-{
- // not applicable for STM32F4
- return (0x4000); // minimum sector size
-}
-uint32_t flash_get_start_address(const flash_t *obj)
-{
- return FLASH_BASE;
-}
-uint32_t flash_get_size(const flash_t *obj)
-{
- return FLASH_SIZE;
-}
-
-/**
- * @brief Gets the sector of a given address
- * @param None
- * @retval The sector of a given address
- */
-static uint32_t GetSector(uint32_t address)
-{
- uint32_t sector = 0;
- uint32_t tmp = address - ADDR_FLASH_SECTOR_0;
- if (address & 0x100000) { // handle 2nd bank
- sector = FLASH_SECTOR_12;
- tmp = address - ADDR_FLASH_SECTOR_12;
- }
- if (address < ADDR_FLASH_SECTOR_4) { // 16k sectorsize
- sector += tmp >>14;
- } else if (address < ADDR_FLASH_SECTOR_5) { //64k sector size
- sector += FLASH_SECTOR_4;
- } else {
- sector += 4 + (tmp >>17);
- }
- return sector;
-}
-
-/**
- * @brief Gets sector Size
- * @param None
- * @retval The size of a given sector
- */
-static uint32_t GetSectorSize(uint32_t Sector)
-{
- uint32_t sectorsize = 0x00;
- if((Sector == FLASH_SECTOR_0) || (Sector == FLASH_SECTOR_1) || (Sector == FLASH_SECTOR_2) ||\
- (Sector == FLASH_SECTOR_3) || (Sector == FLASH_SECTOR_12) || (Sector == FLASH_SECTOR_13) ||\
- (Sector == FLASH_SECTOR_14) || (Sector == FLASH_SECTOR_15)) {
- sectorsize = 16 * 1024;
- } else if((Sector == FLASH_SECTOR_4) || (Sector == FLASH_SECTOR_16)) {
- sectorsize = 64 * 1024;
- } else {
- sectorsize = 128 * 1024;
- }
- return sectorsize;
-}
-
-#endif
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F429xI/device/flash_data.h Thu Aug 03 13:13:39 2017 +0100 +++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F429xI/device/flash_data.h Wed Aug 16 18:27:13 2017 +0100 @@ -38,6 +38,9 @@ /* Exported types ------------------------------------------------------------*/ /* Exported constants --------------------------------------------------------*/ /* Exported macro ------------------------------------------------------------*/ +/* FLASH SIZE */ +#define FLASH_SIZE (uint32_t) 0x200000 + /* Base address of the Flash sectors Bank 1 */ #define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000) /* Base @ of Sector 0, 16 Kbytes */ #define ADDR_FLASH_SECTOR_1 ((uint32_t)0x08004000) /* Base @ of Sector 1, 16 Kbytes */
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F429xI/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F429xI/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint8_t channel;
-};
-
struct can_s {
CANName can;
int index;
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F437xG/TARGET_UBLOX_C030/system_clock.c Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F437xG/TARGET_UBLOX_C030/system_clock.c Wed Aug 16 18:27:13 2017 +0100
@@ -34,6 +34,7 @@
#include "ublox_low_level_api.h"
#include "stm32f4xx.h"
+#include "nvic_addr.h"
/*!< Uncomment the following line if you need to relocate your vector Table in
Internal SRAM. */
@@ -89,7 +90,7 @@
#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#else
- SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
+ SCB->VTOR = NVIC_FLASH_VECTOR_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif
ublox_board_init();
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F437xG/device/TOOLCHAIN_ARM_STD/stm32f437xx.sct Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F437xG/device/TOOLCHAIN_ARM_STD/stm32f437xx.sct Wed Aug 16 18:27:13 2017 +0100
@@ -29,9 +29,18 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 1 MB FLASH (0x100000) + 192 KB SRAM (0x30000) + 64 KB CCBRAM (0x10000)+ 4 KB BKPSRAM
-LR_IROM1 0x08000000 0x100000 { ; load region size_region
+
+#if !defined(MBED_APP_START)
+ #define MBED_APP_START 0x08000000
+#endif
- ER_IROM1 0x08000000 0x100000 { ; load address = execution address
+#if !defined(MBED_APP_SIZE)
+ #define MBED_APP_SIZE 0x100000
+#endif
+
+LR_IROM1 MBED_APP_START MBED_APP_SIZE { ; load region size_region
+
+ ER_IROM1 MBED_APP_START MBED_APP_SIZE { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F437xG/device/TOOLCHAIN_GCC_ARM/STM32F437xx.ld Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F437xG/device/TOOLCHAIN_GCC_ARM/STM32F437xx.ld Wed Aug 16 18:27:13 2017 +0100
@@ -1,10 +1,18 @@
+#if !defined(MBED_APP_START)
+ #define MBED_APP_START 0x08000000
+#endif
+
+#if !defined(MBED_APP_SIZE)
+ #define MBED_APP_SIZE 1024k
+#endif
+
/* Linker script to configure memory regions. */
MEMORY
{
RAM (xrw) : ORIGIN = 0x200001AC, LENGTH = 192K - 0x1AC /* 0x1AC is to leave room for vectors */
CCM_RAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K
BACKUP_SRAM (rw) : ORIGIN = 0x40024000, LENGTH = 4096
-FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K
+FLASH (rx) : ORIGIN = MBED_APP_START, LENGTH = MBED_APP_SIZE
}
/* Linker script to place sections and symbol values. Should be used together
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F437xG/device/TOOLCHAIN_IAR/stm32f437xx.icf Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F437xG/device/TOOLCHAIN_IAR/stm32f437xx.icf Wed Aug 16 18:27:13 2017 +0100
@@ -1,11 +1,13 @@
/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
+if (!isdefinedsymbol(MBED_APP_START)) { define symbol MBED_APP_START = 0x08000000; }
+if (!isdefinedsymbol(MBED_APP_SIZE)) { define symbol MBED_APP_SIZE = 0x100000; }
/*-Specials-*/
-define symbol __ICFEDIT_intvec_start__ = 0x08000000;
+define symbol __ICFEDIT_intvec_start__ = MBED_APP_START;
/*-Memory Regions-*/
-define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
-define symbol __ICFEDIT_region_ROM_end__ = 0x080FFFFF;
+define symbol __ICFEDIT_region_ROM_start__ = MBED_APP_START;
+define symbol __ICFEDIT_region_ROM_end__ = MBED_APP_START + MBED_APP_SIZE - 1;
define symbol __ICFEDIT_region_NVIC_start__ = 0x20000000;
define symbol __ICFEDIT_region_NVIC_end__ = 0x200001AF;
define symbol __ICFEDIT_region_RAM_start__ = 0x200001B0;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F437xG/device/flash_data.h Wed Aug 16 18:27:13 2017 +0100 @@ -0,0 +1,60 @@ +/* mbed Microcontroller Library + ******************************************************************************* + * Copyright (c) 2016, STMicroelectronics + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ +#ifndef MBED_FLASH_DATA_H +#define MBED_FLASH_DATA_H + +#include "device.h" +#include <stdint.h> + +#if DEVICE_FLASH + +#if defined (STM32F427xx) || defined (STM32F437xx) +#define FLASH_SIZE (uint32_t) 0x100000 +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Base address of the Flash sectors */ +#define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000) /* Base @ of Sector 0, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_1 ((uint32_t)0x08004000) /* Base @ of Sector 1, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_2 ((uint32_t)0x08008000) /* Base @ of Sector 2, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_3 ((uint32_t)0x0800C000) /* Base @ of Sector 3, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_4 ((uint32_t)0x08010000) /* Base @ of Sector 4, 64 Kbytes */ +#define ADDR_FLASH_SECTOR_5 ((uint32_t)0x08020000) /* Base @ of Sector 5, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_6 ((uint32_t)0x08040000) /* Base @ of Sector 6, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_7 ((uint32_t)0x08060000) /* Base @ of Sector 7, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_8 ((uint32_t)0x08080000) /* Base @ of Sector 8, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_9 ((uint32_t)0x080A0000) /* Base @ of Sector 9, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_10 ((uint32_t)0x080C0000) /* Base @ of Sector 10, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_11 ((uint32_t)0x080E0000) /* Base @ of Sector 11, 128 Kbytes */ + +#endif +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F437xG/device/nvic_addr.h Wed Aug 16 18:27:13 2017 +0100
@@ -0,0 +1,40 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2017-2017 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef NVIC_ADDR_H
+#define NVIC_ADDR_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined(__ICCARM__)
+ #pragma section=".intvec"
+ #define NVIC_FLASH_VECTOR_ADDRESS ((uint32_t)__section_begin(".intvec"))
+#elif defined(__CC_ARM)
+ extern uint32_t Load$$LR$$LR_IROM1$$Base[];
+ #define NVIC_FLASH_VECTOR_ADDRESS ((uint32_t)Load$$LR$$LR_IROM1$$Base)
+#elif defined(__GNUC__)
+ extern uint32_t g_pfnVectors[];
+ #define NVIC_FLASH_VECTOR_ADDRESS ((uint32_t)g_pfnVectors)
+#else
+ #error "Flash vector address not set for this toolchain"
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F437xG/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F437xG/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint8_t channel;
-};
-
struct trng_s {
RNG_HandleTypeDef handle;
};
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/device/flash_api.c Thu Aug 03 13:13:39 2017 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,192 +0,0 @@
-/* mbed Microcontroller Library
- *******************************************************************************
- * Copyright (c) 2017, STMicroelectronics
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. Neither the name of STMicroelectronics nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *******************************************************************************
- */
-
-#include "flash_api.h"
-#include "flash_data.h"
-#include "platform/mbed_critical.h"
-
-// This file is automatically generated
-
-#if DEVICE_FLASH
-
-#if defined (STM32F429xx) || defined (STM32F439xx)
-#define FLASH_SIZE (uint32_t) 0x200000
-#endif
-
-static uint32_t GetSector(uint32_t Address);
-static uint32_t GetSectorSize(uint32_t Sector);
-
-int32_t flash_init(flash_t *obj)
-{
- /* Allow Access to Flash control registers and user Falsh */
- if (HAL_FLASH_Unlock()) {
- return -1;
- } else {
- return 0;
- }
-}
-int32_t flash_free(flash_t *obj)
-{
- /* Disable the Flash option control register access (recommended to protect
- the option Bytes against possible unwanted operations) */
- if (HAL_FLASH_Lock()) {
- return -1;
- } else {
- return 0;
- }
-}
-int32_t flash_erase_sector(flash_t *obj, uint32_t address)
-{
- /*Variable used for Erase procedure*/
- static FLASH_EraseInitTypeDef EraseInitStruct;
- uint32_t FirstSector;
- uint32_t SectorError = 0;
-
- if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
-
- return -1;
- }
-
- /* Get the 1st sector to erase */
- FirstSector = GetSector(address);
-
- /* Fill EraseInit structure*/
- EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;
- EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;
- EraseInitStruct.Sector = FirstSector;
- EraseInitStruct.NbSectors = 1;
- if(HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError) != HAL_OK){
- return -1;
- } else {
- return 0;
- }
-}
-
-int32_t flash_program_page(flash_t *obj, uint32_t address, const uint8_t *data, uint32_t size)
-{
-
- if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
- return -1;
- }
-
- /* Note: If an erase operation in Flash memory also concerns data in the data or instruction cache,
- you have to make sure that these data are rewritten before they are accessed during code
- execution. If this cannot be done safely, it is recommended to flush the caches by setting the
- DCRST and ICRST bits in the FLASH_CR register. */
- __HAL_FLASH_DATA_CACHE_DISABLE();
- __HAL_FLASH_INSTRUCTION_CACHE_DISABLE();
-
- __HAL_FLASH_DATA_CACHE_RESET();
- __HAL_FLASH_INSTRUCTION_CACHE_RESET();
-
- __HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
- __HAL_FLASH_DATA_CACHE_ENABLE();
-
- while (size > 0) {
- if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, address, (uint64_t)*data) != HAL_OK) {
- return -1;
- } else {
- size--;
- address++;
- data++;
- }
- }
- return 0;
-}
-
-uint32_t flash_get_sector_size(const flash_t *obj, uint32_t address)
-{
-
- if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
- return MBED_FLASH_INVALID_SIZE;
- }
-
- return (GetSectorSize(GetSector(address)));
-}
-
-uint32_t flash_get_page_size(const flash_t *obj)
-{
- // not applicable for STM32F4
- return (0x4000); // minimum sector size
-}
-uint32_t flash_get_start_address(const flash_t *obj)
-{
- return FLASH_BASE;
-}
-uint32_t flash_get_size(const flash_t *obj)
-{
- return FLASH_SIZE;
-}
-
-/**
- * @brief Gets the sector of a given address
- * @param None
- * @retval The sector of a given address
- */
-static uint32_t GetSector(uint32_t address)
-{
- uint32_t sector = 0;
- uint32_t tmp = address - ADDR_FLASH_SECTOR_0;
- if (address & 0x100000) { // handle 2nd bank
- sector = FLASH_SECTOR_12;
- tmp = address - ADDR_FLASH_SECTOR_12;
- }
- if (address < ADDR_FLASH_SECTOR_4) { // 16k sectorsize
- //printf("tmp for sectors less than 4: 0X%4x")
- sector += tmp >>14;
- } else if (address < ADDR_FLASH_SECTOR_5) { //64k sector size
- sector += FLASH_SECTOR_4;
- } else {
- sector += 4 + (tmp >>17);
- }
- return sector;
-}
-
-/**
- * @brief Gets sector Size
- * @param None
- * @retval The size of a given sector
- */
-static uint32_t GetSectorSize(uint32_t Sector)
-{
- uint32_t sectorsize = 0x00;
- if((Sector == FLASH_SECTOR_0) || (Sector == FLASH_SECTOR_1) || (Sector == FLASH_SECTOR_2) ||\
- (Sector == FLASH_SECTOR_3) || (Sector == FLASH_SECTOR_12) || (Sector == FLASH_SECTOR_13) ||\
- (Sector == FLASH_SECTOR_14) || (Sector == FLASH_SECTOR_15)) {
- sectorsize = 16 * 1024;
- } else if((Sector == FLASH_SECTOR_4) || (Sector == FLASH_SECTOR_16)){
- sectorsize = 64 * 1024;
- } else {
- sectorsize = 128 * 1024;
- }
- return sectorsize;
-}
-
-#endif
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/device/flash_data.h Thu Aug 03 13:13:39 2017 +0100 +++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/device/flash_data.h Wed Aug 16 18:27:13 2017 +0100 @@ -38,6 +38,9 @@ /* Exported types ------------------------------------------------------------*/ /* Exported constants --------------------------------------------------------*/ /* Exported macro ------------------------------------------------------------*/ +/* Flash Size */ +#define FLASH_SIZE (uint32_t) 0x200000 + /* Base address of the Flash sectors Bank 1 */ #define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000) /* Base @ of Sector 0, 16 Kbytes */ #define ADDR_FLASH_SECTOR_1 ((uint32_t)0x08004000) /* Base @ of Sector 1, 16 Kbytes */
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint8_t channel;
-};
-
struct can_s {
CANName can;
int index;
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F446xE/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F446xE/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint8_t channel;
-};
-
struct can_s {
CANName can;
int index;
--- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F469xI/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F469xI/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint8_t channel;
-};
-
struct can_s {
CANName can;
int index;
--- a/targets/TARGET_STM/TARGET_STM32F4/analogin_api.c Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/analogin_api.c Wed Aug 16 18:27:13 2017 +0100
@@ -36,12 +36,9 @@
#include "mbed_error.h"
#include "PeripheralPins.h"
-ADC_HandleTypeDef AdcHandle;
-
void analogin_init(analogin_t *obj, PinName pin)
{
uint32_t function = (uint32_t)NC;
- obj->adc = (ADCName)NC;
#if defined(ADC1)
static int adc1_inited = 0;
@@ -58,18 +55,18 @@
if (pin < 0xF0) {
// Normal channels
// Get the peripheral name from the pin and assign it to the object
- obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
+ obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC);
// Get the functions (adc channel) from the pin and assign it to the object
function = pinmap_function(pin, PinMap_ADC);
// Configure GPIO
pinmap_pinout(pin, PinMap_ADC);
} else {
// Internal channels
- obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC_Internal);
+ obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC_Internal);
function = pinmap_function(pin, PinMap_ADC_Internal);
// No GPIO configuration for internal channels
}
- MBED_ASSERT(obj->adc != (ADCName)NC);
+ MBED_ASSERT(obj->handle.Instance != (ADC_TypeDef *)NC);
MBED_ASSERT(function != (uint32_t)NC);
obj->channel = STM_PIN_CHANNEL(function);
@@ -80,42 +77,42 @@
// Check if ADC is already initialized
// Enable ADC clock
#if defined(ADC1)
- if ((obj->adc == ADC_1) && adc1_inited) return;
- if (obj->adc == ADC_1) {
+ if (((ADCName)obj->handle.Instance == ADC_1) && adc1_inited) return;
+ if ((ADCName)obj->handle.Instance == ADC_1) {
__HAL_RCC_ADC1_CLK_ENABLE();
adc1_inited = 1;
}
#endif
#if defined(ADC2)
- if ((obj->adc == ADC_2) && adc2_inited) return;
- if (obj->adc == ADC_2) {
+ if (((ADCName)obj->handle.Instance == ADC_2) && adc2_inited) return;
+ if ((ADCName)obj->handle.Instance == ADC_2) {
__HAL_RCC_ADC2_CLK_ENABLE();
adc2_inited = 1;
}
#endif
#if defined(ADC3)
- if ((obj->adc == ADC_3) && adc3_inited) return;
- if (obj->adc == ADC_3) {
+ if (((ADCName)obj->handle.Instance == ADC_3) && adc3_inited) return;
+ if ((ADCName)obj->handle.Instance == ADC_3) {
__HAL_RCC_ADC3_CLK_ENABLE();
adc3_inited = 1;
}
#endif
// Configure ADC
- AdcHandle.Instance = (ADC_TypeDef *)(obj->adc);
- AdcHandle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
- AdcHandle.Init.Resolution = ADC_RESOLUTION_12B;
- AdcHandle.Init.ScanConvMode = DISABLE;
- AdcHandle.Init.ContinuousConvMode = DISABLE;
- AdcHandle.Init.DiscontinuousConvMode = DISABLE;
- AdcHandle.Init.NbrOfDiscConversion = 0;
- AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
- AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
- AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
- AdcHandle.Init.NbrOfConversion = 1;
- AdcHandle.Init.DMAContinuousRequests = DISABLE;
- AdcHandle.Init.EOCSelection = DISABLE;
+ obj->handle.State = HAL_ADC_STATE_RESET;
+ obj->handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
+ obj->handle.Init.Resolution = ADC_RESOLUTION_12B;
+ obj->handle.Init.ScanConvMode = DISABLE;
+ obj->handle.Init.ContinuousConvMode = DISABLE;
+ obj->handle.Init.DiscontinuousConvMode = DISABLE;
+ obj->handle.Init.NbrOfDiscConversion = 0;
+ obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
+ obj->handle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
+ obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
+ obj->handle.Init.NbrOfConversion = 1;
+ obj->handle.Init.DMAContinuousRequests = DISABLE;
+ obj->handle.Init.EOCSelection = DISABLE;
- if (HAL_ADC_Init(&AdcHandle) != HAL_OK) {
+ if (HAL_ADC_Init(&obj->handle) != HAL_OK) {
error("Cannot initialize ADC\n");
}
}
@@ -124,8 +121,6 @@
{
ADC_ChannelConfTypeDef sConfig = {0};
- AdcHandle.Instance = (ADC_TypeDef *)(obj->adc);
-
// Configure ADC channel
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_15CYCLES;
@@ -202,13 +197,13 @@
// so VBAT readings are returned in place of temperature.
ADC->CCR &= ~(ADC_CCR_VBATE | ADC_CCR_TSVREFE);
- HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
+ HAL_ADC_ConfigChannel(&obj->handle, &sConfig);
- HAL_ADC_Start(&AdcHandle); // Start conversion
+ HAL_ADC_Start(&obj->handle); // Start conversion
// Wait end of conversion and get value
- if (HAL_ADC_PollForConversion(&AdcHandle, 10) == HAL_OK) {
- return (uint16_t)HAL_ADC_GetValue(&AdcHandle);
+ if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) {
+ return (uint16_t)HAL_ADC_GetValue(&obj->handle);
} else {
return 0;
}
--- a/targets/TARGET_STM/TARGET_STM32F4/common_objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/common_objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -109,11 +109,19 @@
uint8_t available_events;
#endif
};
+
#if DEVICE_FLASH
struct flash_s {
uint32_t dummy;
};
#endif
+
+struct analogin_s {
+ ADC_HandleTypeDef handle;
+ PinName pin;
+ uint8_t channel;
+};
+
#define GPIO_IP_WITHOUT_BRR
#include "gpio_object.h"
--- a/targets/TARGET_STM/TARGET_STM32F4/device/stm32f4xx_hal_mmc.c Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F4/device/stm32f4xx_hal_mmc.c Wed Aug 16 18:27:13 2017 +0100
@@ -1316,7 +1316,7 @@
hmmc->State = HAL_MMC_STATE_BUSY;
/* Check if the card command class supports erase command */
- if((hmmc->MmcCard.Class) & SDIO_CCCC_ERASE == 0U)
+ if(((hmmc->MmcCard.Class) & SDIO_CCCC_ERASE) == 0U)
{
/* Clear all the static flags */
__HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_STM/TARGET_STM32F4/flash_api.c Wed Aug 16 18:27:13 2017 +0100
@@ -0,0 +1,197 @@
+/* mbed Microcontroller Library
+ *******************************************************************************
+ * Copyright (c) 2017, STMicroelectronics
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of STMicroelectronics nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *******************************************************************************
+ */
+
+#if DEVICE_FLASH
+#include "flash_api.h"
+#include "flash_data.h"
+#include "platform/mbed_critical.h"
+
+// This file is automatically generated
+
+
+static uint32_t GetSector(uint32_t Address);
+static uint32_t GetSectorSize(uint32_t Sector);
+
+int32_t flash_init(flash_t *obj)
+{
+ /* Allow Access to Flash control registers and user Falsh */
+ if (HAL_FLASH_Unlock()) {
+ return -1;
+ } else {
+ return 0;
+ }
+}
+int32_t flash_free(flash_t *obj)
+{
+ /* Disable the Flash option control register access (recommended to protect
+ the option Bytes against possible unwanted operations) */
+ if (HAL_FLASH_Lock()) {
+ return -1;
+ } else {
+ return 0;
+ }
+}
+int32_t flash_erase_sector(flash_t *obj, uint32_t address)
+{
+ /*Variable used for Erase procedure*/
+ static FLASH_EraseInitTypeDef EraseInitStruct;
+ uint32_t FirstSector;
+ uint32_t SectorError = 0;
+
+ if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
+
+ return -1;
+ }
+
+ /* Get the 1st sector to erase */
+ FirstSector = GetSector(address);
+
+ /* Fill EraseInit structure*/
+ EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;
+ EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;
+ EraseInitStruct.Sector = FirstSector;
+ EraseInitStruct.NbSectors = 1;
+ if(HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError) != HAL_OK){
+ return -1;
+ } else {
+ return 0;
+ }
+}
+
+int32_t flash_program_page(flash_t *obj, uint32_t address, const uint8_t *data, uint32_t size)
+{
+
+ if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
+ return -1;
+ }
+
+ /* Note: If an erase operation in Flash memory also concerns data in the data or instruction cache,
+ you have to make sure that these data are rewritten before they are accessed during code
+ execution. If this cannot be done safely, it is recommended to flush the caches by setting the
+ DCRST and ICRST bits in the FLASH_CR register. */
+ __HAL_FLASH_DATA_CACHE_DISABLE();
+ __HAL_FLASH_INSTRUCTION_CACHE_DISABLE();
+
+ __HAL_FLASH_DATA_CACHE_RESET();
+ __HAL_FLASH_INSTRUCTION_CACHE_RESET();
+
+ __HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
+ __HAL_FLASH_DATA_CACHE_ENABLE();
+
+ while (size > 0) {
+ if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, address, (uint64_t)*data) != HAL_OK) {
+ return -1;
+ } else {
+ size--;
+ address++;
+ data++;
+ }
+ }
+ return 0;
+}
+
+uint32_t flash_get_sector_size(const flash_t *obj, uint32_t address)
+{
+
+ if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
+ return MBED_FLASH_INVALID_SIZE;
+ }
+
+ return (GetSectorSize(GetSector(address)));
+}
+
+uint32_t flash_get_page_size(const flash_t *obj)
+{
+ // not applicable for STM32F4
+ return (0x4000); // minimum sector size
+}
+uint32_t flash_get_start_address(const flash_t *obj)
+{
+ return FLASH_BASE;
+}
+uint32_t flash_get_size(const flash_t *obj)
+{
+ return FLASH_SIZE;
+}
+
+/**
+ * @brief Gets the sector of a given address
+ * @param None
+ * @retval The sector of a given address
+ */
+static uint32_t GetSector(uint32_t address)
+{
+ uint32_t sector = 0;
+ uint32_t tmp = address - ADDR_FLASH_SECTOR_0;
+ /* This function supports 1Mb and 2Mb flash sizes */
+#if defined(ADDR_FLASH_SECTOR_12)
+ if (address & 0x100000) { // handle 2nd bank
+ sector = FLASH_SECTOR_12;
+ tmp = address - ADDR_FLASH_SECTOR_12;
+ }
+#endif
+ if (address < ADDR_FLASH_SECTOR_4) { // 16k sectorsize
+ sector += tmp >>14;
+ } else if (address < ADDR_FLASH_SECTOR_5) { //64k sector size
+ sector += FLASH_SECTOR_4;
+ } else {
+ sector += 4 + (tmp >>17);
+ }
+ return sector;
+}
+
+/**
+ * @brief Gets sector Size
+ * @param None
+ * @retval The size of a given sector
+ */
+static uint32_t GetSectorSize(uint32_t Sector)
+{
+ uint32_t sectorsize = 0x00;
+#if defined(FLASH_SECTOR_12)
+ if((Sector == FLASH_SECTOR_0) || (Sector == FLASH_SECTOR_1) || (Sector == FLASH_SECTOR_2) ||\
+ (Sector == FLASH_SECTOR_3) || (Sector == FLASH_SECTOR_12) || (Sector == FLASH_SECTOR_13) ||\
+ (Sector == FLASH_SECTOR_14) || (Sector == FLASH_SECTOR_15)) {
+ sectorsize = 16 * 1024;
+ } else if((Sector == FLASH_SECTOR_4) || (Sector == FLASH_SECTOR_16)) {
+#else
+if((Sector == FLASH_SECTOR_0) || (Sector == FLASH_SECTOR_1) || (Sector == FLASH_SECTOR_2) ||\
+ (Sector == FLASH_SECTOR_3)) {
+ sectorsize = 16 * 1024;
+ } else if(Sector == FLASH_SECTOR_4) {
+#endif
+ sectorsize = 64 * 1024;
+ } else {
+ sectorsize = 128 * 1024;
+ }
+ return sectorsize;
+}
+
+#endif
--- a/targets/TARGET_STM/TARGET_STM32F7/TARGET_STM32F746xG/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F7/TARGET_STM32F746xG/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint8_t channel;
-};
-
struct can_s {
CANName can;
int index;
--- a/targets/TARGET_STM/TARGET_STM32F7/TARGET_STM32F756xG/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F7/TARGET_STM32F756xG/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint8_t channel;
-};
-
struct can_s {
CANName can;
int index;
--- a/targets/TARGET_STM/TARGET_STM32F7/TARGET_STM32F767xI/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F7/TARGET_STM32F767xI/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint8_t channel;
-};
-
struct can_s {
CANName can;
int index;
--- a/targets/TARGET_STM/TARGET_STM32F7/TARGET_STM32F769xI/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F7/TARGET_STM32F769xI/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint8_t channel;
-};
-
struct can_s {
CANName can;
int index;
--- a/targets/TARGET_STM/TARGET_STM32F7/analogin_api.c Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F7/analogin_api.c Wed Aug 16 18:27:13 2017 +0100
@@ -36,12 +36,9 @@
#include "PeripheralPins.h"
#include "mbed_error.h"
-ADC_HandleTypeDef AdcHandle;
-
void analogin_init(analogin_t *obj, PinName pin)
{
uint32_t function = (uint32_t)NC;
- obj->adc = (ADCName)NC;
#if defined(ADC1)
static int adc1_inited = 0;
@@ -58,18 +55,17 @@
if (pin < 0xF0) {
// Normal channels
// Get the peripheral name from the pin and assign it to the object
- obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
- // Get the functions (adc channel) from the pin and assign it to the object
+ obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC);
function = pinmap_function(pin, PinMap_ADC);
// Configure GPIO
pinmap_pinout(pin, PinMap_ADC);
} else {
// Internal channels
- obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC_Internal);
+ obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC_Internal);
function = pinmap_function(pin, PinMap_ADC_Internal);
// No GPIO configuration for internal channels
}
- MBED_ASSERT(obj->adc != (ADCName)NC);
+ MBED_ASSERT(obj->handle.Instance != (ADC_TypeDef *)NC);
MBED_ASSERT(function != (uint32_t)NC);
obj->channel = STM_PIN_CHANNEL(function);
@@ -80,43 +76,43 @@
// Check if ADC is already initialized
// Enable ADC clock
#if defined(ADC1)
- if ((obj->adc == ADC_1) && adc1_inited) return;
- if (obj->adc == ADC_1) {
+ if (((ADCName)obj->handle.Instance == ADC_1) && adc1_inited) return;
+ if ((ADCName)obj->handle.Instance == ADC_1) {
__HAL_RCC_ADC1_CLK_ENABLE();
adc1_inited = 1;
}
#endif
#if defined(ADC2)
- if ((obj->adc == ADC_2) && adc2_inited) return;
- if (obj->adc == ADC_2) {
+ if (((ADCName)obj->handle.Instance == ADC_2) && adc2_inited) return;
+ if ((ADCName)obj->handle.Instance == ADC_2) {
__HAL_RCC_ADC2_CLK_ENABLE();
adc2_inited = 1;
}
#endif
#if defined(ADC3)
- if ((obj->adc == ADC_3) && adc3_inited) return;
- if (obj->adc == ADC_3) {
+ if (((ADCName)obj->handle.Instance == ADC_3) && adc3_inited) return;
+ if ((ADCName)obj->handle.Instance == ADC_3) {
__HAL_RCC_ADC3_CLK_ENABLE();
adc3_inited = 1;
}
#endif
// Configure ADC
- AdcHandle.Instance = (ADC_TypeDef *)(obj->adc);
- AdcHandle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV4;
- AdcHandle.Init.Resolution = ADC_RESOLUTION_12B;
- AdcHandle.Init.ScanConvMode = DISABLE;
- AdcHandle.Init.ContinuousConvMode = DISABLE;
- AdcHandle.Init.DiscontinuousConvMode = DISABLE;
- AdcHandle.Init.NbrOfDiscConversion = 0;
- AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
- AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
- AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
- AdcHandle.Init.NbrOfConversion = 1;
- AdcHandle.Init.DMAContinuousRequests = DISABLE;
- AdcHandle.Init.EOCSelection = DISABLE;
+ obj->handle.State = HAL_ADC_STATE_RESET;
+ obj->handle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV4;
+ obj->handle.Init.Resolution = ADC_RESOLUTION_12B;
+ obj->handle.Init.ScanConvMode = DISABLE;
+ obj->handle.Init.ContinuousConvMode = DISABLE;
+ obj->handle.Init.DiscontinuousConvMode = DISABLE;
+ obj->handle.Init.NbrOfDiscConversion = 0;
+ obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
+ obj->handle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
+ obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
+ obj->handle.Init.NbrOfConversion = 1;
+ obj->handle.Init.DMAContinuousRequests = DISABLE;
+ obj->handle.Init.EOCSelection = DISABLE;
- if (HAL_ADC_Init(&AdcHandle) != HAL_OK) {
+ if (HAL_ADC_Init(&obj->handle) != HAL_OK) {
error("Cannot initialize ADC");
}
}
@@ -125,8 +121,6 @@
{
ADC_ChannelConfTypeDef sConfig = {0};
- AdcHandle.Instance = (ADC_TypeDef *)(obj->adc);
-
// Configure ADC channel
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_15CYCLES;
@@ -194,16 +188,16 @@
return 0;
}
- if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK) {
+ if (HAL_ADC_ConfigChannel(&obj->handle, &sConfig) != HAL_OK) {
error("Cannot configure ADC channel");
}
- HAL_ADC_Start(&AdcHandle); // Start conversion
+ HAL_ADC_Start(&obj->handle); // Start conversion
// Wait end of conversion and get value
- HAL_ADC_PollForConversion(&AdcHandle, 10);
- if (HAL_ADC_GetState(&AdcHandle) & HAL_ADC_STATE_EOC_REG) {
- return (HAL_ADC_GetValue(&AdcHandle));
+ HAL_ADC_PollForConversion(&obj->handle, 10);
+ if (HAL_ADC_GetState(&obj->handle) & HAL_ADC_STATE_EOC_REG) {
+ return (HAL_ADC_GetValue(&obj->handle));
} else {
return 0;
}
--- a/targets/TARGET_STM/TARGET_STM32F7/common_objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32F7/common_objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -111,6 +111,12 @@
#endif
};
+struct analogin_s {
+ ADC_HandleTypeDef handle;
+ PinName pin;
+ uint8_t channel;
+};
+
#define GPIO_IP_WITHOUT_BRR
#include "gpio_object.h"
--- a/targets/TARGET_STM/TARGET_STM32L0/TARGET_DISCO_L053C8/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32L0/TARGET_DISCO_L053C8/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint32_t channel;
-};
-
struct trng_s {
RNG_HandleTypeDef handle;
};
--- a/targets/TARGET_STM/TARGET_STM32L0/TARGET_DISCO_L072CZ_LRWAN1/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32L0/TARGET_DISCO_L072CZ_LRWAN1/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint32_t channel;
-};
-
struct trng_s {
RNG_HandleTypeDef handle;
};
--- a/targets/TARGET_STM/TARGET_STM32L0/TARGET_NUCLEO_L011K4/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32L0/TARGET_NUCLEO_L011K4/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint32_t channel;
-};
-
#include "common_objects.h"
#ifdef __cplusplus
--- a/targets/TARGET_STM/TARGET_STM32L0/TARGET_NUCLEO_L031K6/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32L0/TARGET_NUCLEO_L031K6/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint32_t channel;
-};
-
#include "common_objects.h"
#ifdef __cplusplus
--- a/targets/TARGET_STM/TARGET_STM32L0/TARGET_NUCLEO_L053R8/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32L0/TARGET_NUCLEO_L053R8/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint32_t channel;
-};
-
#include "common_objects.h"
#ifdef __cplusplus
--- a/targets/TARGET_STM/TARGET_STM32L0/TARGET_NUCLEO_L073RZ/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32L0/TARGET_NUCLEO_L073RZ/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint32_t channel;
-};
-
struct trng_s {
RNG_HandleTypeDef handle;
};
--- a/targets/TARGET_STM/TARGET_STM32L0/analogin_api.c Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32L0/analogin_api.c Wed Aug 16 18:27:13 2017 +0100
@@ -36,14 +36,12 @@
#include "mbed_error.h"
#include "PeripheralPins.h"
-ADC_HandleTypeDef AdcHandle;
-
int adc_inited = 0;
void analogin_init(analogin_t *obj, PinName pin)
{
uint32_t function = (uint32_t)NC;
- obj->adc = (ADCName)NC;
+ obj->handle.Instance = (ADC_TypeDef *)NC;
// ADC Internal Channels "pins" (Temperature, Vref, Vbat, ...)
// are described in PinNames.h and PeripheralPins.c
@@ -51,18 +49,18 @@
if (pin < 0xF0) {
// Normal channels
// Get the peripheral name from the pin and assign it to the object
- obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
+ obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC);
// Get the functions (adc channel) from the pin and assign it to the object
function = pinmap_function(pin, PinMap_ADC);
// Configure GPIO
pinmap_pinout(pin, PinMap_ADC);
} else {
// Internal channels
- obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC_Internal);
+ obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC_Internal);
function = pinmap_function(pin, PinMap_ADC_Internal);
// No GPIO configuration for internal channels
}
- MBED_ASSERT(obj->adc != (ADCName)NC);
+ MBED_ASSERT(obj->handle.Instance != (ADC_TypeDef *)NC);
MBED_ASSERT(function != (uint32_t)NC);
obj->channel = STM_PIN_CHANNEL(function);
@@ -74,37 +72,36 @@
if (adc_inited == 0) {
adc_inited = 1;
- AdcHandle.Instance = (ADC_TypeDef *)(obj->adc);
-
+ obj->handle.State = HAL_ADC_STATE_RESET;
// Enable ADC clock
__ADC1_CLK_ENABLE();
// Configure ADC
- AdcHandle.Init.OversamplingMode = DISABLE;
- AdcHandle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV1;
- AdcHandle.Init.Resolution = ADC_RESOLUTION12b;
- AdcHandle.Init.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
- AdcHandle.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
- AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
- AdcHandle.Init.ContinuousConvMode = DISABLE;
- AdcHandle.Init.DiscontinuousConvMode = DISABLE;
- AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIG_EDGE_NONE;
- AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIG0_T6_TRGO; // Not used here
- AdcHandle.Init.DMAContinuousRequests = DISABLE;
- AdcHandle.Init.EOCSelection = EOC_SINGLE_CONV;
- AdcHandle.Init.Overrun = OVR_DATA_OVERWRITTEN;
- AdcHandle.Init.LowPowerAutoWait = ENABLE;
- AdcHandle.Init.LowPowerFrequencyMode = DISABLE; // To be enabled only if ADC clock < 2.8 MHz
- AdcHandle.Init.LowPowerAutoPowerOff = DISABLE;
+ obj->handle.Init.OversamplingMode = DISABLE;
+ obj->handle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV1;
+ obj->handle.Init.Resolution = ADC_RESOLUTION12b;
+ obj->handle.Init.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
+ obj->handle.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
+ obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
+ obj->handle.Init.ContinuousConvMode = DISABLE;
+ obj->handle.Init.DiscontinuousConvMode = DISABLE;
+ obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIG_EDGE_NONE;
+ obj->handle.Init.ExternalTrigConv = ADC_EXTERNALTRIG0_T6_TRGO; // Not used here
+ obj->handle.Init.DMAContinuousRequests = DISABLE;
+ obj->handle.Init.EOCSelection = EOC_SINGLE_CONV;
+ obj->handle.Init.Overrun = OVR_DATA_OVERWRITTEN;
+ obj->handle.Init.LowPowerAutoWait = ENABLE;
+ obj->handle.Init.LowPowerFrequencyMode = DISABLE; // To be enabled only if ADC clock < 2.8 MHz
+ obj->handle.Init.LowPowerAutoPowerOff = DISABLE;
- if (HAL_ADC_Init(&AdcHandle) != HAL_OK) {
+ if (HAL_ADC_Init(&obj->handle) != HAL_OK) {
error("Cannot initialize ADC");
}
// Calibration
- HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_SINGLE_ENDED);
+ HAL_ADCEx_Calibration_Start(&obj->handle, ADC_SINGLE_ENDED);
- __HAL_ADC_ENABLE(&AdcHandle);
+ __HAL_ADC_ENABLE(&obj->handle);
}
}
@@ -112,8 +109,6 @@
{
ADC_ChannelConfTypeDef sConfig = {0};
- AdcHandle.Instance = (ADC_TypeDef *)(obj->adc);
-
// Configure ADC channel
sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
switch (obj->channel) {
@@ -181,13 +176,13 @@
}
ADC1->CHSELR = 0; // [TODO] Workaround. To be removed after Cube driver is corrected.
- HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
+ HAL_ADC_ConfigChannel(&obj->handle, &sConfig);
- HAL_ADC_Start(&AdcHandle); // Start conversion
+ HAL_ADC_Start(&obj->handle); // Start conversion
// Wait end of conversion and get value
- if (HAL_ADC_PollForConversion(&AdcHandle, 10) == HAL_OK) {
- return (HAL_ADC_GetValue(&AdcHandle));
+ if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) {
+ return (HAL_ADC_GetValue(&obj->handle));
} else {
return 0;
}
--- a/targets/TARGET_STM/TARGET_STM32L0/common_objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32L0/common_objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -116,6 +116,12 @@
uint32_t dummy;
};
+struct analogin_s {
+ ADC_HandleTypeDef handle;
+ PinName pin;
+ uint8_t channel;
+};
+
#include "gpio_object.h"
#if DEVICE_ANALOGOUT
--- a/targets/TARGET_STM/TARGET_STM32L1/TARGET_MOTE_L152RC/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32L1/TARGET_MOTE_L152RC/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint32_t channel;
-};
-
#define GPIO_IP_WITHOUT_BRR
#include "common_objects.h"
--- a/targets/TARGET_STM/TARGET_STM32L1/TARGET_NUCLEO_L152RE/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32L1/TARGET_NUCLEO_L152RE/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint32_t channel;
-};
-
#include "common_objects.h"
#ifdef __cplusplus
--- a/targets/TARGET_STM/TARGET_STM32L1/TARGET_NZ32_SC151/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32L1/TARGET_NZ32_SC151/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint32_t channel;
-};
-
#include "common_objects.h"
#ifdef __cplusplus
--- a/targets/TARGET_STM/TARGET_STM32L1/TARGET_XDOT_L151CC/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32L1/TARGET_XDOT_L151CC/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint32_t channel;
-};
-
#define GPIO_IP_WITHOUT_BRR
#include "common_objects.h"
--- a/targets/TARGET_STM/TARGET_STM32L1/analogin_api.c Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32L1/analogin_api.c Wed Aug 16 18:27:13 2017 +0100
@@ -36,8 +36,6 @@
#include "mbed_error.h"
#include "PeripheralPins.h"
-ADC_HandleTypeDef AdcHandle;
-
int adc_inited = 0;
void analogin_init(analogin_t *obj, PinName pin)
@@ -45,8 +43,8 @@
RCC_OscInitTypeDef RCC_OscInitStruct;
// Get the peripheral name from the pin and assign it to the object
- obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
- MBED_ASSERT(obj->adc != (ADCName)NC);
+ obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC);
+ MBED_ASSERT(obj->handle.Instance != (ADC_TypeDef *)NC);
// Get the pin function and assign the used channel to the object
uint32_t function = pinmap_function(pin, PinMap_ADC);
@@ -73,29 +71,28 @@
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
- AdcHandle.Instance = (ADC_TypeDef *)(obj->adc);
-
+ obj->handle.State = HAL_ADC_STATE_RESET;
// Enable ADC clock
__ADC1_CLK_ENABLE();
// Configure ADC
- AdcHandle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV4;
- AdcHandle.Init.Resolution = ADC_RESOLUTION12b;
- AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
- AdcHandle.Init.ScanConvMode = DISABLE; // Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1)
- AdcHandle.Init.EOCSelection = EOC_SINGLE_CONV; // On STM32L1xx ADC, overrun detection is enabled only if EOC selection is set to each conversion (or transfer by DMA enabled, this is not the case in this example).
- AdcHandle.Init.LowPowerAutoWait = ADC_AUTOWAIT_UNTIL_DATA_READ; // Enable the dynamic low power Auto Delay: new conversion start only when the previous conversion (for regular group) or previous sequence (for injected group) has been treated by user software.
- AdcHandle.Init.LowPowerAutoPowerOff = ADC_AUTOPOWEROFF_IDLE_PHASE; // Enable the auto-off mode: the ADC automatically powers-off after a conversion and automatically wakes-up when a new conversion is triggered (with startup time between trigger and start of sampling).
- AdcHandle.Init.ChannelsBank = ADC_CHANNELS_BANK_A;
- AdcHandle.Init.ContinuousConvMode = DISABLE; // Continuous mode disabled to have only 1 conversion at each conversion trig
- AdcHandle.Init.NbrOfConversion = 1; // Parameter discarded because sequencer is disabled
- AdcHandle.Init.DiscontinuousConvMode = DISABLE; // Parameter discarded because sequencer is disabled
- AdcHandle.Init.NbrOfDiscConversion = 1; // Parameter discarded because sequencer is disabled
- AdcHandle.Init.ExternalTrigConv = 0; // Not used
- AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
- AdcHandle.Init.DMAContinuousRequests = DISABLE;
+ obj->handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV4;
+ obj->handle.Init.Resolution = ADC_RESOLUTION12b;
+ obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
+ obj->handle.Init.ScanConvMode = DISABLE; // Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1)
+ obj->handle.Init.EOCSelection = EOC_SINGLE_CONV; // On STM32L1xx ADC, overrun detection is enabled only if EOC selection is set to each conversion (or transfer by DMA enabled, this is not the case in this example).
+ obj->handle.Init.LowPowerAutoWait = ADC_AUTOWAIT_UNTIL_DATA_READ; // Enable the dynamic low power Auto Delay: new conversion start only when the previous conversion (for regular group) or previous sequence (for injected group) has been treated by user software.
+ obj->handle.Init.LowPowerAutoPowerOff = ADC_AUTOPOWEROFF_IDLE_PHASE; // Enable the auto-off mode: the ADC automatically powers-off after a conversion and automatically wakes-up when a new conversion is triggered (with startup time between trigger and start of sampling).
+ obj->handle.Init.ChannelsBank = ADC_CHANNELS_BANK_A;
+ obj->handle.Init.ContinuousConvMode = DISABLE; // Continuous mode disabled to have only 1 conversion at each conversion trig
+ obj->handle.Init.NbrOfConversion = 1; // Parameter discarded because sequencer is disabled
+ obj->handle.Init.DiscontinuousConvMode = DISABLE; // Parameter discarded because sequencer is disabled
+ obj->handle.Init.NbrOfDiscConversion = 1; // Parameter discarded because sequencer is disabled
+ obj->handle.Init.ExternalTrigConv = 0; // Not used
+ obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
+ obj->handle.Init.DMAContinuousRequests = DISABLE;
- if (HAL_ADC_Init(&AdcHandle) != HAL_OK) {
+ if (HAL_ADC_Init(&obj->handle) != HAL_OK) {
error("Cannot initialize ADC");
}
}
@@ -105,8 +102,6 @@
{
ADC_ChannelConfTypeDef sConfig = {0};
- AdcHandle.Instance = (ADC_TypeDef *)(obj->adc);
-
// Configure ADC channel
switch (obj->channel) {
case 0:
@@ -222,13 +217,13 @@
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_16CYCLES;
- HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
+ HAL_ADC_ConfigChannel(&obj->handle, &sConfig);
- HAL_ADC_Start(&AdcHandle); // Start conversion
+ HAL_ADC_Start(&obj->handle); // Start conversion
// Wait end of conversion and get value
- if (HAL_ADC_PollForConversion(&AdcHandle, 10) == HAL_OK) {
- return (HAL_ADC_GetValue(&AdcHandle));
+ if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) {
+ return (HAL_ADC_GetValue(&obj->handle));
} else {
return 0;
}
--- a/targets/TARGET_STM/TARGET_STM32L1/common_objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32L1/common_objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -122,6 +122,12 @@
DAC_HandleTypeDef handle;
};
+struct analogin_s {
+ ADC_HandleTypeDef handle;
+ PinName pin;
+ uint8_t channel;
+};
+
#include "gpio_object.h"
#ifdef __cplusplus
--- a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L432xC/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L432xC/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint32_t channel;
-};
-
struct can_s {
CANName can;
int index;
--- a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint32_t channel;
-};
-
struct can_s {
CANName can;
int index;
--- a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint32_t channel;
-};
-
struct can_s {
CANName can;
int index;
--- a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L486xG/objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L486xG/objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -54,12 +54,6 @@
__IO uint32_t *reg_out;
};
-struct analogin_s {
- ADCName adc;
- PinName pin;
- uint32_t channel;
-};
-
struct can_s {
CANName can;
int index;
--- a/targets/TARGET_STM/TARGET_STM32L4/analogin_api.c Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32L4/analogin_api.c Wed Aug 16 18:27:13 2017 +0100
@@ -36,14 +36,11 @@
#include "mbed_error.h"
#include "PeripheralPins.h"
-ADC_HandleTypeDef AdcHandle;
-
int adc_inited = 0;
void analogin_init(analogin_t *obj, PinName pin)
{
uint32_t function = (uint32_t)NC;
- obj->adc = (ADCName)NC;
// ADC Internal Channels "pins" (Temperature, Vref, Vbat, ...)
// are described in PinNames.h and PeripheralPins.c
@@ -51,18 +48,18 @@
if ((pin < 0xF0) || (pin >= 0x100)) {
// Normal channels
// Get the peripheral name from the pin and assign it to the object
- obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
+ obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC);
// Get the functions (adc channel) from the pin and assign it to the object
function = pinmap_function(pin, PinMap_ADC);
// Configure GPIO
pinmap_pinout(pin, PinMap_ADC);
} else {
// Internal channels
- obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC_Internal);
+ obj->handle.Instance = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC_Internal);
function = pinmap_function(pin, PinMap_ADC_Internal);
// No GPIO configuration for internal channels
}
- MBED_ASSERT(obj->adc != (ADCName)NC);
+ MBED_ASSERT(obj->handle.Instance != (ADC_TypeDef *)NC);
MBED_ASSERT(function != (uint32_t)NC);
obj->channel = STM_PIN_CHANNEL(function);
@@ -78,26 +75,25 @@
__HAL_RCC_ADC_CLK_ENABLE();
__HAL_RCC_ADC_CONFIG(RCC_ADCCLKSOURCE_SYSCLK);
- AdcHandle.Instance = (ADC_TypeDef *)(obj->adc);
-
+ obj->handle.State = HAL_ADC_STATE_RESET;
// Configure ADC
- AdcHandle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2; // Asynchronous clock mode, input ADC clock
- AdcHandle.Init.Resolution = ADC_RESOLUTION_12B;
- AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
- AdcHandle.Init.ScanConvMode = DISABLE; // Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1)
- AdcHandle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; // On STM32L1xx ADC, overrun detection is enabled only if EOC selection is set to each conversion (or transfer by DMA enabled, this is not the case in this example).
- AdcHandle.Init.LowPowerAutoWait = DISABLE;
- AdcHandle.Init.ContinuousConvMode = DISABLE; // Continuous mode disabled to have only 1 conversion at each conversion trig
- AdcHandle.Init.NbrOfConversion = 1; // Parameter discarded because sequencer is disabled
- AdcHandle.Init.DiscontinuousConvMode = DISABLE; // Parameter discarded because sequencer is disabled
- AdcHandle.Init.NbrOfDiscConversion = 1; // Parameter discarded because sequencer is disabled
- AdcHandle.Init.ExternalTrigConv = ADC_SOFTWARE_START; // Software start to trig the 1st conversion manually, without external event
- AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
- AdcHandle.Init.DMAContinuousRequests = DISABLE;
- AdcHandle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; // DR register is overwritten with the last conversion result in case of overrun
- AdcHandle.Init.OversamplingMode = DISABLE; // No oversampling
+ obj->handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2; // Asynchronous clock mode, input ADC clock
+ obj->handle.Init.Resolution = ADC_RESOLUTION_12B;
+ obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
+ obj->handle.Init.ScanConvMode = DISABLE; // Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1)
+ obj->handle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; // On STM32L1xx ADC, overrun detection is enabled only if EOC selection is set to each conversion (or transfer by DMA enabled, this is not the case in this example).
+ obj->handle.Init.LowPowerAutoWait = DISABLE;
+ obj->handle.Init.ContinuousConvMode = DISABLE; // Continuous mode disabled to have only 1 conversion at each conversion trig
+ obj->handle.Init.NbrOfConversion = 1; // Parameter discarded because sequencer is disabled
+ obj->handle.Init.DiscontinuousConvMode = DISABLE; // Parameter discarded because sequencer is disabled
+ obj->handle.Init.NbrOfDiscConversion = 1; // Parameter discarded because sequencer is disabled
+ obj->handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; // Software start to trig the 1st conversion manually, without external event
+ obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
+ obj->handle.Init.DMAContinuousRequests = DISABLE;
+ obj->handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; // DR register is overwritten with the last conversion result in case of overrun
+ obj->handle.Init.OversamplingMode = DISABLE; // No oversampling
- if (HAL_ADC_Init(&AdcHandle) != HAL_OK) {
+ if (HAL_ADC_Init(&obj->handle) != HAL_OK) {
error("Cannot initialize ADC\n");
}
}
@@ -107,8 +103,6 @@
{
ADC_ChannelConfTypeDef sConfig = {0};
- AdcHandle.Instance = (ADC_TypeDef *)(obj->adc);
-
// Configure ADC channel
switch (obj->channel) {
case 0:
@@ -178,13 +172,13 @@
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;
- HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
+ HAL_ADC_ConfigChannel(&obj->handle, &sConfig);
- HAL_ADC_Start(&AdcHandle); // Start conversion
+ HAL_ADC_Start(&obj->handle); // Start conversion
// Wait end of conversion and get value
- if (HAL_ADC_PollForConversion(&AdcHandle, 10) == HAL_OK) {
- return (HAL_ADC_GetValue(&AdcHandle));
+ if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) {
+ return (HAL_ADC_GetValue(&obj->handle));
} else {
return 0;
}
--- a/targets/TARGET_STM/TARGET_STM32L4/common_objects.h Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/TARGET_STM/TARGET_STM32L4/common_objects.h Wed Aug 16 18:27:13 2017 +0100
@@ -116,6 +116,12 @@
uint32_t dummy;
};
+struct analogin_s {
+ ADC_HandleTypeDef handle;
+ PinName pin;
+ uint8_t channel;
+};
+
#include "gpio_object.h"
struct dac_s {
--- a/targets/targets.json Thu Aug 03 13:13:39 2017 +0100
+++ b/targets/targets.json Wed Aug 16 18:27:13 2017 +0100
@@ -1022,9 +1022,10 @@
},
"detect_code": ["0826"],
"macros_add": ["USB_STM_HAL", "USBHOST_OTHER"],
- "device_has_add": ["CAN", "ERROR_RED", "LOWPOWERTIMER", "SERIAL_ASYNCH", "SERIAL_FC", "TRNG"],
+ "device_has_add": ["CAN", "ERROR_RED", "LOWPOWERTIMER", "SERIAL_ASYNCH", "SERIAL_FC", "TRNG", "FLASH"],
"release_versions": ["2", "5"],
- "device_name": "STM32F412ZG"
+ "device_name": "STM32F412ZG",
+ "bootloader_supported": true
},
"DISCO_F413ZH": {
"inherits": ["FAMILY_STM32"],
@@ -1680,7 +1681,7 @@
"supported_form_factors": ["ARDUINO"],
"core": "Cortex-M4F",
"extra_labels_add": ["STM32F4", "STM32F439", "STM32F439ZI","STM32F439xx", "STM32F439xI"],
- "macros": ["HSE_VALUE=24000000", "HSE_STARTUP_TIMEOUT=5000", "CB_INTERFACE_SDIO","CB_CHIP_WL18XX","SUPPORT_80211D_ALWAYS","WLAN_ENABLED","MBEDTLS_ARC4_C","MBEDTLS_DES_C","MBEDTLS_MD4_C","MBEDTLS_MD5_C","MBEDTLS_SHA1_C"],
+ "macros": ["MBEDTLS_CONFIG_HW_SUPPORT", "HSE_VALUE=24000000", "HSE_STARTUP_TIMEOUT=5000", "CB_INTERFACE_SDIO","CB_CHIP_WL18XX","SUPPORT_80211D_ALWAYS","WLAN_ENABLED","MBEDTLS_ARC4_C","MBEDTLS_DES_C","MBEDTLS_MD4_C","MBEDTLS_MD5_C","MBEDTLS_SHA1_C"],
"device_has_add": ["CAN", "EMAC", "TRNG", "FLASH"],
"device_has_remove": ["RTC", "SLEEP"],
"features": ["LWIP"],
@@ -1707,10 +1708,11 @@
}
},
"macros_add": ["RTC_LSI=1", "HSE_VALUE=12000000", "GNSSBAUD=9600"],
- "device_has_add": ["ANALOGOUT", "TRNG"],
+ "device_has_add": ["ANALOGOUT", "SERIAL_FC", "TRNG", "FLASH"],
"features": ["LWIP"],
"public": false,
- "device_name": "STM32F437VG"
+ "device_name": "STM32F437VG",
+ "bootloader_supported": true
},
"UBLOX_C030_U201": {
"inherits": ["UBLOX_C030"],
@@ -2304,10 +2306,11 @@
"MAX32630FTHR": {
"inherits": ["Target"],
"core": "Cortex-M4F",
- "macros": ["__SYSTEM_HFX=96000000", "TARGET=MAX32630", "TARGET_REV=0x4132"],
+ "macros": ["__SYSTEM_HFX=96000000", "TARGET=MAX32630", "TARGET_REV=0x4132", "BLE_HCI_UART", "OPEN_DRAIN_LEDS"],
"extra_labels": ["Maxim", "MAX32630"],
"supported_toolchains": ["GCC_ARM", "IAR", "ARM"],
"device_has": ["ANALOGIN", "ERROR_RED", "I2C", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_FC", "SLEEP", "SPI", "STDIO_MESSAGES"],
+ "features": ["BLE"],
"release_versions": ["2", "5"]
},
"EFM32": {
@@ -3162,6 +3165,7 @@
"value": "0xFFFFFFFF"
}
},
+ "OUTPUT_EXT": "hex",
"post_binary_hook": {"function": "NCS36510TargetCode.ncs36510_addfib"},
"macros": ["CM3", "CPU_NCS36510", "TARGET_NCS36510", "LOAD_ADDRESS=0x3000"],
"supported_toolchains": ["GCC_ARM", "ARM", "IAR"],
