configs: update STM32L4 configs for ADC changes
Signed-off-by: Juha Niskanen <juha.niskanen@haltian.com>
This commit is contained in:
parent
0b2a4eb4bd
commit
0a1da7eaca
@ -329,5 +329,4 @@ Configurations
|
||||
CONFIG_HAVE_CXXINITIALIZE=y
|
||||
CONFIG_EXAMPLES_NSH_CXXINITIALIZE=y
|
||||
|
||||
And also support fo C++ constructors under
|
||||
apps/platform/nucleo-stm32f072rb.
|
||||
And also support for C++ constructors under apps/platform.
|
||||
|
@ -49,7 +49,7 @@
|
||||
#include "nucleo-f072rb.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Defintiionis
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#undef HAVE_I2C_DRIVER
|
||||
|
@ -95,7 +95,7 @@ Serial Console
|
||||
|
||||
TTL to RS-232 converter connection:
|
||||
|
||||
Nucleo CN10 STM32F072RB
|
||||
Nucleo CN10 STM32F091RC
|
||||
----------- ------------
|
||||
Pin 21 PA9 USART1_TX *Warning you make need to reverse RX/TX on
|
||||
Pin 33 PA10 USART1_RX some RS-232 converters
|
||||
@ -281,7 +281,7 @@ Configurations
|
||||
40231 92 1208 41531 a23b nuttx
|
||||
|
||||
Those additional features cost about 8KiB FLASH. I believe that is a
|
||||
good use of the STM32F072RB's FLASH, but if you interested in the
|
||||
good use of the STM32F091RC's FLASH, but if you interested in the
|
||||
more minimal configuration, here is what was changed:
|
||||
|
||||
Removed
|
||||
@ -315,5 +315,4 @@ Configurations
|
||||
CONFIG_HAVE_CXXINITIALIZE=y
|
||||
CONFIG_EXAMPLES_NSH_CXXINITIALIZE=y
|
||||
|
||||
And also support fo C++ constructors under
|
||||
apps/platform/nucleo-stm32f072rb.
|
||||
And also support for C++ constructors under apps/platform.
|
||||
|
@ -62,7 +62,7 @@
|
||||
* is we set aside more DMA channels/streams.
|
||||
*/
|
||||
|
||||
/* Values defined in arch/arm/src/stm32l4/chip/stm32l4x6xx_dma.h */
|
||||
/* Values defined in arch/arm/src/stm32l4/chip/stm32l4x3xx_dma.h */
|
||||
|
||||
#define DMACHAN_SDMMC DMACHAN_SDMMC_1 /* 2 choices */
|
||||
|
||||
@ -73,6 +73,10 @@
|
||||
|
||||
#define DMACHAN_USART1_RX DMACHAN_USART1_RX_2
|
||||
|
||||
/* ADC */
|
||||
|
||||
#define ADC1_DMA_CHAN DMACHAN_ADC1_1
|
||||
|
||||
/* Alternate function pin selections ************************************************/
|
||||
|
||||
/* USART1:
|
||||
|
@ -52,7 +52,7 @@
|
||||
#include "stm32l4_pwm.h"
|
||||
#include "nucleo-l432kc.h"
|
||||
|
||||
#ifdef CONFIG_STM32_ADC1
|
||||
#ifdef CONFIG_STM32L4_ADC1
|
||||
|
||||
/************************************************************************************
|
||||
* Pre-processor Definitions
|
||||
@ -73,20 +73,20 @@
|
||||
|
||||
#ifdef CONFIG_ADC_DMA
|
||||
|
||||
static const uint8_t g_adc1_chanlist[ADC1_NCHANNELS] = {0, 1};
|
||||
static const uint8_t g_adc1_chanlist[ADC1_NCHANNELS] = {1, 2};
|
||||
|
||||
/* Configurations of pins used byte each ADC channels */
|
||||
|
||||
static const uint32_t g_adc1_pinlist[ADC1_NCHANNELS] = {GPIO_ADC1_IN0, GPIO_ADC1_IN0};
|
||||
static const uint32_t g_adc1_pinlist[ADC1_NCHANNELS] = {GPIO_ADC1_IN1, GPIO_ADC1_IN2};
|
||||
|
||||
#else
|
||||
/* Without DMA, only a single channel can be supported */
|
||||
|
||||
static const uint8_t g_adc1_chanlist[ADC1_NCHANNELS] = {0};
|
||||
static const uint8_t g_adc1_chanlist[ADC1_NCHANNELS] = {1};
|
||||
|
||||
/* Configurations of pins used byte each ADC channels */
|
||||
|
||||
static const uint32_t g_adc1_pinlist[ADC1_NCHANNELS] = {GPIO_ADC1_IN0};
|
||||
static const uint32_t g_adc1_pinlist[ADC1_NCHANNELS] = {GPIO_ADC1_IN1};
|
||||
|
||||
#endif /* CONFIG_ADC_DMA */
|
||||
|
||||
@ -99,14 +99,14 @@ static const uint32_t g_adc1_pinlist[ADC1_NCHANNELS] = {GPIO_ADC1_IN0};
|
||||
************************************************************************************/
|
||||
|
||||
/************************************************************************************
|
||||
* Name: stm32_adc_setup
|
||||
* Name: stm32l4_adc_setup
|
||||
*
|
||||
* Description:
|
||||
* Initialize ADC and register the ADC driver.
|
||||
*
|
||||
************************************************************************************/
|
||||
|
||||
int stm32_adc_setup(void)
|
||||
int stm32l4_adc_setup(void)
|
||||
{
|
||||
struct adc_dev_s *adc;
|
||||
int ret;
|
||||
@ -116,12 +116,12 @@ int stm32_adc_setup(void)
|
||||
|
||||
for (i = 0; i < ADC1_NCHANNELS; i++)
|
||||
{
|
||||
stm32_configgpio(g_adc1_pinlist[i]);
|
||||
stm32l4_configgpio(g_adc1_pinlist[i]);
|
||||
}
|
||||
|
||||
/* Call stm32_adcinitialize() to get an instance of the ADC interface */
|
||||
/* Call stm32l4_adc_initialize() to get an instance of the ADC interface */
|
||||
|
||||
adc = stm32_adcinitialize(1, g_adc1_chanlist, ADC1_NCHANNELS);
|
||||
adc = stm32l4_adc_initialize(1, g_adc1_chanlist, ADC1_NCHANNELS);
|
||||
if (adc == NULL)
|
||||
{
|
||||
aerr("ERROR: Failed to get ADC interface\n");
|
||||
@ -140,4 +140,4 @@ int stm32_adc_setup(void)
|
||||
return OK;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_STM32_ADC1 */
|
||||
#endif /* CONFIG_STM32L4_ADC1 */
|
||||
|
@ -73,6 +73,10 @@
|
||||
|
||||
#define DMACHAN_USART1_RX DMACHAN_USART1_RX_2
|
||||
|
||||
/* ADC */
|
||||
|
||||
#define ADC1_DMA_CHAN DMACHAN_ADC1_1
|
||||
|
||||
/* Alternate function pin selections ************************************************/
|
||||
|
||||
/* USART1:
|
||||
@ -208,6 +212,14 @@
|
||||
|
||||
#define BUTTON_USER_BIT (1 << BUTTON_USER)
|
||||
|
||||
/* ADC measurements
|
||||
* Default is ADC1_IN9 (PA4) connected to CN8-connector pin 3, A2.
|
||||
*/
|
||||
|
||||
#define ADC1_MEASURE_CHANNEL 9
|
||||
#define GPIO_MEASURE_ADC (GPIO_ADC1_IN9)
|
||||
|
||||
|
||||
/* Quadrature encoder
|
||||
* Default is to use timer 5 (32-bit) and encoder on PA0/PA1
|
||||
*/
|
||||
@ -251,6 +263,7 @@ extern "C"
|
||||
/************************************************************************************
|
||||
* Public Function Prototypes
|
||||
************************************************************************************/
|
||||
|
||||
/************************************************************************************
|
||||
* Name: stm32l4_board_initialize
|
||||
*
|
||||
|
@ -1,27 +1,27 @@
|
||||
# CONFIG_ARCH_FPU is not set
|
||||
# CONFIG_NSH_ARGCAT is not set
|
||||
# CONFIG_NSH_CMDOPT_DF_H is not set
|
||||
# CONFIG_NSH_CMDPARMS is not set
|
||||
CONFIG_ADC=y
|
||||
CONFIG_ANALOG=y
|
||||
CONFIG_ARCH_BOARD_NUCLEO_L452RE=y
|
||||
CONFIG_ARCH="arm"
|
||||
CONFIG_ARCH_BOARD="nucleo-l452re"
|
||||
CONFIG_ARCH_BOARD_NUCLEO_L452RE=y
|
||||
CONFIG_ARCH_BUTTONS=y
|
||||
CONFIG_ARCH_CHIP_STM32L4=y
|
||||
CONFIG_ARCH_CHIP_STM32L452RE=y
|
||||
CONFIG_ARCH_CHIP_STM32L4=y
|
||||
# CONFIG_ARCH_FPU is not set
|
||||
CONFIG_ARCH_INTERRUPTSTACK=2048
|
||||
CONFIG_ARCH_IRQBUTTONS=y
|
||||
CONFIG_ARCH_STACKDUMP=y
|
||||
CONFIG_ARCH="arm"
|
||||
CONFIG_ARMV7M_STACKCHECK=y
|
||||
CONFIG_BOARD_LOOPSPERMSEC=8499
|
||||
CONFIG_BUILTIN=y
|
||||
CONFIG_DAC=y
|
||||
CONFIG_DEBUG_ASSERTIONS=y
|
||||
CONFIG_DEBUG_ERROR=y
|
||||
CONFIG_DEBUG_FEATURES=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_DEBUG_SYMBOLS=y
|
||||
CONFIG_DEBUG_WARN=y
|
||||
CONFIG_DISABLE_POLL=y
|
||||
CONFIG_EXAMPLES_ADC_SWTRIG=y
|
||||
CONFIG_EXAMPLES_ADC=y
|
||||
CONFIG_EXAMPLES_ALARM=y
|
||||
CONFIG_EXAMPLES_NSH_CXXINITIALIZE=y
|
||||
CONFIG_EXAMPLES_NSH=y
|
||||
@ -29,8 +29,8 @@ CONFIG_EXAMPLES_OSTEST=y
|
||||
CONFIG_EXAMPLES_RANDOM=y
|
||||
CONFIG_FS_PROCFS_REGISTER=y
|
||||
CONFIG_FS_PROCFS=y
|
||||
CONFIG_HAVE_CXX=y
|
||||
CONFIG_HAVE_CXXINITIALIZE=y
|
||||
CONFIG_HAVE_CXX=y
|
||||
CONFIG_I2C_RESET=y
|
||||
CONFIG_I2C=y
|
||||
CONFIG_MAX_TASKS=16
|
||||
@ -39,7 +39,10 @@ CONFIG_MM_REGIONS=2
|
||||
CONFIG_NFILE_DESCRIPTORS=8
|
||||
CONFIG_NFILE_STREAMS=8
|
||||
CONFIG_NSH_ARCHINIT=y
|
||||
# CONFIG_NSH_ARGCAT is not set
|
||||
CONFIG_NSH_BUILTIN_APPS=y
|
||||
# CONFIG_NSH_CMDOPT_DF_H is not set
|
||||
# CONFIG_NSH_CMDPARMS is not set
|
||||
CONFIG_NSH_DISABLE_IFUPDOWN=y
|
||||
CONFIG_NSH_FILEIOSIZE=512
|
||||
CONFIG_NSH_LINELEN=64
|
||||
@ -63,6 +66,9 @@ CONFIG_SCHED_WAITPID=y
|
||||
CONFIG_SDCLONE_DISABLE=y
|
||||
CONFIG_SERIAL_TERMIOS=y
|
||||
CONFIG_STACK_COLORATION=y
|
||||
CONFIG_STM32L4_ADC1_DMA=y
|
||||
CONFIG_STM32L4_ADC1=y
|
||||
CONFIG_STM32L4_DAC1=y
|
||||
CONFIG_STM32L4_DISABLE_IDLE_SLEEP_DURING_DEBUG=y
|
||||
CONFIG_STM32L4_DMA1=y
|
||||
CONFIG_STM32L4_DMA2=y
|
||||
|
@ -49,6 +49,14 @@ ifeq ($(CONFIG_ARCH_BUTTONS),y)
|
||||
CSRCS += stm32_buttons.c
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_ADC),y)
|
||||
CSRCS += stm32_adc.c
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_DAC),y)
|
||||
CSRCS += stm32_dac.c
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_LIB_BOARDCTL),y)
|
||||
CSRCS += stm32_appinit.c
|
||||
endif
|
||||
|
@ -129,6 +129,36 @@
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/************************************************************************************
|
||||
* Name: stm32l4_adc_setup
|
||||
*
|
||||
* Description:
|
||||
* Initialize ADC and register the ADC driver.
|
||||
*
|
||||
************************************************************************************/
|
||||
|
||||
int stm32l4_adc_setup(void);
|
||||
|
||||
/************************************************************************************
|
||||
* Name: stm32l4_adc_measure_voltages
|
||||
*
|
||||
* Description:
|
||||
* Read internal reference voltage, internal VBAT and one external voltage.
|
||||
*
|
||||
************************************************************************************/
|
||||
|
||||
int stm32l4_adc_measure_voltages(uint32_t *vrefint, uint32_t *vbat, uint32_t *vext);
|
||||
|
||||
/************************************************************************************
|
||||
* Name: stm32l4_dac_setup
|
||||
*
|
||||
* Description:
|
||||
* Initialize DAC and register the DAC driver.
|
||||
*
|
||||
************************************************************************************/
|
||||
|
||||
int stm32l4_dac_setup(void);
|
||||
|
||||
/****************************************************************************
|
||||
* Name: stm32_bringup
|
||||
*
|
||||
|
309
configs/nucleo-l452re/src/stm32_adc.c
Normal file
309
configs/nucleo-l452re/src/stm32_adc.c
Normal file
@ -0,0 +1,309 @@
|
||||
/*****************************************************************************
|
||||
* configs/nucleo-l452re/src/stm32_adc.c
|
||||
*
|
||||
* Copyright (C) 2017 Haltian Ltd. All rights reserved.
|
||||
* Authors: Juha Niskanen <juha.niskanen@haltian.com>
|
||||
*
|
||||
* 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 NuttX 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 OWNER 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.
|
||||
*
|
||||
************************************************************************************/
|
||||
|
||||
/************************************************************************************
|
||||
* Included Files
|
||||
************************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <debug.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
#include <nuttx/random.h>
|
||||
#include <nuttx/board.h>
|
||||
#include <nuttx/analog/adc.h>
|
||||
#include <nuttx/analog/ioctl.h>
|
||||
#include <arch/board/board.h>
|
||||
#include "stm32l4_gpio.h"
|
||||
#include "stm32l4_adc.h"
|
||||
#include "nucleo-l452re.h"
|
||||
|
||||
/************************************************************************************
|
||||
* Pre-processor Definitions
|
||||
************************************************************************************/
|
||||
|
||||
/* STM32 chip specific calibration values *******************************************/
|
||||
|
||||
/* Voltage used for calibration of internal analog reference voltage (Vrefint) */
|
||||
#if defined(CONFIG_ARCH_CHIP_STM32F7) \
|
||||
|| defined(CONFIG_ARCH_CHIP_STM32F4) \
|
||||
|| defined(CONFIG_ARCH_CHIP_STM32F0)
|
||||
# define STM32_VREFINT_MVOLTS ((uint32_t)3300)
|
||||
#elif defined(CONFIG_ARCH_CHIP_STM32L4) || defined(CONFIG_STM32L15XXX)
|
||||
# define STM32_VREFINT_MVOLTS ((uint32_t)3000)
|
||||
#endif
|
||||
|
||||
/* Internal reference voltage calibration value locations. Taken from
|
||||
* https://github.com/micropython/micropython/commit/87215a0f0480dd0324a1b9c1d3fc3a5c2806249d
|
||||
*
|
||||
* F0 value from DM00115237 Rev 4 p. 19. for STM32F091xB and STM32F091xC
|
||||
*
|
||||
* Note: These seems to not vary between MCUs of a given family, but
|
||||
* should nevertheless be verified from data-sheet when porting this
|
||||
* file to a new chip.
|
||||
*/
|
||||
#if defined(CONFIG_ARCH_CHIP_STM32F7)
|
||||
# define STM32_VREFINT_CAL (*(uint16_t *)((uint32_t)0x1ff0f44a))
|
||||
#elif defined(CONFIG_ARCH_CHIP_STM32F4)
|
||||
# define STM32_VREFINT_CAL (*(uint16_t *)((uint32_t)0x1fff7a2a))
|
||||
#elif defined(CONFIG_ARCH_CHIP_STM32F0)
|
||||
# define STM32_VREFINT_CAL (*(uint16_t *)((uint32_t)0x1ffff7ba))
|
||||
#elif defined(CONFIG_ARCH_CHIP_STM32L4)
|
||||
# define STM32_VREFINT_CAL (*(uint16_t *)((uint32_t)0x1fff75aa))
|
||||
#elif defined(CONFIG_STM32L15XXX)
|
||||
# define STM32_VREFINT_CAL (*(uint16_t *)((uint32_t)0x1ff800f8))
|
||||
#endif
|
||||
|
||||
/* Internal temperature sensor calibration locations. Taken from
|
||||
* STM32L452 datasheet.
|
||||
*/
|
||||
#if defined(CONFIG_ARCH_CHIP_STM32L4)
|
||||
|
||||
/* TS ADC raw data acquired at a temperature of 30 °C (± 5 °C) */
|
||||
# define STM32_TSENSE_TSCAL1 (*(int16_t *)((uint32_t)0x1fff75a8))
|
||||
|
||||
/* TS ADC raw data acquired at a temperature of 130 °C (± 5 °C) */
|
||||
|
||||
# define STM32_TSENSE_TSCAL2 (*(int16_t *)((uint32_t)0x1fff75ca))
|
||||
#endif
|
||||
|
||||
/* Configuration ********************************************************************/
|
||||
|
||||
/* These are internal to STM32L4 */
|
||||
|
||||
#define ADC1_INTERNAL_VREFINT_CHANNEL 0
|
||||
#define ADC1_INTERNAL_TSENSE_CHANNEL 17
|
||||
#define ADC1_INTERNAL_VBATDIV3_CHANNEL 18
|
||||
|
||||
/* Application specific channel defined in board.h */
|
||||
|
||||
/* The number of ADC channels in the conversion list */
|
||||
|
||||
#define ADC1_NCHANNELS 4
|
||||
|
||||
#if ADC1_NCHANNELS > 1 && !defined(CONFIG_STM32L4_ADC1_DMA)
|
||||
# warning "Reading multiple channels without DMA might cause overruns!"
|
||||
#endif
|
||||
|
||||
/************************************************************************************
|
||||
* Private Data
|
||||
************************************************************************************/
|
||||
|
||||
static struct adc_dev_s *g_adc;
|
||||
|
||||
static const uint8_t g_chanlist[ADC1_NCHANNELS] =
|
||||
{
|
||||
ADC1_INTERNAL_VREFINT_CHANNEL,
|
||||
ADC1_INTERNAL_TSENSE_CHANNEL,
|
||||
ADC1_INTERNAL_VBATDIV3_CHANNEL,
|
||||
ADC1_MEASURE_CHANNEL,
|
||||
};
|
||||
|
||||
/* Configurations of pins used by each ADC channel */
|
||||
|
||||
static const uint32_t g_pinlist[ADC1_NCHANNELS] =
|
||||
{
|
||||
0xffffffffU,
|
||||
0xffffffffU,
|
||||
0xffffffffU,
|
||||
GPIO_MEASURE_ADC,
|
||||
};
|
||||
|
||||
/************************************************************************************
|
||||
* Public Functions
|
||||
************************************************************************************/
|
||||
|
||||
/************************************************************************************
|
||||
* Name: stm32l4_adc_measure_voltages
|
||||
*
|
||||
* Description:
|
||||
* Read internal reference voltage, internal VBAT and one external voltage.
|
||||
*
|
||||
************************************************************************************/
|
||||
|
||||
int stm32l4_adc_measure_voltages(uint32_t *vrefint, uint32_t *vbat, uint32_t *vext)
|
||||
{
|
||||
ssize_t nbytes;
|
||||
struct adc_msg_s sample[ADC1_NCHANNELS] = { 0 };
|
||||
int nsamples;
|
||||
int fd, ret, errval;
|
||||
|
||||
fd = open("/dev/adc0", O_RDONLY);
|
||||
if (fd < 0)
|
||||
{
|
||||
_err("Cannot open ADC converter\n");
|
||||
ret = fd;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = ioctl(fd, ANIOC_TRIGGER, 0);
|
||||
if (ret < 0)
|
||||
{
|
||||
_err("Cannot trigger ADC conversion\n");
|
||||
goto out_close;
|
||||
}
|
||||
|
||||
nbytes = read(fd, sample, sizeof(sample));
|
||||
if (nbytes < 0)
|
||||
{
|
||||
errval = errno;
|
||||
ret = -errval;
|
||||
if (errval != EINTR)
|
||||
{
|
||||
_err("read failed: %d\n", errval);
|
||||
goto out_close;
|
||||
}
|
||||
|
||||
_info("Interrupted read...\n");
|
||||
goto out_close;
|
||||
}
|
||||
else if (nbytes == 0)
|
||||
{
|
||||
_err("No data read\n");
|
||||
ret = ERROR;
|
||||
goto out_close;
|
||||
}
|
||||
|
||||
nsamples = nbytes / sizeof(struct adc_msg_s);
|
||||
if (nsamples * sizeof(struct adc_msg_s) != nbytes)
|
||||
{
|
||||
_info("Read size=%ld is not a multiple of sample size=%d, Ignoring\n",
|
||||
(long)nbytes, sizeof(struct adc_msg_s));
|
||||
}
|
||||
else
|
||||
{
|
||||
int i;
|
||||
int32_t tsense;
|
||||
_info("Sample (nsamples = %d):\n", nsamples);
|
||||
|
||||
*vrefint = *vbat = *vext = 0;
|
||||
|
||||
for (i = 0; i < nsamples ; i++)
|
||||
{
|
||||
_info("%d: channel: %d value: %d\n",
|
||||
i+1, sample[i].am_channel, sample[i].am_data);
|
||||
|
||||
/* Add the raw value to entropy pool. */
|
||||
|
||||
add_sensor_randomness(sample[i].am_data);
|
||||
|
||||
switch (sample[i].am_channel)
|
||||
{
|
||||
case ADC1_INTERNAL_VREFINT_CHANNEL:
|
||||
/* Calculate corrected Vrefint with factory calibration value. */
|
||||
|
||||
*vrefint = STM32_VREFINT_MVOLTS * STM32_VREFINT_CAL / sample[i].am_data;
|
||||
_info("VREFINT: %d -> %u mV\n", sample[i].am_data, *vrefint);
|
||||
break;
|
||||
case ADC1_INTERNAL_TSENSE_CHANNEL:
|
||||
/* Calculate final temperature. Sensor precision is ±2 °C,
|
||||
* so it does not matter much if we use integer type here.
|
||||
*/
|
||||
|
||||
tsense = (110 - 30) * (sample[i].am_data - STM32_TSENSE_TSCAL1)
|
||||
/ (STM32_TSENSE_TSCAL2 - STM32_TSENSE_TSCAL1) + 30;
|
||||
_info("TSENSE: %d -> %d °C\n", sample[i].am_data, tsense);
|
||||
break;
|
||||
case ADC1_INTERNAL_VBATDIV3_CHANNEL:
|
||||
*vbat = 3 * sample[i].am_data;
|
||||
_info("VBAT/3: %d -> %u mV\n", sample[i].am_data, *vbat);
|
||||
break;
|
||||
case ADC1_MEASURE_CHANNEL:
|
||||
*vext = sample[i].am_data;
|
||||
_info("External channel: %d\n", *vext);
|
||||
break;
|
||||
default:
|
||||
_err("ADC got value from unknown channel %d\n", sample[i].am_channel);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
out_close:
|
||||
close(fd);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/************************************************************************************
|
||||
* Name: stm32l4_adc_setup
|
||||
************************************************************************************/
|
||||
|
||||
int stm32l4_adc_setup(void)
|
||||
{
|
||||
static bool initialized = false;
|
||||
|
||||
if (!initialized)
|
||||
{
|
||||
#ifdef CONFIG_STM32L4_ADC1
|
||||
int ret, i;
|
||||
|
||||
/* Configure the pins as analog inputs for the selected channels */
|
||||
|
||||
for (i = 0; i < ADC1_NCHANNELS; i++)
|
||||
{
|
||||
if (g_pinlist[i] != 0xffffffffU)
|
||||
{
|
||||
stm32l4_configgpio(g_pinlist[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/* Call stm32l4_adc_initialize() to get an instance of the ADC interface */
|
||||
|
||||
g_adc = stm32l4_adc_initialize(1, g_chanlist, ADC1_NCHANNELS);
|
||||
if (g_adc == NULL)
|
||||
{
|
||||
_err("Failed to get ADC interface\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* Register the ADC driver at "/dev/adc0" */
|
||||
|
||||
ret = adc_register("/dev/adc0", g_adc);
|
||||
if (ret < 0)
|
||||
{
|
||||
_err("adc_register failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
@ -112,6 +112,18 @@ int stm32_bringup(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_DAC
|
||||
_info("Initializing DAC\n");
|
||||
|
||||
(void)stm32l4_dac_setup();
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ADC
|
||||
_info("Initializing ADC\n");
|
||||
|
||||
(void)stm32l4_adc_setup();
|
||||
#endif
|
||||
|
||||
UNUSED(ret);
|
||||
return OK;
|
||||
}
|
||||
|
94
configs/nucleo-l452re/src/stm32_dac.c
Normal file
94
configs/nucleo-l452re/src/stm32_dac.c
Normal file
@ -0,0 +1,94 @@
|
||||
/*****************************************************************************
|
||||
* configs/nucleo-l452re/src/stm32_dac.c
|
||||
*
|
||||
* Copyright (C) 2017 Haltian Ltd. All rights reserved.
|
||||
* Authors: Juha Niskanen <juha.niskanen@haltian.com>
|
||||
*
|
||||
* 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 NuttX 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 OWNER 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.
|
||||
*
|
||||
************************************************************************************/
|
||||
|
||||
/************************************************************************************
|
||||
* Included Files
|
||||
************************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
#include <errno.h>
|
||||
#include <debug.h>
|
||||
|
||||
#include <nuttx/board.h>
|
||||
#include <nuttx/analog/dac.h>
|
||||
#include <arch/board/board.h>
|
||||
#include "stm32l4_gpio.h"
|
||||
#include "stm32l4_dac.h"
|
||||
#include "nucleo-l452re.h"
|
||||
|
||||
/************************************************************************************
|
||||
* Private Data
|
||||
************************************************************************************/
|
||||
|
||||
static struct dac_dev_s *g_dac;
|
||||
|
||||
/************************************************************************************
|
||||
* Public Functions
|
||||
************************************************************************************/
|
||||
|
||||
/************************************************************************************
|
||||
* Name: stm32l4_dac_setup
|
||||
************************************************************************************/
|
||||
|
||||
int stm32l4_dac_setup(void)
|
||||
{
|
||||
static bool initialized = false;
|
||||
|
||||
if (!initialized)
|
||||
{
|
||||
#ifdef CONFIG_STM32L4_DAC1
|
||||
int ret;
|
||||
|
||||
g_dac = stm32l4_dacinitialize(0);
|
||||
if (g_dac == NULL)
|
||||
{
|
||||
_err("Failed to get DAC interface\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* Register the DAC driver at "/dev/dac0" */
|
||||
|
||||
ret = dac_register("/dev/dac0", g_dac);
|
||||
if (ret < 0)
|
||||
{
|
||||
_err("dac_register failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
@ -73,6 +73,12 @@
|
||||
|
||||
#define DMACHAN_USART1_RX DMACHAN_USART1_RX_2
|
||||
|
||||
/* ADC */
|
||||
|
||||
#define ADC1_DMA_CHAN DMACHAN_ADC1_1
|
||||
#define ADC2_DMA_CHAN DMACHAN_ADC2_2
|
||||
#define ADC3_DMA_CHAN DMACHAN_ADC3_2
|
||||
|
||||
/* Alternate function pin selections ************************************************/
|
||||
|
||||
/* USART1:
|
||||
|
@ -52,7 +52,7 @@
|
||||
#include "stm32l4_pwm.h"
|
||||
#include "nucleo-l476rg.h"
|
||||
|
||||
#ifdef CONFIG_STM32_ADC1
|
||||
#ifdef CONFIG_STM32L4_ADC1
|
||||
|
||||
/************************************************************************************
|
||||
* Pre-processor Definitions
|
||||
@ -73,24 +73,24 @@
|
||||
|
||||
#ifdef CONFIG_AJOYSTICK
|
||||
#ifdef CONFIG_ADC_DMA
|
||||
/* The Itead analog joystick gets inputs on ADC_IN0 and ADC_IN1 */
|
||||
/* The Itead analog joystick gets inputs on ADC_IN1 and ADC_IN2 */
|
||||
|
||||
static const uint8_t g_adc1_chanlist[ADC1_NCHANNELS] = {0, 1};
|
||||
static const uint8_t g_adc1_chanlist[ADC1_NCHANNELS] = {1, 2};
|
||||
|
||||
/* Configurations of pins used byte each ADC channels */
|
||||
|
||||
static const uint32_t g_adc1_pinlist[ADC1_NCHANNELS] = {GPIO_ADC1_IN0, GPIO_ADC1_IN0};
|
||||
static const uint32_t g_adc1_pinlist[ADC1_NCHANNELS] = {GPIO_ADC1_IN1, GPIO_ADC1_IN2};
|
||||
|
||||
#else
|
||||
/* Without DMA, only a single channel can be supported */
|
||||
|
||||
/* The Itead analog joystick gets input on ADC_IN0 */
|
||||
/* The Itead analog joystick gets input on ADC_IN1 */
|
||||
|
||||
static const uint8_t g_adc1_chanlist[ADC1_NCHANNELS] = {0};
|
||||
static const uint8_t g_adc1_chanlist[ADC1_NCHANNELS] = {1};
|
||||
|
||||
/* Configurations of pins used byte each ADC channels */
|
||||
|
||||
static const uint32_t g_adc1_pinlist[ADC1_NCHANNELS] = {GPIO_ADC1_IN0};
|
||||
static const uint32_t g_adc1_pinlist[ADC1_NCHANNELS] = {GPIO_ADC1_IN1};
|
||||
|
||||
#endif /* CONFIG_ADC_DMA */
|
||||
#endif /* CONFIG_AJOYSTICK */
|
||||
@ -104,14 +104,14 @@ static const uint32_t g_adc1_pinlist[ADC1_NCHANNELS] = {GPIO_ADC1_IN0};
|
||||
************************************************************************************/
|
||||
|
||||
/************************************************************************************
|
||||
* Name: stm32_adc_setup
|
||||
* Name: stm32l4_adc_setup
|
||||
*
|
||||
* Description:
|
||||
* Initialize ADC and register the ADC driver.
|
||||
*
|
||||
************************************************************************************/
|
||||
|
||||
int stm32_adc_setup(void)
|
||||
int stm32l4_adc_setup(void)
|
||||
{
|
||||
struct adc_dev_s *adc;
|
||||
int ret;
|
||||
@ -121,12 +121,12 @@ int stm32_adc_setup(void)
|
||||
|
||||
for (i = 0; i < ADC1_NCHANNELS; i++)
|
||||
{
|
||||
stm32_configgpio(g_adc1_pinlist[i]);
|
||||
stm32l4_configgpio(g_adc1_pinlist[i]);
|
||||
}
|
||||
|
||||
/* Call stm32_adcinitialize() to get an instance of the ADC interface */
|
||||
/* Call stm32l4_adc_initialize() to get an instance of the ADC interface */
|
||||
|
||||
adc = stm32_adcinitialize(1, g_adc1_chanlist, ADC1_NCHANNELS);
|
||||
adc = stm32l4_adc_initialize(1, g_adc1_chanlist, ADC1_NCHANNELS);
|
||||
if (adc == NULL)
|
||||
{
|
||||
aerr("ERROR: Failed to get ADC interface\n");
|
||||
@ -145,4 +145,4 @@ int stm32_adc_setup(void)
|
||||
return OK;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_STM32_ADC1 */
|
||||
#endif /* CONFIG_STM32L4_ADC1 */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/****************************************************************************
|
||||
* configs/nucleo-f3x1re/src/stm32_ajoystick.c
|
||||
* configs/nucleo-l476rg/src/stm32_ajoystick.c
|
||||
*
|
||||
* Copyright (C) 2014, 2016 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
@ -62,8 +62,8 @@
|
||||
# if !defined(CONFIG_ADC)
|
||||
# error CONFIG_ADC is required for the Itead joystick
|
||||
# undef CONFIG_AJOYSTICK
|
||||
# elif !defined(CONFIG_STM32_ADC1)
|
||||
# error CONFIG_STM32_ADC1 is required for Itead joystick
|
||||
# elif !defined(CONFIG_STM32L4_ADC1)
|
||||
# error CONFIG_STM32L4_ADC1 is required for Itead joystick
|
||||
# undef CONFIG_AJOYSTICK
|
||||
# endif
|
||||
#endif /* CONFIG_AJOYSTICK */
|
||||
@ -305,7 +305,7 @@ static ajoy_buttonset_t ajoy_buttons(FAR const struct ajoy_lowerhalf_s *lower)
|
||||
* button is pressed.
|
||||
*/
|
||||
|
||||
if (!stm32_gpioread(g_joygpio[i]))
|
||||
if (!stm32l4_gpioread(g_joygpio[i]))
|
||||
{
|
||||
ret |= (1 << i);
|
||||
}
|
||||
@ -375,8 +375,8 @@ static void ajoy_enable(FAR const struct ajoy_lowerhalf_s *lower,
|
||||
iinfo("GPIO %d: rising: %d falling: %d\n",
|
||||
i, rising, falling);
|
||||
|
||||
(void)stm32_gpiosetevent(g_joygpio[i], rising, falling,
|
||||
true, ajoy_interrupt, NULL);
|
||||
(void)stm32l4_gpiosetevent(g_joygpio[i], rising, falling,
|
||||
true, ajoy_interrupt, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -402,7 +402,7 @@ static void ajoy_disable(void)
|
||||
flags = up_irq_save();
|
||||
for (i = 0; i < AJOY_NGPIOS; i++)
|
||||
{
|
||||
(void)stm32_gpiosetevent(g_joygpio[i], false, false, false, NULL, NULL);
|
||||
(void)stm32l4_gpiosetevent(g_joygpio[i], false, false, false, NULL, NULL);
|
||||
}
|
||||
|
||||
up_irq_restore(flags);
|
||||
@ -481,14 +481,14 @@ int board_ajoy_initialize(void)
|
||||
|
||||
/* Configure the GPIO pins as interrupting inputs. NOTE: This is
|
||||
* unnecessary for interrupting pins since it will also be done by
|
||||
* stm32_gpiosetevent().
|
||||
* stm32l4_gpiosetevent().
|
||||
*/
|
||||
|
||||
for (i = 0; i < AJOY_NGPIOS; i++)
|
||||
{
|
||||
/* Configure the PIO as an input */
|
||||
|
||||
stm32_configgpio(g_joygpio[i]);
|
||||
stm32l4_configgpio(g_joygpio[i]);
|
||||
}
|
||||
|
||||
/* Register the joystick device as /dev/ajoy0 */
|
||||
|
@ -71,7 +71,7 @@ void board_button_initialize(void)
|
||||
* also configured for the pin.
|
||||
*/
|
||||
|
||||
stm32_configgpio(GPIO_BTN_USER);
|
||||
stm32l4_configgpio(GPIO_BTN_USER);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -84,7 +84,7 @@ uint32_t board_buttons(void)
|
||||
* pressed.
|
||||
*/
|
||||
|
||||
bool released = stm32_gpioread(GPIO_BTN_USER);
|
||||
bool released = stm32l4_gpioread(GPIO_BTN_USER);
|
||||
return !released;
|
||||
}
|
||||
|
||||
@ -117,7 +117,7 @@ int board_button_irq(int id, xcpt_t irqhandler, FAR void *arg)
|
||||
|
||||
if (id == BUTTON_USER)
|
||||
{
|
||||
ret = stm32_gpiosetevent(GPIO_BTN_USER, true, true, true, irqhandler, arg);
|
||||
ret = stm32l4_gpiosetevent(GPIO_BTN_USER, true, true, true, irqhandler, arg);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
@ -2,9 +2,7 @@ README
|
||||
======
|
||||
|
||||
This README discusses issues unique to NuttX configurations for the STMicro
|
||||
Nucleo-144 board. See
|
||||
|
||||
http://www.st.com/content/ccc/resource/technical/document/data_brief/group0/7b/df/1d/e9/64/55/43/8d/DM00247910/files/DM00247910.pdf/jcr:content/translations/en.DM00247910.pdf
|
||||
Nucleo-144 board for STM32L4 chips.
|
||||
|
||||
Contents
|
||||
========
|
||||
@ -40,7 +38,7 @@ LQFP144 package. Variants include
|
||||
|
||||
------------- ------------------
|
||||
|
||||
This directory supports the L4 variants of Nucleo-144
|
||||
This directory supports the STM32L4 variants of Nucleo-144.
|
||||
|
||||
Please read the User Manual UM2179: Getting started with STM32 Nucleo board
|
||||
software development tools and take note of the Powering options for the
|
||||
@ -218,97 +216,64 @@ Flashing RED - In the event of a fatal crash, all other LEDs will be
|
||||
|
||||
Serial Consoles
|
||||
===============
|
||||
< Section needs updating >
|
||||
|
||||
USART6 (CONFIG_NUCLEO_CONSOLE_ARDUINO)
|
||||
USART3
|
||||
------
|
||||
STM32F7
|
||||
ARDUIONO FUNCTION GPIO
|
||||
-- ----- --------- -----
|
||||
DO RX USART6_RX PG9
|
||||
D1 TX USART6_TX PG14
|
||||
-- ----- --------- -----
|
||||
|
||||
You must use a 3.3 TTL to RS-232 converter or a USB to 3.3V TTL
|
||||
|
||||
Nucleo 144 FTDI TTL-232R-3V3
|
||||
------------- -------------------
|
||||
TXD - D1-TXD - RXD - Pin 5 (Yellow)
|
||||
RXD - D0-RXD - TXD - Pin 4 (Orange)
|
||||
GND GND - GND Pin 1 (Black)
|
||||
------------- -------------------
|
||||
|
||||
*Note you will be reverse RX/TX
|
||||
|
||||
Use make menuconfig to configure USART6 as the console:
|
||||
|
||||
CONFIG_STM32F7_USART6=y
|
||||
CONFIG_USARTs_SERIALDRIVER=y
|
||||
CONFIG_USARTS_SERIAL_CONSOLE=y
|
||||
CONFIG_USART6_RXBUFSIZE=256
|
||||
CONFIG_USART6_TXBUFSIZE=256
|
||||
CONFIG_USART6_BAUD=115200
|
||||
CONFIG_USART6_BITS=8
|
||||
CONFIG_USART6_PARITY=0
|
||||
CONFIG_USART6_2STOP=0
|
||||
|
||||
USART8 (CONFIG_NUCLEO_CONSOLE_MORPHO)
|
||||
------
|
||||
Default board is configured to use USART3 as console.
|
||||
|
||||
Pins and Connectors:
|
||||
|
||||
FUNC GPIO Connector
|
||||
Pin NAME
|
||||
---- --- ------- ----
|
||||
TXD: PE1 CN11-61, PE1
|
||||
RXD: PE0 CN12-64, PE0
|
||||
CN10-33, D34
|
||||
TXD: PC4 CN8-9, A4
|
||||
RXD: PC5 CN8-11, A5
|
||||
---- --- ------- ----
|
||||
|
||||
|
||||
You must use a 3.3 TTL to RS-232 converter or a USB to 3.3V TTL
|
||||
|
||||
Nucleo 144 FTDI TTL-232R-3V3
|
||||
------------- -------------------
|
||||
TXD - CN11-61 - RXD - Pin 5 (Yellow)
|
||||
RXD - CN12-64 - TXD - Pin 4 (Orange)
|
||||
GND CN12-63 - GND Pin 1 (Black)
|
||||
TXD - CN8-9 - RXD - Pin 5 (Yellow)
|
||||
RXD - CN8-11 - TXD - Pin 4 (Orange)
|
||||
GND - GND Pin 1 (Black)
|
||||
------------- -------------------
|
||||
|
||||
*Note you will be reverse RX/TX
|
||||
|
||||
Use make menuconfig to configure USART8 as the console:
|
||||
Use make menuconfig to configure USART3 as the console:
|
||||
|
||||
CONFIG_STM32L4_UART8=y
|
||||
CONFIG_UART8_SERIALDRIVER=y
|
||||
CONFIG_UART8_SERIAL_CONSOLE=y
|
||||
CONFIG_UART8_RXBUFSIZE=256
|
||||
CONFIG_UART8_TXBUFSIZE=256
|
||||
CONFIG_UART8_BAUD=115200
|
||||
CONFIG_UART8_BITS=8
|
||||
CONFIG_UART8_PARITY=0
|
||||
CONFIG_UART8_2STOP=0
|
||||
CONFIG_STM32L4_USART3=y
|
||||
CONFIG_USART3_SERIALDRIVER=y
|
||||
CONFIG_USART3_SERIAL_CONSOLE=y
|
||||
CONFIG_USART3_RXBUFSIZE=256
|
||||
CONFIG_USART3_TXBUFSIZE=256
|
||||
CONFIG_USART3_BAUD=115200
|
||||
CONFIG_USART3_BITS=8
|
||||
CONFIG_USART3_PARITY=0
|
||||
CONFIG_USART3_2STOP=0
|
||||
|
||||
Virtual COM Port (CONFIG_NUCLEO_CONSOLE_VIRTUAL)
|
||||
USART2
|
||||
------
|
||||
|
||||
USART 2 could be used as console as well.
|
||||
|
||||
Virtual COM Port
|
||||
----------------
|
||||
Yet another option is to use USART3 and the USB virtual COM port. This
|
||||
Yet another option is to use LPUART1 and the USB virtual COM port. This
|
||||
option may be more convenient for long term development, but is painful
|
||||
to use during board bring-up.
|
||||
to use during board bring-up. However as LPUART peripheral has not been
|
||||
implemented for STM32L4, this cannot currently be used.
|
||||
|
||||
Solder Bridges. This configuration requires:
|
||||
|
||||
PD8 USART3 TX SB5 ON and SB7 OFF (Default)
|
||||
PD9 USART3 RX SB6 ON and SB4 OFF (Default)
|
||||
|
||||
Configuring USART3 is the same as given above but add the S and #3.
|
||||
|
||||
Question: What BAUD should be configure to interface with the Virtual
|
||||
COM port? 115200 8N1?
|
||||
PG7 LPUART1 TX SB131 ON and SB195 OFF (Default)
|
||||
PG8 LPUART1 RX SB130 ON and SB193 OFF (Default)
|
||||
|
||||
Default
|
||||
-------
|
||||
As shipped, SB4 and SB7 are open and SB5 and SB6 closed, so the
|
||||
virtual COM port is enabled.
|
||||
|
||||
As shipped, the virtual COM port is enabled.
|
||||
|
||||
SPI
|
||||
---
|
||||
@ -320,7 +285,7 @@ SPI
|
||||
|
||||
SDIO
|
||||
----
|
||||
To test the SD performace one can use a SparkFun microSD Sniffer
|
||||
To test the SD performance one can use a SparkFun microSD Sniffer
|
||||
from https://www.sparkfun.com/products/9419 or similar board
|
||||
and connect it as follows:
|
||||
|
||||
@ -371,8 +336,8 @@ nsh:
|
||||
CONFIG_HOST_LINUX=y : Builds under Linux
|
||||
CONFIG_ARMV7M_TOOLCHAIN_GNU_EABIL=y : ARM GNU for Linux
|
||||
|
||||
3. Although the default console is USART3 (which would correspond to
|
||||
3. Although the default console is LPUART1 (which would correspond to
|
||||
the Virtual COM port) I have done all testing with the console
|
||||
device configured for UART8 (see instruction above under "Serial
|
||||
device configured for USART3 (see instruction above under "Serial
|
||||
Consoles).
|
||||
|
||||
|
@ -365,8 +365,8 @@
|
||||
/* ADC */
|
||||
|
||||
#define ADC1_DMA_CHAN DMACHAN_ADC1_1
|
||||
#define ADC2_DMA_CHAN DMACHAN_ADC2_1
|
||||
#define ADC3_DMA_CHAN DMACHAN_ADC3_1
|
||||
#define ADC2_DMA_CHAN DMACHAN_ADC2_2
|
||||
#define ADC3_DMA_CHAN DMACHAN_ADC3_2
|
||||
|
||||
/* SPI
|
||||
*
|
||||
|
@ -1,17 +1,15 @@
|
||||
# CONFIG_ARCH_FPU is not set
|
||||
# CONFIG_NSH_ARGCAT is not set
|
||||
# CONFIG_NSH_CMDOPT_DF_H is not set
|
||||
# CONFIG_NSH_CMDPARMS is not set
|
||||
CONFIG_ADC=y
|
||||
CONFIG_ANALOG=y
|
||||
CONFIG_ARCH_BOARD_NUCLEO_L496ZG=y
|
||||
CONFIG_ARCH="arm"
|
||||
CONFIG_ARCH_BOARD="nucleo-l496zg"
|
||||
CONFIG_ARCH_BOARD_NUCLEO_L496ZG=y
|
||||
CONFIG_ARCH_BUTTONS=y
|
||||
CONFIG_ARCH_CHIP_STM32L4=y
|
||||
CONFIG_ARCH_CHIP_STM32L496ZG=y
|
||||
CONFIG_ARCH_CHIP_STM32L4=y
|
||||
# CONFIG_ARCH_FPU is not set
|
||||
CONFIG_ARCH_INTERRUPTSTACK=2048
|
||||
CONFIG_ARCH_IRQBUTTONS=y
|
||||
CONFIG_ARCH_STACKDUMP=y
|
||||
CONFIG_ARCH="arm"
|
||||
CONFIG_ARMV7M_STACKCHECK=y
|
||||
CONFIG_BOARD_LOOPSPERMSEC=8499
|
||||
CONFIG_BUILTIN=y
|
||||
@ -22,6 +20,8 @@ CONFIG_DEBUG_INFO=y
|
||||
CONFIG_DEBUG_SYMBOLS=y
|
||||
CONFIG_DEBUG_WARN=y
|
||||
CONFIG_DISABLE_POLL=y
|
||||
CONFIG_EXAMPLES_ADC_SWTRIG=y
|
||||
CONFIG_EXAMPLES_ADC=y
|
||||
CONFIG_EXAMPLES_ALARM=y
|
||||
CONFIG_EXAMPLES_NSH_CXXINITIALIZE=y
|
||||
CONFIG_EXAMPLES_NSH=y
|
||||
@ -29,8 +29,8 @@ CONFIG_EXAMPLES_OSTEST=y
|
||||
CONFIG_EXAMPLES_RANDOM=y
|
||||
CONFIG_FS_PROCFS_REGISTER=y
|
||||
CONFIG_FS_PROCFS=y
|
||||
CONFIG_HAVE_CXX=y
|
||||
CONFIG_HAVE_CXXINITIALIZE=y
|
||||
CONFIG_HAVE_CXX=y
|
||||
CONFIG_I2C_RESET=y
|
||||
CONFIG_I2C=y
|
||||
CONFIG_MAX_TASKS=16
|
||||
@ -39,7 +39,10 @@ CONFIG_MM_REGIONS=2
|
||||
CONFIG_NFILE_DESCRIPTORS=8
|
||||
CONFIG_NFILE_STREAMS=8
|
||||
CONFIG_NSH_ARCHINIT=y
|
||||
# CONFIG_NSH_ARGCAT is not set
|
||||
CONFIG_NSH_BUILTIN_APPS=y
|
||||
# CONFIG_NSH_CMDOPT_DF_H is not set
|
||||
# CONFIG_NSH_CMDPARMS is not set
|
||||
CONFIG_NSH_DISABLE_IFUPDOWN=y
|
||||
CONFIG_NSH_FILEIOSIZE=512
|
||||
CONFIG_NSH_LINELEN=64
|
||||
@ -63,7 +66,13 @@ CONFIG_SCHED_WAITPID=y
|
||||
CONFIG_SDCLONE_DISABLE=y
|
||||
CONFIG_SERIAL_TERMIOS=y
|
||||
CONFIG_STACK_COLORATION=y
|
||||
CONFIG_STM32L4_ADC1_DMA=y
|
||||
CONFIG_STM32L4_ADC1_SAMPLE_FREQUENCY=1000
|
||||
CONFIG_STM32L4_ADC1=y
|
||||
CONFIG_STM32L4_ADC2_DMA=y
|
||||
CONFIG_STM32L4_ADC2=y
|
||||
CONFIG_STM32L4_ADC3_DMA=y
|
||||
CONFIG_STM32L4_ADC3=y
|
||||
CONFIG_STM32L4_DISABLE_IDLE_SLEEP_DURING_DEBUG=y
|
||||
CONFIG_STM32L4_DMA1=y
|
||||
CONFIG_STM32L4_DMA2=y
|
||||
@ -81,6 +90,8 @@ CONFIG_STM32L4_SPI1=y
|
||||
CONFIG_STM32L4_SPI2=y
|
||||
CONFIG_STM32L4_SPI3=y
|
||||
CONFIG_STM32L4_SRAM2_HEAP=y
|
||||
CONFIG_STM32L4_TIM1_ADC=y
|
||||
CONFIG_STM32L4_TIM1=y
|
||||
CONFIG_STM32L4_USART2=y
|
||||
CONFIG_STM32L4_USART3=y
|
||||
CONFIG_SYSTEM_I2CTOOL=y
|
||||
|
@ -1,5 +1,5 @@
|
||||
/************************************************************************************
|
||||
* configs/nucleo-144/src/stm32_adc.c
|
||||
* configs/nucleo-l496zg/src/stm32_adc.c
|
||||
*
|
||||
* Copyright (C) 2016 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
@ -73,13 +73,12 @@
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_STM32L4_ADC1) || defined(CONFIG_STM32L4_ADC2) || defined(CONFIG_STM32L4_ADC3)
|
||||
#ifndef CONFIG_STM32L4_ADC1
|
||||
# warning "Channel information only available for ADC1"
|
||||
#endif
|
||||
|
||||
/* The number of ADC channels in the conversion list */
|
||||
|
||||
#define ADC1_NCHANNELS 1
|
||||
#define ADC2_NCHANNELS 3
|
||||
#define ADC3_NCHANNELS 2
|
||||
|
||||
/************************************************************************************
|
||||
* Private Data
|
||||
@ -91,16 +90,26 @@
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_STM32L4_ADC1
|
||||
static const uint8_t g_chanlist[ADC1_NCHANNELS] = {3};
|
||||
static const uint8_t g_chanlist_adc1[ADC1_NCHANNELS] = {3};
|
||||
|
||||
/* Configurations of pins used byte each ADC channels
|
||||
/* Configurations of pins used by each ADC channels
|
||||
*
|
||||
* {GPIO_ADC1_IN1, GPIO_ADC1_IN2, GPIO_ADC1_IN3, GPIO_ADC1_IN4, GPIO_ADC1_IN5,
|
||||
* GPIO_ADC1_IN6, GPIO_ADC1_IN7, GPIO_ADC1_IN8, GPIO_ADC1_IN9, GPIO_ADC1_IN10,
|
||||
* GPIO_ADC1_IN11, GPIO_ADC1_IN12, GPIO_ADC1_IN13, GPIO_ADC1_IN15};
|
||||
*/
|
||||
|
||||
static const uint32_t g_pinlist[ADC1_NCHANNELS] = {GPIO_ADC1_IN3};
|
||||
static const uint32_t g_pinlist_adc1[ADC1_NCHANNELS] = {GPIO_ADC1_IN3};
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_STM32L4_ADC2
|
||||
static const uint8_t g_chanlist_adc2[ADC2_NCHANNELS] = {4,17,18}; /* IN4, DAC1 and DAC2 */
|
||||
static const uint32_t g_pinlist_adc2[ADC2_NCHANNELS] = {GPIO_ADC1_IN4, 0, 0};
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_STM32L4_ADC3
|
||||
static const uint8_t g_chanlist_adc3[ADC3_NCHANNELS] = {17,18}; /* TS and VBAT/3 */
|
||||
static const uint32_t g_pinlist_adc3[ADC3_NCHANNELS] = {0,0};
|
||||
#endif
|
||||
|
||||
/************************************************************************************
|
||||
@ -121,7 +130,6 @@ static const uint32_t g_pinlist[ADC1_NCHANNELS] = {GPIO_ADC1_IN3};
|
||||
|
||||
int stm32_adc_setup(void)
|
||||
{
|
||||
#ifdef CONFIG_STM32L4_ADC1
|
||||
static bool initialized = false;
|
||||
struct adc_dev_s *adc;
|
||||
int ret;
|
||||
@ -133,20 +141,43 @@ int stm32_adc_setup(void)
|
||||
{
|
||||
/* Configure the pins as analog inputs for the selected channels */
|
||||
|
||||
#ifdef CONFIG_STM32L4_ADC1
|
||||
for (i = 0; i < ADC1_NCHANNELS; i++)
|
||||
{
|
||||
if (g_pinlist[i] != 0)
|
||||
if (g_pinlist_adc1[i] != 0)
|
||||
{
|
||||
stm32l4_configgpio(g_pinlist[i]);
|
||||
stm32l4_configgpio(g_pinlist_adc1[i]);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Call stm32_adcinitialize() to get an instance of the ADC interface */
|
||||
#ifdef CONFIG_STM32L4_ADC2
|
||||
for (i = 0; i < ADC2_NCHANNELS; i++)
|
||||
{
|
||||
if (g_pinlist_adc2[i] != 0)
|
||||
{
|
||||
stm32l4_configgpio(g_pinlist_adc2[i]);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
adc = stm32l4_adc_initialize(1, g_chanlist, ADC1_NCHANNELS);
|
||||
#ifdef CONFIG_STM32L4_ADC3
|
||||
for (i = 0; i < ADC3_NCHANNELS; i++)
|
||||
{
|
||||
if (g_pinlist_adc3[i] != 0)
|
||||
{
|
||||
stm32l4_configgpio(g_pinlist_adc3[i]);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Call stm32l4_adc_initialize() to get an instance of the ADC interface */
|
||||
|
||||
#ifdef CONFIG_STM32L4_ADC1
|
||||
adc = stm32l4_adc_initialize(1, g_chanlist_adc1, ADC1_NCHANNELS);
|
||||
if (adc == NULL)
|
||||
{
|
||||
aerr("ERROR: Failed to get ADC interface\n");
|
||||
aerr("ERROR: Failed to get ADC1 interface\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@ -158,6 +189,43 @@ int stm32_adc_setup(void)
|
||||
aerr("ERROR: adc_register failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_STM32L4_ADC2
|
||||
adc = stm32l4_adc_initialize(2, g_chanlist_adc2, ADC2_NCHANNELS);
|
||||
if (adc == NULL)
|
||||
{
|
||||
aerr("ERROR: Failed to get ADC2 interface\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* Register the ADC driver at "/dev/adc1" */
|
||||
|
||||
ret = adc_register("/dev/adc1", adc);
|
||||
if (ret < 0)
|
||||
{
|
||||
aerr("ERROR: adc_register failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_STM32L4_ADC3
|
||||
adc = stm32l4_adc_initialize(3, g_chanlist_adc3, ADC3_NCHANNELS);
|
||||
if (adc == NULL)
|
||||
{
|
||||
aerr("ERROR: Failed to get ADC3 interface\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* Register the ADC driver at "/dev/adc2" */
|
||||
|
||||
ret = adc_register("/dev/adc2", adc);
|
||||
if (ret < 0)
|
||||
{
|
||||
aerr("ERROR: adc_register failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Now we are initialized */
|
||||
|
||||
@ -165,9 +233,6 @@ int stm32_adc_setup(void)
|
||||
}
|
||||
|
||||
return OK;
|
||||
#else
|
||||
return -ENOSYS;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* CONFIG_STM32L4_ADC1 || CONFIG_STM32L4_ADC2 || CONFIG_STM32L4_ADC3 */
|
||||
|
@ -222,18 +222,5 @@ void stm32l4_board_clockconfig(void)
|
||||
stm32l4_pwr_enableclk(true);
|
||||
stm32l4_rcc_enablelse();
|
||||
#endif
|
||||
|
||||
/* XXX sanity if sdmmc1 or usb or rng, then we need to set the clk48 source
|
||||
* and then we can also do away with STM32L4_USE_CLK48, and give better
|
||||
* warning messages
|
||||
*
|
||||
* XXX sanity if our STM32L4_CLK48_SEL is YYY then we need to have already
|
||||
* enabled ZZZ
|
||||
*/
|
||||
|
||||
regval = getreg32(STM32L4_RCC_CCIPR);
|
||||
regval &= RCC_CCIPR_CLK48SEL_MASK;
|
||||
regval |= STM32L4_CLK48_SEL;
|
||||
putreg32(regval, STM32L4_RCC_CCIPR);
|
||||
}
|
||||
#endif
|
||||
|
@ -222,18 +222,5 @@ void stm32l4_board_clockconfig(void)
|
||||
stm32l4_pwr_enableclk(true);
|
||||
stm32l4_rcc_enablelse();
|
||||
#endif
|
||||
|
||||
/* XXX sanity if sdmmc1 or usb or rng, then we need to set the clk48 source
|
||||
* and then we can also do away with STM32L4_USE_CLK48, and give better
|
||||
* warning messages
|
||||
*
|
||||
* XXX sanity if our STM32L4_CLK48_SEL is YYY then we need to have already
|
||||
* enabled ZZZ
|
||||
*/
|
||||
|
||||
regval = getreg32(STM32L4_RCC_CCIPR);
|
||||
regval &= RCC_CCIPR_CLK48SEL_MASK;
|
||||
regval |= STM32L4_CLK48_SEL;
|
||||
putreg32(regval, STM32L4_RCC_CCIPR);
|
||||
}
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user