*Merged in raiden00/nuttx_pe (pull request #778)
Improvements in STM32 ADC arch/arm/src/stm32/stm32_adc.c: start conversion on startup is now possible if TIM triggering selected. This can be useful to start ADC TIM conversion for ADC IPv2 when opening ADC device. arch/arm/src/stm32/stm32_adc.c: fix compilation errors for chips with one ADV TIM configs/nucleo-f303re: refresh ADC example configs/nucleo-f334r8: refresh ADC example Approved-by: GregoryN <gnutt@nuttx.org>
This commit is contained in:
parent
ed08cbc7f7
commit
b9a1969122
@ -1280,7 +1280,11 @@ static void tim_dumpregs(FAR struct stm32_dev_s *priv, FAR const char *msg)
|
|||||||
tim_getreg(priv, STM32_GTIM_CCR3_OFFSET),
|
tim_getreg(priv, STM32_GTIM_CCR3_OFFSET),
|
||||||
tim_getreg(priv, STM32_GTIM_CCR4_OFFSET));
|
tim_getreg(priv, STM32_GTIM_CCR4_OFFSET));
|
||||||
#if STM32_NATIM > 0
|
#if STM32_NATIM > 0
|
||||||
if (priv->tbase == STM32_TIM1_BASE || priv->tbase == STM32_TIM8_BASE)
|
if (priv->tbase == STM32_TIM1_BASE
|
||||||
|
# ifdef STM32_TIM8_BASE
|
||||||
|
|| priv->tbase == STM32_TIM8_BASE
|
||||||
|
# endif
|
||||||
|
)
|
||||||
{
|
{
|
||||||
ainfo(" RCR: %04x BDTR: %04x DCR: %04x DMAR: %04x\n",
|
ainfo(" RCR: %04x BDTR: %04x DCR: %04x DMAR: %04x\n",
|
||||||
tim_getreg(priv, STM32_ATIM_RCR_OFFSET),
|
tim_getreg(priv, STM32_ATIM_RCR_OFFSET),
|
||||||
@ -1456,7 +1460,11 @@ static int adc_timinit(FAR struct stm32_dev_s *priv)
|
|||||||
/* Clear the advanced timers repetition counter in TIM1 */
|
/* Clear the advanced timers repetition counter in TIM1 */
|
||||||
|
|
||||||
#if STM32_NATIM > 0
|
#if STM32_NATIM > 0
|
||||||
if (priv->tbase == STM32_TIM1_BASE || priv->tbase == STM32_TIM8_BASE)
|
if (priv->tbase == STM32_TIM1_BASE
|
||||||
|
# ifdef STM32_TIM8_BASE
|
||||||
|
|| priv->tbase == STM32_TIM8_BASE
|
||||||
|
# endif
|
||||||
|
)
|
||||||
{
|
{
|
||||||
tim_putreg(priv, STM32_ATIM_RCR_OFFSET, 0);
|
tim_putreg(priv, STM32_ATIM_RCR_OFFSET, 0);
|
||||||
tim_putreg(priv, STM32_ATIM_BDTR_OFFSET, ATIM_BDTR_MOE); /* Check me */
|
tim_putreg(priv, STM32_ATIM_BDTR_OFFSET, ATIM_BDTR_MOE); /* Check me */
|
||||||
@ -1610,7 +1618,11 @@ static int adc_timinit(FAR struct stm32_dev_s *priv)
|
|||||||
/* TODO: revisit and simplify logic below */
|
/* TODO: revisit and simplify logic below */
|
||||||
|
|
||||||
#if STM32_NATIM > 0
|
#if STM32_NATIM > 0
|
||||||
if (priv->tbase == STM32_TIM1_BASE || priv->tbase == STM32_TIM8_BASE)
|
if (priv->tbase == STM32_TIM1_BASE
|
||||||
|
# ifdef STM32_TIM8_BASE
|
||||||
|
|| priv->tbase == STM32_TIM8_BASE
|
||||||
|
# endif
|
||||||
|
)
|
||||||
{
|
{
|
||||||
/* Reset output N polarity level, output N state, output compare state,
|
/* Reset output N polarity level, output N state, output compare state,
|
||||||
* output compare N idle state.
|
* output compare N idle state.
|
||||||
@ -2693,66 +2705,16 @@ static void adc_dma_start(FAR struct adc_dev_s *dev)
|
|||||||
#endif /* ADC_HAVE_DMA */
|
#endif /* ADC_HAVE_DMA */
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: adc_reset
|
* Name: adc_configure
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
* Reset the ADC device. Called early to initialize the hardware.
|
|
||||||
* This is called, before adc_setup() and on error conditions.
|
|
||||||
*
|
|
||||||
* TODO: Separate the configuration logic from the reset logic!
|
|
||||||
* REVISIT: The ADC device should be configured in adc_setup not in adc_reset.
|
|
||||||
*
|
|
||||||
* Input Parameters:
|
|
||||||
*
|
|
||||||
* Returned Value:
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void adc_reset(FAR struct adc_dev_s *dev)
|
static void adc_configure(FAR struct adc_dev_s *dev)
|
||||||
{
|
{
|
||||||
FAR struct stm32_dev_s *priv = (FAR struct stm32_dev_s *)dev->ad_priv;
|
FAR struct stm32_dev_s *priv = (FAR struct stm32_dev_s *)dev->ad_priv;
|
||||||
irqstate_t flags;
|
|
||||||
#ifdef ADC_HAVE_TIMER
|
|
||||||
int ret;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ainfo("intf: %d\n", priv->intf);
|
/* Turn off the ADC before configuration */
|
||||||
flags = enter_critical_section();
|
|
||||||
|
|
||||||
#ifdef HAVE_HSI_CONTROL
|
|
||||||
/* The STM32L15XX family uses HSI as an independent clock-source
|
|
||||||
* for the ADC
|
|
||||||
*/
|
|
||||||
|
|
||||||
adc_enable_hsi(true);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(HAVE_IP_ADC_V2)
|
|
||||||
/* Turn off the ADC so we can write the RCC bits */
|
|
||||||
|
|
||||||
adc_enable(priv, false);
|
adc_enable(priv, false);
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Only if this is the first initialzied ADC instance in the ADC block */
|
|
||||||
|
|
||||||
#ifdef HAVE_ADC_CMN_DATA
|
|
||||||
adccmn_lock(priv, true);
|
|
||||||
|
|
||||||
if (priv->cmn->initialized == 0)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
/* Enable ADC reset state */
|
|
||||||
|
|
||||||
adc_rccreset(priv, true);
|
|
||||||
|
|
||||||
/* Release ADC from reset state */
|
|
||||||
|
|
||||||
adc_rccreset(priv, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_ADC_CMN_DATA
|
|
||||||
adccmn_lock(priv, false);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Configure voltage regulator if present */
|
/* Configure voltage regulator if present */
|
||||||
|
|
||||||
@ -2831,42 +2793,70 @@ static void adc_reset(FAR struct adc_dev_s *dev)
|
|||||||
|
|
||||||
adc_enable(priv, true);
|
adc_enable(priv, true);
|
||||||
|
|
||||||
#ifdef ADC_HAVE_TIMER
|
|
||||||
if (priv->tbase != 0)
|
|
||||||
{
|
|
||||||
ret = adc_timinit(priv);
|
|
||||||
if (ret < 0)
|
|
||||||
{
|
|
||||||
aerr("ERROR: adc_timinit failed: %d\n", ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* NOTE: for ADC IPv2 (J)ADSTART bit must be set to start ADC conversion
|
|
||||||
* even if hardware trigger is selected.
|
|
||||||
* This is not done here, and you probably have to call ioctl
|
|
||||||
* with ANIOC_TRIGGER before reading from ADC!
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
#ifndef CONFIG_STM32_ADC_NO_STARTUP_CONV
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#ifndef CONFIG_STM32_ADC_NO_STARTUP_CONV
|
|
||||||
{
|
|
||||||
adc_reg_startconv(priv, true);
|
|
||||||
|
|
||||||
# ifdef ADC_HAVE_INJECTED
|
|
||||||
adc_inj_startconv(priv, true);
|
|
||||||
# endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
leave_critical_section(flags);
|
|
||||||
|
|
||||||
/* Dump regs */
|
/* Dump regs */
|
||||||
|
|
||||||
adc_dumpregs(priv);
|
adc_dumpregs(priv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: adc_reset
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Reset the ADC device. Called early to initialize the hardware.
|
||||||
|
* This is called, before adc_setup() and on error conditions.
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static void adc_reset(FAR struct adc_dev_s *dev)
|
||||||
|
{
|
||||||
|
FAR struct stm32_dev_s *priv = (FAR struct stm32_dev_s *)dev->ad_priv;
|
||||||
|
irqstate_t flags;
|
||||||
|
|
||||||
|
ainfo("intf: %d\n", priv->intf);
|
||||||
|
flags = enter_critical_section();
|
||||||
|
|
||||||
|
#ifdef HAVE_HSI_CONTROL
|
||||||
|
/* The STM32L15XX family uses HSI as an independent clock-source
|
||||||
|
* for the ADC
|
||||||
|
*/
|
||||||
|
|
||||||
|
adc_enable_hsi(true);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(HAVE_IP_ADC_V2)
|
||||||
|
/* Turn off the ADC so we can write the RCC bits */
|
||||||
|
|
||||||
|
adc_enable(priv, false);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Only if this is the first initialzied ADC instance in the ADC block */
|
||||||
|
|
||||||
|
#ifdef HAVE_ADC_CMN_DATA
|
||||||
|
adccmn_lock(priv, true);
|
||||||
|
|
||||||
|
if (priv->cmn->initialized == 0)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
/* Enable ADC reset state */
|
||||||
|
|
||||||
|
adc_rccreset(priv, true);
|
||||||
|
|
||||||
|
/* Release ADC from reset state */
|
||||||
|
|
||||||
|
adc_rccreset(priv, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_ADC_CMN_DATA
|
||||||
|
adccmn_lock(priv, false);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
leave_critical_section(flags);
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: adc_reset_hsi_disable
|
* Name: adc_reset_hsi_disable
|
||||||
*
|
*
|
||||||
@ -2907,7 +2897,8 @@ static void adc_reset_hsi_disable(FAR struct adc_dev_s *dev)
|
|||||||
|
|
||||||
static int adc_setup(FAR struct adc_dev_s *dev)
|
static int adc_setup(FAR struct adc_dev_s *dev)
|
||||||
{
|
{
|
||||||
#if !defined(CONFIG_STM32_ADC_NOIRQ) || defined(HAVE_ADC_CMN_DATA)
|
#if !defined(CONFIG_STM32_ADC_NOIRQ) || defined(HAVE_ADC_CMN_DATA) || \
|
||||||
|
defined(ADC_HAVE_TIMER) || !defined(CONFIG_STM32_ADC_NO_STARTUP_CONV)
|
||||||
FAR struct stm32_dev_s *priv = (FAR struct stm32_dev_s *)dev->ad_priv;
|
FAR struct stm32_dev_s *priv = (FAR struct stm32_dev_s *)dev->ad_priv;
|
||||||
#endif
|
#endif
|
||||||
int ret = OK;
|
int ret = OK;
|
||||||
@ -2927,6 +2918,43 @@ static int adc_setup(FAR struct adc_dev_s *dev)
|
|||||||
|
|
||||||
adc_reset(dev);
|
adc_reset(dev);
|
||||||
|
|
||||||
|
/* Configure ADC device */
|
||||||
|
|
||||||
|
adc_configure(dev);
|
||||||
|
|
||||||
|
#ifdef ADC_HAVE_TIMER
|
||||||
|
/* Configure timer */
|
||||||
|
|
||||||
|
if (priv->tbase != 0)
|
||||||
|
{
|
||||||
|
ret = adc_timinit(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
aerr("ERROR: adc_timinit failed: %d\n", ret);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* As default conversion is started here.
|
||||||
|
*
|
||||||
|
* NOTE: for ADC IPv2 (J)ADSTART bit must be set to start ADC conversion
|
||||||
|
* even if hardware trigger is selected.
|
||||||
|
* This can be done here during the opening of the ADC device
|
||||||
|
* or later with ANIOC_TRIGGER ioctl call.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CONFIG_STM32_ADC_NO_STARTUP_CONV
|
||||||
|
/* Start regular conversion */
|
||||||
|
|
||||||
|
adc_reg_startconv(priv, true);
|
||||||
|
|
||||||
|
# ifdef ADC_HAVE_INJECTED
|
||||||
|
/* Start injected conversion */
|
||||||
|
|
||||||
|
adc_inj_startconv(priv, true);
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Enable the ADC interrupt */
|
/* Enable the ADC interrupt */
|
||||||
|
|
||||||
#ifndef CONFIG_STM32_ADC_NOIRQ
|
#ifndef CONFIG_STM32_ADC_NOIRQ
|
||||||
@ -2994,6 +3022,15 @@ static void adc_shutdown(FAR struct adc_dev_s *dev)
|
|||||||
adc_rccreset(priv, true);
|
adc_rccreset(priv, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ADC_HAVE_TIMER
|
||||||
|
/* Disable timer */
|
||||||
|
|
||||||
|
if (priv->tbase != 0)
|
||||||
|
{
|
||||||
|
adc_timstart(priv, false);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_ADC_CMN_DATA
|
#ifdef HAVE_ADC_CMN_DATA
|
||||||
/* Decrease instances counter */
|
/* Decrease instances counter */
|
||||||
|
|
||||||
|
@ -1,6 +1,4 @@
|
|||||||
# CONFIG_ARCH_FPU is not set
|
# CONFIG_ARCH_FPU is not set
|
||||||
# CONFIG_DEV_CONSOLE is not set
|
|
||||||
# CONFIG_SERIAL is not set
|
|
||||||
CONFIG_ADC=y
|
CONFIG_ADC=y
|
||||||
CONFIG_ANALOG=y
|
CONFIG_ANALOG=y
|
||||||
CONFIG_ARCH="arm"
|
CONFIG_ARCH="arm"
|
||||||
@ -11,17 +9,19 @@ CONFIG_ARCH_CHIP_STM32=y
|
|||||||
CONFIG_ARCH_CHIP_STM32F303RE=y
|
CONFIG_ARCH_CHIP_STM32F303RE=y
|
||||||
CONFIG_ARCH_STACKDUMP=y
|
CONFIG_ARCH_STACKDUMP=y
|
||||||
CONFIG_BOARD_LOOPSPERMSEC=6522
|
CONFIG_BOARD_LOOPSPERMSEC=6522
|
||||||
|
CONFIG_BUILTIN=y
|
||||||
CONFIG_DISABLE_POLL=y
|
CONFIG_DISABLE_POLL=y
|
||||||
CONFIG_EXAMPLES_ADC=y
|
CONFIG_EXAMPLES_ADC=y
|
||||||
CONFIG_EXAMPLES_ADC_GROUPSIZE=3
|
CONFIG_EXAMPLES_ADC_GROUPSIZE=3
|
||||||
CONFIG_EXAMPLES_ADC_SWTRIG=y
|
CONFIG_EXAMPLES_ADC_SWTRIG=y
|
||||||
CONFIG_IDLETHREAD_STACKSIZE=2048
|
CONFIG_IDLETHREAD_STACKSIZE=2048
|
||||||
CONFIG_INTELHEX_BINARY=y
|
CONFIG_INTELHEX_BINARY=y
|
||||||
CONFIG_LIB_BOARDCTL=y
|
|
||||||
CONFIG_MAX_TASKS=16
|
CONFIG_MAX_TASKS=16
|
||||||
CONFIG_MAX_WDOGPARMS=2
|
CONFIG_MAX_WDOGPARMS=2
|
||||||
CONFIG_NFILE_DESCRIPTORS=8
|
CONFIG_NFILE_DESCRIPTORS=8
|
||||||
CONFIG_NFILE_STREAMS=8
|
CONFIG_NFILE_STREAMS=8
|
||||||
|
CONFIG_NSH_ARCHINIT=y
|
||||||
|
CONFIG_NSH_BUILTIN_APPS=y
|
||||||
CONFIG_PREALLOC_MQ_MSGS=4
|
CONFIG_PREALLOC_MQ_MSGS=4
|
||||||
CONFIG_PREALLOC_TIMERS=4
|
CONFIG_PREALLOC_TIMERS=4
|
||||||
CONFIG_PREALLOC_WDOGS=8
|
CONFIG_PREALLOC_WDOGS=8
|
||||||
@ -34,8 +34,17 @@ CONFIG_SDCLONE_DISABLE=y
|
|||||||
CONFIG_START_DAY=27
|
CONFIG_START_DAY=27
|
||||||
CONFIG_START_YEAR=2013
|
CONFIG_START_YEAR=2013
|
||||||
CONFIG_STM32_ADC1=y
|
CONFIG_STM32_ADC1=y
|
||||||
CONFIG_STM32_DMA2=y
|
CONFIG_STM32_ADC1_DMA=y
|
||||||
|
CONFIG_STM32_ADC3=y
|
||||||
|
CONFIG_STM32_DMA1=y
|
||||||
|
CONFIG_STM32_FORCEPOWER=y
|
||||||
CONFIG_STM32_JTAG_SW_ENABLE=y
|
CONFIG_STM32_JTAG_SW_ENABLE=y
|
||||||
|
CONFIG_STM32_TIM1=y
|
||||||
|
CONFIG_STM32_TIM1_ADC=y
|
||||||
|
CONFIG_STM32_USART2=y
|
||||||
|
CONFIG_SYSLOG_NONE=y
|
||||||
|
CONFIG_SYSTEM_NSH=y
|
||||||
CONFIG_TASK_NAME_SIZE=0
|
CONFIG_TASK_NAME_SIZE=0
|
||||||
CONFIG_USER_ENTRYPOINT="adc_main"
|
CONFIG_USART2_SERIAL_CONSOLE=y
|
||||||
|
CONFIG_USER_ENTRYPOINT="nsh_main"
|
||||||
CONFIG_WDOG_INTRESERVE=1
|
CONFIG_WDOG_INTRESERVE=1
|
||||||
|
@ -60,16 +60,6 @@
|
|||||||
|
|
||||||
/* Configuration ************************************************************/
|
/* Configuration ************************************************************/
|
||||||
|
|
||||||
#if defined(ADC1_HAVE_DMA) && defined(CONFIG_STM32_ADC1)
|
|
||||||
# warning "ADC1 with DMA support is not fully implemented"
|
|
||||||
# undef CONFIG_STM32_ADC1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ADC2_HAVE_DMA) && defined(CONFIG_STM32_ADC2)
|
|
||||||
# warning "ADC2 with DMA support is not fully implemented"
|
|
||||||
# undef CONFIG_STM32_ADC2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (defined(CONFIG_STM32_ADC1) && defined(CONFIG_STM32_ADC2)) || \
|
#if (defined(CONFIG_STM32_ADC1) && defined(CONFIG_STM32_ADC2)) || \
|
||||||
(defined(CONFIG_STM32_ADC3) && defined(CONFIG_STM32_ADC4))
|
(defined(CONFIG_STM32_ADC3) && defined(CONFIG_STM32_ADC4))
|
||||||
# error "will not work with this combination of ADCs"
|
# error "will not work with this combination of ADCs"
|
||||||
|
@ -11,7 +11,6 @@ CONFIG_ARCH_BUTTONS=y
|
|||||||
CONFIG_ARCH_CHIP_STM32=y
|
CONFIG_ARCH_CHIP_STM32=y
|
||||||
CONFIG_ARCH_CHIP_STM32F334R8=y
|
CONFIG_ARCH_CHIP_STM32F334R8=y
|
||||||
CONFIG_ARCH_STACKDUMP=y
|
CONFIG_ARCH_STACKDUMP=y
|
||||||
CONFIG_ARMV7M_TOOLCHAIN_BUILDROOT=y
|
|
||||||
CONFIG_BOARD_LOOPSPERMSEC=16717
|
CONFIG_BOARD_LOOPSPERMSEC=16717
|
||||||
CONFIG_BUILTIN=y
|
CONFIG_BUILTIN=y
|
||||||
CONFIG_BUILTIN_PROXY_STACKSIZE=512
|
CONFIG_BUILTIN_PROXY_STACKSIZE=512
|
||||||
@ -88,9 +87,14 @@ CONFIG_START_DAY=6
|
|||||||
CONFIG_START_MONTH=12
|
CONFIG_START_MONTH=12
|
||||||
CONFIG_START_YEAR=2011
|
CONFIG_START_YEAR=2011
|
||||||
CONFIG_STM32_ADC1=y
|
CONFIG_STM32_ADC1=y
|
||||||
|
CONFIG_STM32_ADC1_DMA=y
|
||||||
|
CONFIG_STM32_ADC2=y
|
||||||
CONFIG_STM32_DMA1=y
|
CONFIG_STM32_DMA1=y
|
||||||
|
CONFIG_STM32_FORCEPOWER=y
|
||||||
CONFIG_STM32_JTAG_SW_ENABLE=y
|
CONFIG_STM32_JTAG_SW_ENABLE=y
|
||||||
CONFIG_STM32_PWR=y
|
CONFIG_STM32_PWR=y
|
||||||
|
CONFIG_STM32_TIM1=y
|
||||||
|
CONFIG_STM32_TIM1_ADC=y
|
||||||
CONFIG_STM32_USART2=y
|
CONFIG_STM32_USART2=y
|
||||||
CONFIG_SYSTEM_NSH=y
|
CONFIG_SYSTEM_NSH=y
|
||||||
CONFIG_TASK_NAME_SIZE=0
|
CONFIG_TASK_NAME_SIZE=0
|
||||||
|
Loading…
Reference in New Issue
Block a user