Merged in david_s5/nuttx/master_h7 (pull request #900)

stm32 h7 Add ADC and a few fixes for timer and Serial

* stm32h7:Fix error when SINGLEWIRE or CONFIG_STM32H7_SERIALBRK_BSDCOMPAT defined

* stm32h7:time fixed compile errors with TIM13,TIM14, TIM7

* stm32h7:Added ADC Driver

* stmh7x3:Added ADC pins to pin map

* stm32h7:Added ADC clocking

* nucleo-h743zi:Add ADC

Approved-by: Gregory Nutt <gnutt@nuttx.org>
This commit is contained in:
David Sidrane 2019-06-13 19:51:12 +00:00 committed by Gregory Nutt
parent 9e622bd9a4
commit 81e17306d1
13 changed files with 4290 additions and 29 deletions

View File

@ -143,6 +143,20 @@ config STM32H7_USART
default n
# These are the peripheral selections proper
config STM32H7_ADC1
bool "ADC1"
default n
select STM32H7_ADC
config STM32H7_ADC2
bool "ADC2"
default n
select STM32H7_ADC
config STM32H7_ADC3
bool "ADC3"
default n
select STM32H7_ADC
config STM32H7_DMA1
bool "DMA1"
@ -2841,6 +2855,354 @@ config STM32H7_PWM_MULTICHAN
Specifies that the PWM driver supports multiple output
channels per timer.
config STM32H7_TIM1_ADC
bool "TIM1 ADC"
default n
depends on STM32H7_TIM1 && STM32H7_ADC
---help---
Reserve timer 1 for use by an ADC
Timer devices may be used for different purposes. If STM32H7_TIM1 is
defined then the following may also be defined to indicate that the
timer is intended to be used for ADC conversion. Note that ADC usage
requires two definition: Not only do you have to assign the timer
for used by the ADC, but then you also have to configure which ADC
channel it is assigned to.
choice
prompt "Select ADC for use with TIM1"
default STM32H7_TIM1_ADC1
depends on STM32H7_TIM1_ADC
config STM32H7_TIM1_ADC1
bool "Use TIM1 for ADC1"
depends on STM32H7_ADC1
select STM32H7_HAVE_ADC1_TIMER
---help---
Reserve TIM1 to trigger ADC1
config STM32H7_TIM1_ADC2
bool "Use TIM1 for ADC2"
depends on STM32H7_ADC2
select STM32H7_HAVE_ADC2_TIMER
---help---
Reserve TIM1 to trigger ADC2
config STM32H7_TIM1_ADC3
bool "Use TIM1 for ADC3"
depends on STM32H7_ADC3
select STM32H7_HAVE_ADC3_TIMER
---help---
Reserve TIM1 to trigger ADC3
endchoice
config STM32H7_TIM2_ADC
bool "TIM2 ADC"
default n
depends on STM32H7_TIM2 && STM32H7_ADC
---help---
Reserve timer 2 for use by an ADC
Timer devices may be used for different purposes. If STM32H7_TIM2 is
defined then the following may also be defined to indicate that the
timer is intended to be used for ADC conversion. Note that ADC usage
requires two definition: Not only do you have to assign the timer
for used by the ADC, but then you also have to configure which ADC
channel it is assigned to.
choice
prompt "Select ADC for use with TIM2"
default STM32H7_TIM2_ADC1
depends on STM32H7_TIM2_ADC
config STM32H7_TIM2_ADC1
bool "Use TIM2 for ADC1"
depends on STM32H7_ADC1
select STM32H7_HAVE_ADC1_TIMER
---help---
Reserve TIM2 to trigger ADC1
config STM32H7_TIM2_ADC2
bool "Use TIM2 for ADC2"
depends on STM32H7_ADC2
select STM32H7_HAVE_ADC2_TIMER
---help---
Reserve TIM2 to trigger ADC2
config STM32H7_TIM2_ADC3
bool "Use TIM2 for ADC3"
depends on STM32H7_ADC3
select STM32H7_HAVE_ADC3_TIMER
---help---
Reserve TIM2 to trigger ADC3
endchoice
config STM32H7_TIM3_ADC
bool "TIM3 ADC"
default n
depends on STM32H7_TIM3 && STM32H7_ADC
---help---
Reserve timer 3 for use by an ADC
Timer devices may be used for different purposes. If STM32H7_TIM3 is
defined then the following may also be defined to indicate that the
timer is intended to be used for ADC conversion. Note that ADC usage
requires two definition: Not only do you have to assign the timer
for used by the ADC, but then you also have to configure which ADC
channel it is assigned to.
choice
prompt "Select ADC for use with TIM3"
default STM32H7_TIM3_ADC1
depends on STM32H7_TIM3_ADC
config STM32H7_TIM3_ADC1
bool "Use TIM3 for ADC1"
depends on STM32H7_ADC1
select STM32H7_HAVE_ADC1_TIMER
---help---
Reserve TIM3 to trigger ADC1
config STM32H7_TIM3_ADC2
bool "Use TIM3 for ADC2"
depends on STM32H7_ADC2
select STM32H7_HAVE_ADC2_TIMER
---help---
Reserve TIM3 to trigger ADC2
config STM32H7_TIM3_ADC3
bool "Use TIM3 for ADC3"
depends on STM32H7_ADC3
select STM32H7_HAVE_ADC3_TIMER
---help---
Reserve TIM3 to trigger ADC3
endchoice
config STM32H7_TIM4_ADC
bool "TIM4 ADC"
default n
depends on STM32H7_TIM4 && STM32H7_ADC
---help---
Reserve timer 4 for use by ADC
Timer devices may be used for different purposes. If STM32H7_TIM4 is
defined then the following may also be defined to indicate that the
timer is intended to be used for ADC conversion. Note that ADC usage
requires two definition: Not only do you have to assign the timer
for used by the ADC, but then you also have to configure which ADC
channel it is assigned to.
choice
prompt "Select ADC for use with TIM4"
default STM32H7_TIM4_ADC1
depends on STM32H7_TIM4_ADC
config STM32H7_TIM4_ADC1
bool "Use TIM4 for ADC1"
depends on STM32H7_ADC1
select STM32H7_HAVE_ADC1_TIMER
---help---
Reserve TIM4 to trigger ADC1
config STM32H7_TIM4_ADC2
bool "Use TIM4 for ADC2"
depends on STM32H7_ADC2
select STM32H7_HAVE_ADC2_TIMER
---help---
Reserve TIM4 to trigger ADC2
config STM32H7_TIM4_ADC3
bool "Use TIM4 for ADC3"
depends on STM32H7_ADC3
select STM32H7_HAVE_ADC3_TIMER
---help---
Reserve TIM4 to trigger ADC3
endchoice
config STM32H7_TIM6_ADC
bool "TIM6 ADC"
default n
depends on STM32H7_TIM6 && STM32H7_ADC
---help---
Reserve timer 6 for use by ADC
Timer devices may be used for different purposes. If STM32H7_TIM6 is
defined then the following may also be defined to indicate that the
timer is intended to be used for ADC conversion. Note that ADC usage
requires two definition: Not only do you have to assign the timer
for used by the ADC, but then you also have to configure which ADC
channel it is assigned to.
choice
prompt "Select ADC for use with TIM6"
default STM32H7_TIM6_ADC1
depends on STM32H7_TIM6_ADC
config STM32H7_TIM6_ADC1
bool "Use TIM6 for ADC1"
depends on STM32H7_ADC1
select STM32H7_HAVE_ADC1_TIMER
---help---
Reserve TIM6 to trigger ADC1
config STM32H7_TIM6_ADC2
bool "Use TIM6 for ADC2"
depends on STM32H7_ADC2
select STM32H7_HAVE_ADC2_TIMER
---help---
Reserve TIM6 to trigger ADC2
config STM32H7_TIM6_ADC3
bool "Use TIM6 for ADC3"
depends on STM32H7_ADC3
select STM32H7_HAVE_ADC3_TIMER
---help---
Reserve TIM6 to trigger ADC3
endchoice
config STM32H7_TIM8_ADC
bool "TIM8 ADC"
default n
depends on STM32H7_TIM8 && STM32H7_ADC
---help---
Reserve timer 8 for use by ADC
Timer devices may be used for different purposes. If STM32H7_TIM8 is
defined then the following may also be defined to indicate that the
timer is intended to be used for ADC conversion. Note that ADC usage
requires two definition: Not only do you have to assign the timer
for used by the ADC, but then you also have to configure which ADC
channel it is assigned to.
choice
prompt "Select ADC for use with TIM8"
default STM32H7_TIM8_ADC1
depends on STM32H7_TIM8_ADC
config STM32H7_TIM8_ADC1
bool "Use TIM8 for ADC1"
depends on STM32H7_ADC1
select STM32H7_HAVE_ADC1_TIMER
---help---
Reserve TIM8 to trigger ADC1
config STM32H7_TIM8_ADC2
bool "Use TIM8 for ADC2"
depends on STM32H7_ADC2
select STM32H7_HAVE_ADC2_TIMER
---help---
Reserve TIM8 to trigger ADC2
config STM32H7_TIM8_ADC3
bool "Use TIM8 for ADC3"
depends on STM32H7_ADC3
select STM32H7_HAVE_ADC3_TIMER
---help---
Reserve TIM8 to trigger ADC3
endchoice
config STM32H7_TIM15_ADC
bool "TIM15 ADC"
default n
depends on STM32H7_TIM15 && STM32H7_ADC
---help---
Reserve timer 15 for use by ADC
Timer devices may be used for different purposes. If STM32H7_TIM15 is
defined then the following may also be defined to indicate that the
timer is intended to be used for ADC conversion. Note that ADC usage
requires two definition: Not only do you have to assign the timer
for used by the ADC, but then you also have to configure which ADC
channel it is assigned to.
choice
prompt "Select ADC for use with TIM15"
default STM32H7_TIM15_ADC1
depends on STM32H7_TIM15_ADC
config STM32H7_TIM15_ADC1
bool "Use TIM15 for ADC1"
depends on STM32H7_ADC1
select STM32H7_HAVE_ADC1_TIMER
---help---
Reserve TIM15 to trigger ADC1
config STM32H7_TIM15_ADC2
bool "Use TIM15 for ADC2"
depends on STM32H7_ADC2
select STM32H7_HAVE_ADC2_TIMER
---help---
Reserve TIM15 to trigger ADC2
config STM32H7_TIM15_ADC3
bool "Use TIM15 for ADC3"
depends on STM32H7_ADC3
select STM32H7_HAVE_ADC3_TIMER
---help---
Reserve TIM15 to trigger ADC3
endchoice
config STM32H7_HAVE_ADC1_TIMER
bool
config STM32H7_HAVE_ADC2_TIMER
bool
config STM32H7_HAVE_ADC3_TIMER
bool
config STM32H7_ADC1_SAMPLE_FREQUENCY
int "ADC1 Sampling Frequency"
default 100
depends on STM32H7_HAVE_ADC1_TIMER
---help---
ADC1 sampling frequency. Default: 100Hz
config STM32H7_ADC1_TIMTRIG
int "ADC1 Timer Trigger"
default 0
range 0 4
depends on STM32H7_HAVE_ADC1_TIMER
---help---
Values 0:CC1 1:CC2 2:CC3 3:CC4 4:TRGO
config STM32H7_ADC2_SAMPLE_FREQUENCY
int "ADC2 Sampling Frequency"
default 100
depends on STM32H7_HAVE_ADC2_TIMER
---help---
ADC2 sampling frequency. Default: 100Hz
config STM32H7_ADC2_TIMTRIG
int "ADC2 Timer Trigger"
default 0
range 0 4
depends on STM32H7_HAVE_ADC2_TIMER
---help---
Values 0:CC1 1:CC2 2:CC3 3:CC4 4:TRGO
config STM32H7_ADC3_SAMPLE_FREQUENCY
int "ADC3 Sampling Frequency"
default 100
depends on STM32H7_HAVE_ADC3_TIMER
---help---
ADC3 sampling frequency. Default: 100Hz
config STM32H7_ADC3_TIMTRIG
int "ADC3 Timer Trigger"
default 0
range 0 4
depends on STM32H7_HAVE_ADC3_TIMER
---help---
Values 0:CC1 1:CC2 2:CC3 3:CC4 4:TRGO
config STM32H7_TIM1_CAP
bool "TIM1 Capture"
default n

View File

@ -102,6 +102,10 @@ ifeq ($(CONFIG_BUILD_PROTECTED),y)
CHIP_CSRCS += stm32_userspace.c stm32_mpuinit.c
endif
ifeq ($(CONFIG_STM32H7_ADC),y)
CHIP_CSRCS += stm32_adc.c
endif
ifeq ($(CONFIG_STM32H7_DMA),y)
CHIP_CSRCS += stm32_dma.c
endif

View File

@ -0,0 +1,740 @@
/************************************************************************************
* arch/arm/src/stm32h7/hardware/stm32_adc.h
*
* Copyright (C) 2017,2019 Gregory Nutt. All rights reserved.
* Authors: Gregory Nutt <gnutt@nuttx.org>
* Juha Niskanen <juha.niskanen@haltian.com>
* David Sidrane <david.sidrane@nscdg.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.
*
************************************************************************************/
#ifndef __ARCH_ARM_SRC_STM32H7_HARDWARE_STM32_ADC_H
#define __ARCH_ARM_SRC_STM32H7_HARDWARE_STM32_ADC_H
/************************************************************************************
* Included Files
************************************************************************************/
#include <nuttx/config.h>
#include "chip.h"
/************************************************************************************
* Pre-processor Definitions
************************************************************************************/
#define STM32_ADC1_OFFSET 0x0000
#define STM32_ADC2_OFFSET 0x0100
#define STM32_ADCCMN_OFFSET 0x0300
#define STM32_ADC1_BASE (STM32_ADC1_OFFSET+STM32_ADC12_BASE) /* ADC1 Master ADC */
#define STM32_ADC2_BASE (STM32_ADC2_OFFSET+STM32_ADC12_BASE) /* ADC2 Slave ADC */
/* Register Offsets *****************************************************************/
/* Register Offsets for each ADC (ADC1-3). At offset 0x0000 for master and offset 0x0100
* for slave.
*/
#define STM32_ADC_ISR_OFFSET 0x0000 /* ADC interrupt and status register */
#define STM32_ADC_IER_OFFSET 0x0004 /* ADC interrupt enable register */
#define STM32_ADC_CR_OFFSET 0x0008 /* ADC control register */
#define STM32_ADC_CFGR_OFFSET 0x000c /* ADC configuration register */
#define STM32_ADC_CFGR2_OFFSET 0x0010 /* ADC configuration register 2 */
#define STM32_ADC_SMPR1_OFFSET 0x0014 /* ADC sample time register 1 */
#define STM32_ADC_SMPR2_OFFSET 0x0018 /* ADC sample time register 2 */
#define STM32_ADC_PCSEL_OFFSET 0x001c /* ADC Channel preselection register */
#define STM32_ADC_LTR1_OFFSET 0x0020 /* ADC watchdog lower threshold register 1 */
#define STM32_ADC_HTR1_OFFSET 0x0024 /* ADC watchdog higher threshold register 1 */
#define STM32_ADC_SQR1_OFFSET 0x0030 /* ADC regular sequence register 1 */
#define STM32_ADC_SQR2_OFFSET 0x0034 /* ADC regular sequence register 2 */
#define STM32_ADC_SQR3_OFFSET 0x0038 /* ADC regular sequence register 3 */
#define STM32_ADC_SQR4_OFFSET 0x003c /* ADC regular sequence register 4 */
#define STM32_ADC_DR_OFFSET 0x0040 /* ADC regular data register */
#define STM32_ADC_JSQR_OFFSET 0x004c /* ADC injected sequence register */
#define STM32_ADC_OFR1_OFFSET 0x0060 /* ADC offset register 1 */
#define STM32_ADC_OFR2_OFFSET 0x0064 /* ADC offset register 2 */
#define STM32_ADC_OFR3_OFFSET 0x0068 /* ADC offset register 3 */
#define STM32_ADC_OFR4_OFFSET 0x006c /* ADC offset register 4 */
#define STM32_ADC_JDR1_OFFSET 0x0080 /* ADC injected data register 1 */
#define STM32_ADC_JDR2_OFFSET 0x0084 /* ADC injected data register 2 */
#define STM32_ADC_JDR3_OFFSET 0x0088 /* ADC injected data register 3 */
#define STM32_ADC_JDR4_OFFSET 0x008c /* ADC injected data register 4 */
#define STM32_ADC_AWD2CR_OFFSET 0x00a0 /* ADC analog watchdog 2 configuration register */
#define STM32_ADC_AWD3CR_OFFSET 0x00a4 /* ADC analog watchdog 3 configuration register */
#define STM32_ADC_LTR2_OFFSET 0x00b0 /* ADC watchdog lower threshold register 2 */
#define STM32_ADC_HTR2_OFFSET 0x00b4 /* ADC watchdog higher threshold register 2 */
#define STM32_ADC_LTR3_OFFSET 0x00b8 /* ADC watchdog lower threshold register 3 */
#define STM32_ADC_HTR3_OFFSET 0x00bc /* ADC watchdog higher threshold register 3 */
#define STM32_ADC_DIFSEL_OFFSET 0x00c0 /* ADC differential mode selection register 2 */
#define STM32_ADC_CALFACT_OFFSET 0x00c4 /* ADC calibration factors register */
#define STM32_ADC_CALFACT2_OFFSET 0x00c8 /* ADC calibration factors register 2 */
/* Master and Slave ADC Common Registers */
#define STM32_ADCX_CSR_OFFSET 0x0000 /* Common status register */
#define STM32_ADCX_CCR_OFFSET 0x0008 /* Common control register */
#define STM32_ADCX_CDR_OFFSET 0x000c /* Common regular data register for dual mode */
#define STM32_ADCX_CDR2_OFFSET 0x0010 /* Common regular data register for 32-bit dual mode */
#define STM32_ADC_CSR_OFFSET (STM32_ADCCMN_OFFSET+STM32_ADCX_CSR_OFFSET)
#define STM32_ADC_CCR_OFFSET (STM32_ADCCMN_OFFSET+STM32_ADCX_CCR_OFFSET)
#define STM32_ADC_CDR_OFFSET (STM32_ADCCMN_OFFSET+STM32_ADCX_CDR_OFFSET)
#define STM32_ADC_CDR2_OFFSET (STM32_ADCCMN_OFFSET+STM32_ADCX_CDR2_OFFSET)
/* Register Addresses ***************************************************************/
#define STM32_ADC1_ISR (STM32_ADC1_BASE+STM32_ADC_ISR_OFFSET)
#define STM32_ADC1_IER (STM32_ADC1_BASE+STM32_ADC_IER_OFFSET)
#define STM32_ADC1_CR (STM32_ADC1_BASE+STM32_ADC_CR_OFFSET)
#define STM32_ADC1_CFGR (STM32_ADC1_BASE+STM32_ADC_CFGR_OFFSET)
#define STM32_ADC1_CFGR2 (STM32_ADC1_BASE+STM32_ADC_CFGR2_OFFSET)
#define STM32_ADC1_SMPR1 (STM32_ADC1_BASE+STM32_ADC_SMPR1_OFFSET)
#define STM32_ADC1_SMPR2 (STM32_ADC1_BASE+STM32_ADC_SMPR2_OFFSET)
#define STM32_ADC1_PCSEL (STM32_ADC1_BASE+STM32_ADC_PCSEL_OFFSET)
#define STM32_ADC1_LTR1 (STM32_ADC1_BASE+STM32_ADC_LTR1_OFFSET)
#define STM32_ADC1_HTR1 (STM32_ADC1_BASE+STM32_ADC_HTR1_OFFSET)
#define STM32_ADC1_SQR1 (STM32_ADC1_BASE+STM32_ADC_SQR1_OFFSET)
#define STM32_ADC1_SQR2 (STM32_ADC1_BASE+STM32_ADC_SQR2_OFFSET)
#define STM32_ADC1_SQR3 (STM32_ADC1_BASE+STM32_ADC_SQR3_OFFSET)
#define STM32_ADC1_SQR4 (STM32_ADC1_BASE+STM32_ADC_SQR4_OFFSET)
#define STM32_ADC1_DR (STM32_ADC1_BASE+STM32_ADC_DR_OFFSET)
#define STM32_ADC1_JSQR (STM32_ADC1_BASE+STM32_ADC_JSQR_OFFSET)
#define STM32_ADC1_OFR1 (STM32_ADC1_BASE+STM32_ADC_OFR1_OFFSET)
#define STM32_ADC1_OFR2 (STM32_ADC1_BASE+STM32_ADC_OFR2_OFFSET)
#define STM32_ADC1_OFR3 (STM32_ADC1_BASE+STM32_ADC_OFR3_OFFSET)
#define STM32_ADC1_OFR4 (STM32_ADC1_BASE+STM32_ADC_OFR4_OFFSET)
#define STM32_ADC1_JDR1 (STM32_ADC1_BASE+STM32_ADC_JDR1_OFFSET)
#define STM32_ADC1_JDR2 (STM32_ADC1_BASE+STM32_ADC_JDR2_OFFSET)
#define STM32_ADC1_JDR3 (STM32_ADC1_BASE+STM32_ADC_JDR3_OFFSET)
#define STM32_ADC1_JDR4 (STM32_ADC1_BASE+STM32_ADC_JDR4_OFFSET)
#define STM32_ADC1_AWD2CR (STM32_ADC1_BASE+STM32_ADC_AWD2CR_OFFSET)
#define STM32_ADC1_AWD3CR (STM32_ADC1_BASE+STM32_ADC_AWD3CR_OFFSET)
#define STM32_ADC1_LTR2 (STM32_ADC1_BASE+STM32_ADC_LTR2_OFFSET)
#define STM32_ADC1_HTR2 (STM32_ADC1_BASE+STM32_ADC_HTR2_OFFSET)
#define STM32_ADC1_LTR3 (STM32_ADC1_BASE+STM32_ADC_LTR3_OFFSET)
#define STM32_ADC1_HTR3 (STM32_ADC1_BASE+STM32_ADC_HTR3_OFFSET)
#define STM32_ADC1_DIFSEL (STM32_ADC1_BASE+STM32_ADC_DIFSEL_OFFSET)
#define STM32_ADC1_CALFACT (STM32_ADC1_BASE+STM32_ADC_CALFACT_OFFSET)
#define STM32_ADC1_CALFACT2 (STM32_ADC1_BASE+STM32_ADC_CALFACT2_OFFSET)
#define STM32_ADC1_CSR (STM32_ADC1_BASE+STM32_ADC_CSR_OFFSET)
#define STM32_ADC1_CCR (STM32_ADC1_BASE+STM32_ADC_CCR_OFFSET)
#define STM32_ADC1_CDR (STM32_ADC1_BASE+STM32_ADC_CDR_OFFSET)
#define STM32_ADC1_CDR2 (STM32_ADC1_BASE+STM32_ADC_CDR2_OFFSET)
#define STM32_ADC2_ISR (STM32_ADC2_BASE+STM32_ADC_ISR_OFFSET)
#define STM32_ADC2_IER (STM32_ADC2_BASE+STM32_ADC_IER_OFFSET)
#define STM32_ADC2_CR (STM32_ADC2_BASE+STM32_ADC_CR_OFFSET)
#define STM32_ADC2_CFGR (STM32_ADC2_BASE+STM32_ADC_CFGR_OFFSET)
#define STM32_ADC2_CFGR2 (STM32_ADC2_BASE+STM32_ADC_CFGR2_OFFSET)
#define STM32_ADC2_SMPR1 (STM32_ADC2_BASE+STM32_ADC_SMPR1_OFFSET)
#define STM32_ADC2_SMPR2 (STM32_ADC2_BASE+STM32_ADC_SMPR2_OFFSET)
#define STM32_ADC2_PCSEL (STM32_ADC2_BASE+STM32_ADC_PCSEL_OFFSET)
#define STM32_ADC2_LTR1 (STM32_ADC2_BASE+STM32_ADC_LTR1_OFFSET)
#define STM32_ADC2_HTR1 (STM32_ADC2_BASE+STM32_ADC_HTR1_OFFSET)
#define STM32_ADC2_SQR1 (STM32_ADC2_BASE+STM32_ADC_SQR1_OFFSET)
#define STM32_ADC2_SQR2 (STM32_ADC2_BASE+STM32_ADC_SQR2_OFFSET)
#define STM32_ADC2_SQR3 (STM32_ADC2_BASE+STM32_ADC_SQR3_OFFSET)
#define STM32_ADC2_SQR4 (STM32_ADC2_BASE+STM32_ADC_SQR4_OFFSET)
#define STM32_ADC2_DR (STM32_ADC2_BASE+STM32_ADC_DR_OFFSET)
#define STM32_ADC2_JSQR (STM32_ADC2_BASE+STM32_ADC_JSQR_OFFSET)
#define STM32_ADC2_OFR1 (STM32_ADC2_BASE+STM32_ADC_OFR1_OFFSET)
#define STM32_ADC2_OFR2 (STM32_ADC2_BASE+STM32_ADC_OFR2_OFFSET)
#define STM32_ADC2_OFR3 (STM32_ADC2_BASE+STM32_ADC_OFR3_OFFSET)
#define STM32_ADC2_OFR4 (STM32_ADC2_BASE+STM32_ADC_OFR4_OFFSET)
#define STM32_ADC2_JDR1 (STM32_ADC2_BASE+STM32_ADC_JDR1_OFFSET)
#define STM32_ADC2_JDR2 (STM32_ADC2_BASE+STM32_ADC_JDR2_OFFSET)
#define STM32_ADC2_JDR3 (STM32_ADC2_BASE+STM32_ADC_JDR3_OFFSET)
#define STM32_ADC2_JDR4 (STM32_ADC2_BASE+STM32_ADC_JDR4_OFFSET)
#define STM32_ADC2_AWD2CR (STM32_ADC2_BASE+STM32_ADC_AWD2CR_OFFSET)
#define STM32_ADC2_AWD3CR (STM32_ADC2_BASE+STM32_ADC_AWD3CR_OFFSET)
#define STM32_ADC2_LTR2 (STM32_ADC2_BASE+STM32_ADC_LTR2_OFFSET)
#define STM32_ADC2_HTR2 (STM32_ADC2_BASE+STM32_ADC_HTR2_OFFSET)
#define STM32_ADC2_LTR3 (STM32_ADC2_BASE+STM32_ADC_LTR3_OFFSET)
#define STM32_ADC2_HTR3 (STM32_ADC2_BASE+STM32_ADC_HTR3_OFFSET)
#define STM32_ADC2_DIFSEL (STM32_ADC2_BASE+STM32_ADC_DIFSEL_OFFSET)
#define STM32_ADC2_CALFACT (STM32_ADC2_BASE+STM32_ADC_CALFACT_OFFSET)
#define STM32_ADC2_CALFACT2 (STM32_ADC2_BASE+STM32_ADC_CALFACT2_OFFSET)
/* Common for ADC 1 and 2 */
#define STM32_ADC2_CSR (STM32_ADC1_BASE+STM32_ADC_CSR_OFFSET)
#define STM32_ADC2_CCR (STM32_ADC1_BASE+STM32_ADC_CCR_OFFSET)
#define STM32_ADC2_CDR (STM32_ADC1_BASE+STM32_ADC_CDR_OFFSET)
#define STM32_ADC2_CDR2 (STM32_ADC1_BASE+STM32_ADC_CDR2_OFFSET)
#define STM32_ADC3_ISR (STM32_ADC3_BASE+STM32_ADC_ISR_OFFSET)
#define STM32_ADC3_IER (STM32_ADC3_BASE+STM32_ADC_IER_OFFSET)
#define STM32_ADC3_CR (STM32_ADC3_BASE+STM32_ADC_CR_OFFSET)
#define STM32_ADC3_CFGR (STM32_ADC3_BASE+STM32_ADC_CFGR_OFFSET)
#define STM32_ADC3_CFGR2 (STM32_ADC3_BASE+STM32_ADC_CFGR2_OFFSET)
#define STM32_ADC3_SMPR1 (STM32_ADC3_BASE+STM32_ADC_SMPR1_OFFSET)
#define STM32_ADC3_SMPR2 (STM32_ADC3_BASE+STM32_ADC_SMPR2_OFFSET)
#define STM32_ADC3_PCSEL (STM32_ADC3_BASE+STM32_ADC_PCSEL_OFFSET)
#define STM32_ADC3_LTR1 (STM32_ADC3_BASE+STM32_ADC_LTR1_OFFSET)
#define STM32_ADC3_HTR1 (STM32_ADC3_BASE+STM32_ADC_HTR1_OFFSET)
#define STM32_ADC3_SQR1 (STM32_ADC3_BASE+STM32_ADC_SQR1_OFFSET)
#define STM32_ADC3_SQR2 (STM32_ADC3_BASE+STM32_ADC_SQR2_OFFSET)
#define STM32_ADC3_SQR3 (STM32_ADC3_BASE+STM32_ADC_SQR3_OFFSET)
#define STM32_ADC3_SQR4 (STM32_ADC3_BASE+STM32_ADC_SQR4_OFFSET)
#define STM32_ADC3_DR (STM32_ADC3_BASE+STM32_ADC_DR_OFFSET)
#define STM32_ADC3_JSQR (STM32_ADC3_BASE+STM32_ADC_JSQR_OFFSET)
#define STM32_ADC3_OFR1 (STM32_ADC3_BASE+STM32_ADC_OFR1_OFFSET)
#define STM32_ADC3_OFR2 (STM32_ADC3_BASE+STM32_ADC_OFR2_OFFSET)
#define STM32_ADC3_OFR3 (STM32_ADC3_BASE+STM32_ADC_OFR3_OFFSET)
#define STM32_ADC3_OFR4 (STM32_ADC3_BASE+STM32_ADC_OFR4_OFFSET)
#define STM32_ADC3_JDR1 (STM32_ADC3_BASE+STM32_ADC_JDR1_OFFSET)
#define STM32_ADC3_JDR2 (STM32_ADC3_BASE+STM32_ADC_JDR2_OFFSET)
#define STM32_ADC3_JDR3 (STM32_ADC3_BASE+STM32_ADC_JDR3_OFFSET)
#define STM32_ADC3_JDR4 (STM32_ADC3_BASE+STM32_ADC_JDR4_OFFSET)
#define STM32_ADC3_AWD2CR (STM32_ADC3_BASE+STM32_ADC_AWD2CR_OFFSET)
#define STM32_ADC3_AWD3CR (STM32_ADC3_BASE+STM32_ADC_AWD3CR_OFFSET)
#define STM32_ADC3_LTR2 (STM32_ADC3_BASE+STM32_ADC_LTR2_OFFSET)
#define STM32_ADC3_HTR2 (STM32_ADC3_BASE+STM32_ADC_HTR2_OFFSET)
#define STM32_ADC3_LTR3 (STM32_ADC3_BASE+STM32_ADC_LTR3_OFFSET)
#define STM32_ADC3_HTR3 (STM32_ADC3_BASE+STM32_ADC_HTR3_OFFSET)
#define STM32_ADC3_DIFSEL (STM32_ADC3_BASE+STM32_ADC_DIFSEL_OFFSET)
#define STM32_ADC3_CALFACT (STM32_ADC3_BASE+STM32_ADC_CALFACT_OFFSET)
#define STM32_ADC3_CALFACT2 (STM32_ADC3_BASE+STM32_ADC_CALFACT2_OFFSET)
#define STM32_ADC3_CSR (STM32_ADC3_BASE+STM32_ADC_CSR_OFFSET)
#define STM32_ADC3_CCR (STM32_ADC3_BASE+STM32_ADC_CCR_OFFSET)
#define STM32_ADC3_CDR (STM32_ADC3_BASE+STM32_ADC_CDR_OFFSET)
#define STM32_ADC3_CDR2 (STM32_ADC3_BASE+STM32_ADC_CDR2_OFFSET)
/* Register Bitfield Definitions ****************************************************/
/* ADC interrupt and status register (ISR) and ADC interrupt enable register (IER) */
#define ADC_INT_ADRDY (1 << 0) /* Bit 0: ADC ready */
#define ADC_INT_EOSMP (1 << 1) /* Bit 1: End of sampling flag */
#define ADC_INT_EOC (1 << 2) /* Bit 2: End of conversion */
#define ADC_INT_EOS (1 << 3) /* Bit 3: End of regular sequence flag */
#define ADC_INT_OVR (1 << 4) /* Bit 4: Overrun */
#define ADC_INT_JEOC (1 << 5) /* Bit 5: Injected channel end of conversion */
#define ADC_INT_JEOS (1 << 6) /* Bit 6: Injected channel end of sequence flag */
#define ADC_INT_AWD1 (1 << 7) /* Bit 7: Analog watchdog 1 flag */
#define ADC_INT_AWD2 (1 << 8) /* Bit 8: Analog watchdog 2 flag */
#define ADC_INT_AWD3 (1 << 9) /* Bit 9: Analog watchdog 3 flag */
#define ADC_INT_JQOVF (1 << 10) /* Bit 10: Injected context queue overflow */
/* Bits 11-31: Reserved */
#define ADC_INT_MASK (0x7ff)
/* ADC control register */
#define ADC_CR_ADEN (1 << 0) /* Bit 0: ADC enable control */
#define ADC_CR_ADDIS (1 << 1) /* Bit 1: ADC disable command */
#define ADC_CR_ADSTART (1 << 2) /* Bit 2: ADC start of regular conversion */
#define ADC_CR_JADSTART (1 << 3) /* Bit 3: ADC start of injected conversion */
#define ADC_CR_ADSTP (1 << 4) /* Bit 4: ADC stop of regular conversion command */
#define ADC_CR_JADSTP (1 << 5) /* Bit 5: ADC stop of injected conversion command */
/* Bits 6-7: Reserved */
#if defined(ADC_DEVICE_VERSION_V)
# define ADC_CR_BOOST_SHIFT (8) /* Bits 8-9: ADC Boost mode control */
# define ADC_CR_BOOST_MASK (3 << ADC_CR_BOOST_SHIFT)
# define ADC_CR_BOOST_6p25_MHZ (0 << ADC_CR_BOOST_SHIFT)
# define ADC_CR_BOOST_12p5_MHZ (1 << ADC_CR_BOOST_SHIFT)
# define ADC_CR_BOOST_25_MHZ (2 << ADC_CR_BOOST_SHIFT)
# define ADC_CR_BOOST_50_MHZ (3 << ADC_CR_BOOST_SHIFT)
/* Bits 10-15: Reserved */
#else
# define ADC_CR_BOOST (1 << 8) /* Bit 8: ADC Boost mode control */
/* Bits 9-15: Reserved */
#endif
#define ADC_CR_ADCALLIN (1 << 16) /* Bit 16: ADC Linearity calibration */
/* Bits 17-21: Reserved */
#define ADC_CR_LINCALRDYW1 (1 << 22) /* Bit 22: ADC Linearity calibration ready Word 1*/
#define ADC_CR_LINCALRDYW2 (1 << 23) /* Bit 23: ADC Linearity calibration ready Word 1*/
#define ADC_CR_LINCALRDYW3 (1 << 24) /* Bit 24: ADC Linearity calibration ready Word 1*/
#define ADC_CR_LINCALRDYW4 (1 << 25) /* Bit 25: ADC Linearity calibration ready Word 1*/
#define ADC_CR_LINCALRDYW5 (1 << 26) /* Bit 26: ADC Linearity calibration ready Word 1*/
#define ADC_CR_LINCALRDYW6 (1 << 27) /* Bit 27: ADC Linearity calibration ready Word 1*/
#define ADC_CR_ADVREGEN (1 << 28) /* Bit 28: ADC voltage regulator enable */
#define ADC_CR_DEEPPWD (1 << 29) /* Bit 29: Deep-power-down enable */
#define ADC_CR_ADCALDIF (1 << 30) /* Bit 30: Differential mode for calibration */
#define ADC_CR_ADCAL (1 << 31) /* Bit 31: ADC calibration */
/* ADC configuration register */
#define ADC_CFGR_DMNGT_SHIFT (0) /* Bits 0-1: Data Management configuration */
#define ADC_CFGR_DMNGT_MASK (3 << ADC_CFGR_DMNGT_SHIFT)
# define ADC_CFGR_DMNGT_DR (0 << ADC_CFGR_DMNGT_SHIFT) /* Regular conversion data stored in DR only */
# define ADC_CFGR_DMNGT_DMA_ONESHOT (1 << ADC_CFGR_DMNGT_SHIFT) /* RDMA One Shot Mode selected */
# define ADC_CFGR_DMNGT_DFSDM (2 << ADC_CFGR_DMNGT_SHIFT) /* DFSDM mode selected */
# define ADC_CFGR_DMNGT_DMA_CIR (3 << ADC_CFGR_DMNGT_SHIFT) /* DMA Circular Mode selected */
#define ADC_CFGR_RES_SHIFT (0) /* Bits 2-4: Data resolution */
#define ADC_CFGR_RES_MASK (7 << ADC_CFGR_RES_SHIFT)
# define ADC_CFGR_RES_16BIT (0 << ADC_CFGR_RES_SHIFT) /* 16 Bit */
# define ADC_CFGR_RES_14BIT (1 << ADC_CFGR_RES_SHIFT) /* 14 Bit */
# define ADC_CFGR_RES_12BIT (2 << ADC_CFGR_RES_SHIFT) /* 12 Bit */
# define ADC_CFGR_RES_10BIT (3 << ADC_CFGR_RES_SHIFT) /* 10 Bit */
# if defined(ADC_DEVICE_VERSION_V)
# define ADC_CFGR_RES_8BIT (7 << ADC_CFGR_RES_SHIFT) /* 8 rev V Bit */
# else
# define ADC_CFGR_RES_8BIT (4 << ADC_CFGR_RES_SHIFT) /* 8 rev Y Bit */
# endif
#define ADC_CFGR_EXTSEL_SHIFT (5) /* Bits 5-9: External Event Select for regular group */
#define ADC_CFGR_EXTSEL_MASK (31 << ADC_CFGR_EXTSEL_SHIFT)
# define ADC_CFGR_EXTSEL(event) ((event) << ADC_CFGR_EXTSEL_SHIFT) /* Event = 0..31 */
# define ADC_CFGR_EXTSEL_T1CC1 (0x00 << ADC_CFGR_EXTSEL_SHIFT) /* 00000: Timer 1 CC1 event */
# define ADC_CFGR_EXTSEL_T1CC2 (0x01 << ADC_CFGR_EXTSEL_SHIFT) /* 00001: Timer 1 CC2 event */
# define ADC_CFGR_EXTSEL_T1CC3 (0x02 << ADC_CFGR_EXTSEL_SHIFT) /* 00010: Timer 1 CC3 event */
# define ADC_CFGR_EXTSEL_T2CC2 (0x03 << ADC_CFGR_EXTSEL_SHIFT) /* 00011: Timer 2 CC2 event */
# define ADC_CFGR_EXTSEL_T3TRGO (0x04 << ADC_CFGR_EXTSEL_SHIFT) /* 00100: Timer 3 TRGO event */
# define ADC_CFGR_EXTSEL_T4CC4 (0x05 << ADC_CFGR_EXTSEL_SHIFT) /* 00101: Timer 4 CC4 event */
# define ADC_CFGR_EXTSEL_EXTI11 (0x06 << ADC_CFGR_EXTSEL_SHIFT) /* 00110: EXTI line 11 */
# define ADC_CFGR_EXTSEL_T8TRGO (0x07 << ADC_CFGR_EXTSEL_SHIFT) /* 00111: Timer 8 TRGO event */
# define ADC_CFGR_EXTSEL_T8TRGO2 (0x08 << ADC_CFGR_EXTSEL_SHIFT) /* 01000: Timer 8 TRGO2 event */
# define ADC_CFGR_EXTSEL_T1TRGO (0x09 << ADC_CFGR_EXTSEL_SHIFT) /* 01001: Timer 1 TRGO event */
# define ADC_CFGR_EXTSEL_T1TRGO2 (0x0a << ADC_CFGR_EXTSEL_SHIFT) /* 01010: Timer 1 TRGO2 event */
# define ADC_CFGR_EXTSEL_T2TRGO (0x0b << ADC_CFGR_EXTSEL_SHIFT) /* 01011: Timer 2 TRGO event */
# define ADC_CFGR_EXTSEL_T4TRGO (0x0c << ADC_CFGR_EXTSEL_SHIFT) /* 01100: Timer 4 TRGO event */
# define ADC_CFGR_EXTSEL_T6TRGO (0x0d << ADC_CFGR_EXTSEL_SHIFT) /* 01101: Timer 6 TRGO event */
# define ADC_CFGR_EXTSEL_T15TRGO (0x0e << ADC_CFGR_EXTSEL_SHIFT) /* 01110: Timer 15 TRGO event */
# define ADC_CFGR_EXTSEL_T3CC4 (0x0f << ADC_CFGR_EXTSEL_SHIFT) /* 01111: Timer 3 CC4 event */
# define ADC_CFGR_EXTSEL_HRTIM1TRG1 (0x10 << ADC_CFGR_EXTSEL_SHIFT) /* 10000: HRTIM1 ADC TRG1 event */
# define ADC_CFGR_EXTSEL_HRTIM1TRG3 (0x11 << ADC_CFGR_EXTSEL_SHIFT) /* 10001: HRTIM1 ADC TRG3 event */
# define ADC_CFGR_EXTSEL_LPTIM1_OUT (0x12 << ADC_CFGR_EXTSEL_SHIFT) /* 10010: LP TIM1 OUT CC4 event */
# define ADC_CFGR_EXTSEL_LPTIM2_OUT (0x13 << ADC_CFGR_EXTSEL_SHIFT) /* 10011: LP TIM2 OUT CC4 event */
# define ADC_CFGR_EXTSEL_LPTIM3_OUT (0x14 << ADC_CFGR_EXTSEL_SHIFT) /* 10100: LP TIM3 OUT CC4 event */
#define ADC_CFGR_EXTEN_SHIFT (10) /* Bits 10-11: External trigger/polarity selection regular channels */
#define ADC_CFGR_EXTEN_MASK (3 << ADC_CFGR_EXTEN_SHIFT)
# define ADC_CFGR_EXTEN_NONE (0 << ADC_CFGR_EXTEN_SHIFT) /* Trigger detection disabled */
# define ADC_CFGR_EXTEN_RISING (1 << ADC_CFGR_EXTEN_SHIFT) /* Trigger detection on the rising edge */
# define ADC_CFGR_EXTEN_FALLING (2 << ADC_CFGR_EXTEN_SHIFT) /* Trigger detection on the falling edge */
# define ADC_CFGR_EXTEN_BOTH (3 << ADC_CFGR_EXTEN_SHIFT) /* Trigger detection on both edges */
#define ADC_CFGR_OVRMOD (1 << 12) /* Bit 12: Overrun Mode */
#define ADC_CFGR_CONT (1 << 13) /* Bit 13: Continuous mode for regular conversions */
#define ADC_CFGR_AUTDLY (1 << 14) /* Bit 14: Delayed conversion mode */
#define ADC_CFGR_DISCEN (1 << 16) /* Bit 16: Discontinuous mode on regular channels */
#define ADC_CFGR_DISCNUM_SHIFT (17) /* Bits 17-19: Discontinuous mode channel count */
#define ADC_CFGR_DISCNUM_MASK (7 << ADC_CFGR_DISCNUM_SHIFT)
# define ADC_CFGR_DISCNUM(n) (((n) - 1) << ADC_CFGR_DISCNUM_SHIFT) /* n = 1..8 channels */
#define ADC_CFGR_JDISCEN (1 << 20) /* Bit 20: Discontinuous mode on injected channels */
#define ADC_CFGR_JQM (1 << 21) /* Bit 21: JSQR queue mode */
#define ADC_CFGR_AWD1SGL (1 << 22) /* Bit 22: Enable watchdog on single/all channels */
#define ADC_CFGR_AWD1EN (1 << 23) /* Bit 23: Analog watchdog enable 1 regular channels */
#define ADC_CFGR_JAWD1EN (1 << 22) /* Bit 22: Analog watchdog enable 1 injected channels */
#define ADC_CFGR_JAUTO (1 << 25) /* Bit 25: Automatic Injected Group conversion */
#define ADC_CFGR_AWD1CH_SHIFT (26) /* Bits 26-30: Analog watchdog 1 channel select bits */
#define ADC_CFGR_AWD1CH_MASK (31 << ADC_CFGR_AWD1CH_SHIFT)
# define ADC_CFGR_AWD1CH_DISABLED (0 << ADC_CFGR_AWD1CH_SHIFT)
#define ADC_CFGR_JQDIS (1 << 31) /* Bit 31: Injected Queue disable */
/* ADC configuration register 2 */
#define ADC_CFGR2_ROVSE (1 << 0) /* Bit 0: Regular Oversampling Enable */
#define ADC_CFGR2_JOVSE (1 << 1) /* Bit 1: Injected Oversampling Enable */
/* Bits 2-4: Reserved */
#define ADC_CFGR2_OVSS_SHIFT (5) /* Bits 5-8: Oversampling shift */
#define ADC_CFGR2_OVSS_MASK (0xf << ADC_CFGR2_OVSS_SHIFT)
# define ADC_CFGR2_OVSS(value) ((value) << ADC_CFGR2_OVSS_SHIFT) /* Value = 0..11 */
#define ADC_CFGR2_TROVS (1 << 9) /* Bit 9: Triggered Regular Oversampling */
#define ADC_CFGR2_ROVSM (1 << 10) /* Bit 10: Regular Oversampling mode */
#define ADC_CFGR2_RSHIFT1 (1 << 11) /* Bit 11: Right-shift data after Offset 1 correction*/
#define ADC_CFGR2_RSHIFT2 (1 << 12) /* Bit 12: Right-shift data after Offset 2 correction*/
#define ADC_CFGR2_RSHIFT3 (1 << 13) /* Bit 13: Right-shift data after Offset 3 correction*/
#define ADC_CFGR2_RSHIFT4 (1 << 14) /* Bit 14: Right-shift data after Offset 4 correction*/
/* Bit 15: Reserved */
#define ADC_CFGR2_OVSR_SHIFT (16) /* Bits 16-25: Oversampling ratio */
#define ADC_CFGR2_OVSR_MASK (0x3ff << ADC_CFGR2_OVSR_SHIFT)
# define ADC_CFGR2_OVSR(value) ((value) << ADC_CFGR2_OVSR_SHIFT) /* Value = 0..1024 */
/* Bits 26-27: Reserved */
#define ADC_CFGR2_LSHIFT_SHIFT (28) /* Bits 28-31: Left shift factor */
#define ADC_CFGR2_LSHIFT_MASK (0xf << ADC_CFGR2_LSHIFT_SHIFT)
# define ADC_CFGR2_LSHIFT(value) ((value) << ADC_CFGR2_LSHIFT_SHIFT) /* Value = 0..15 */
/* ADC sample time register 1 */
#define ADC_SMPR_1p5 0 /* 000: 1.5 cycles */
#define ADC_SMPR_2p5 1 /* 001: 2.5 cycles */
#define ADC_SMPR_8p5 2 /* 010: 8.5 cycles */
#define ADC_SMPR_16p5 3 /* 011: 16.5 cycles */
#define ADC_SMPR_32p5 4 /* 100: 32.5 cycles */
#define ADC_SMPR_64p5 5 /* 101: 64.5 cycles */
#define ADC_SMPR_387p5 6 /* 110: 387.5 cycles */
#define ADC_SMPR_810p5 7 /* 111: 810.5 cycles */
#define ADC_SMPR1_SMP0_SHIFT (0) /* Bits 2-0: Channel 0 Sample time selection */
#define ADC_SMPR1_SMP0_MASK (7 << ADC_SMPR1_SMP0_SHIFT)
#define ADC_SMPR1_SMP1_SHIFT (3) /* Bits 5-3: Channel 1 Sample time selection */
#define ADC_SMPR1_SMP1_MASK (7 << ADC_SMPR1_SMP1_SHIFT)
#define ADC_SMPR1_SMP2_SHIFT (6) /* Bits 8-6: Channel 2 Sample time selection */
#define ADC_SMPR1_SMP2_MASK (7 << ADC_SMPR1_SMP2_SHIFT)
#define ADC_SMPR1_SMP3_SHIFT (9) /* Bits 11-9: Channel 3 Sample time selection */
#define ADC_SMPR1_SMP3_MASK (7 << ADC_SMPR1_SMP3_SHIFT)
#define ADC_SMPR1_SMP4_SHIFT (12) /* Bits 14-12: Channel 4 Sample time selection */
#define ADC_SMPR1_SMP4_MASK (7 << ADC_SMPR1_SMP4_SHIFT)
#define ADC_SMPR1_SMP5_SHIFT (15) /* Bits 17-15: Channel 5 Sample time selection */
#define ADC_SMPR1_SMP5_MASK (7 << ADC_SMPR1_SMP5_SHIFT)
#define ADC_SMPR1_SMP6_SHIFT (18) /* Bits 20-18: Channel 6 Sample time selection */
#define ADC_SMPR1_SMP6_MASK (7 << ADC_SMPR1_SMP6_SHIFT)
#define ADC_SMPR1_SMP7_SHIFT (21) /* Bits 23-21: Channel 7 Sample time selection */
#define ADC_SMPR1_SMP7_MASK (7 << ADC_SMPR1_SMP7_SHIFT)
#define ADC_SMPR1_SMP8_SHIFT (24) /* Bits 26-24: Channel 8 Sample time selection */
#define ADC_SMPR1_SMP8_MASK (7 << ADC_SMPR1_SMP8_SHIFT)
#define ADC_SMPR1_SMP9_SHIFT (27) /* Bits 29-27: Channel 9 Sample time selection */
#define ADC_SMPR1_SMP9_MASK (7 << ADC_SMPR1_SMP9_SHIFT)
/* ADC sample time register 2 */
#define ADC_SMPR2_SMP10_SHIFT (0) /* Bits 0-2: Channel 10 Sample time selection */
#define ADC_SMPR2_SMP10_MASK (7 << ADC_SMPR2_SMP10_SHIFT)
#define ADC_SMPR2_SMP11_SHIFT (3) /* Bits 3-5: Channel 11 Sample time selection */
#define ADC_SMPR2_SMP11_MASK (7 << ADC_SMPR2_SMP11_SHIFT)
#define ADC_SMPR2_SMP12_SHIFT (6) /* Bits 6-8: Channel 12 Sample time selection */
#define ADC_SMPR2_SMP12_MASK (7 << ADC_SMPR2_SMP12_SHIFT)
#define ADC_SMPR2_SMP13_SHIFT (9) /* Bits 9-11: Channel 13 Sample time selection */
#define ADC_SMPR2_SMP13_MASK (7 << ADC_SMPR2_SMP13_SHIFT)
#define ADC_SMPR2_SMP14_SHIFT (12) /* Bits 12-14: Channel 14 Sample time selection */
#define ADC_SMPR2_SMP14_MASK (7 << ADC_SMPR2_SMP14_SHIFT)
#define ADC_SMPR2_SMP15_SHIFT (15) /* Bits 15-17: Channel 15 Sample time selection */
#define ADC_SMPR2_SMP15_MASK (7 << ADC_SMPR2_SMP15_SHIFT)
#define ADC_SMPR2_SMP16_SHIFT (18) /* Bits 18-20: Channel 16 Sample time selection */
#define ADC_SMPR2_SMP16_MASK (7 << ADC_SMPR2_SMP16_SHIFT)
#define ADC_SMPR2_SMP17_SHIFT (21) /* Bits 21-23: Channel 17 Sample time selection */
#define ADC_SMPR2_SMP17_MASK (7 << ADC_SMPR2_SMP17_SHIFT)
#define ADC_SMPR2_SMP18_SHIFT (24) /* Bits 24-26: Channel 18 Sample time selection */
#define ADC_SMPR2_SMP18_MASK (7 << ADC_SMPR2_SMP18_SHIFT)
#define ADC_SMPR2_SMP19_SHIFT (27) /* Bits 27-29: Channel 19 Sample time selection */
#define ADC_SMPR2_SMP19_MASK (7 << ADC_SMPR2_SMP19_SHIFT)
/* ADC channel preselection register */
#define ADC_PCSEL_PCSEL_ALL 0xfffff /* Bits 0-19: All Channels pre selection */
#define ADC_PCSEL_PCSEL0 (1 << 0) /* Bit 0: :Channel 0 (VINP[i]) pre selection */
#define ADC_PCSEL_PCSEL1 (1 << 1) /* Bit 1: :Channel 1 (VINP[i]) pre selection */
#define ADC_PCSEL_PCSEL2 (1 << 2) /* Bit 2: :Channel 2 (VINP[i]) pre selection */
#define ADC_PCSEL_PCSEL3 (1 << 3) /* Bit 3: :Channel 3 (VINP[i]) pre selection */
#define ADC_PCSEL_PCSEL4 (1 << 4) /* Bit 4: :Channel 4 (VINP[i]) pre selection */
#define ADC_PCSEL_PCSEL5 (1 << 5) /* Bit 5: :Channel 5 (VINP[i]) pre selection */
#define ADC_PCSEL_PCSEL6 (1 << 6) /* Bit 6: :Channel 6 (VINP[i]) pre selection */
#define ADC_PCSEL_PCSEL7 (1 << 7) /* Bit 7: :Channel 7 (VINP[i]) pre selection */
#define ADC_PCSEL_PCSEL8 (1 << 8) /* Bit 8: :Channel 8 (VINP[i]) pre selection */
#define ADC_PCSEL_PCSEL9 (1 << 9) /* Bit 9: :Channel 9 (VINP[i]) pre selection */
#define ADC_PCSEL_PCSEL10 (1 << 10) /* Bit 10: :Channel 10 (VINP[i]) pre selection */
#define ADC_PCSEL_PCSEL11 (1 << 11) /* Bit 11: :Channel 11 (VINP[i]) pre selection */
#define ADC_PCSEL_PCSEL12 (1 << 12) /* Bit 12: :Channel 12 (VINP[i]) pre selection */
#define ADC_PCSEL_PCSEL13 (1 << 13) /* Bit 13: :Channel 13 (VINP[i]) pre selection */
#define ADC_PCSEL_PCSEL14 (1 << 14) /* Bit 14: :Channel 14 (VINP[i]) pre selection */
#define ADC_PCSEL_PCSEL15 (1 << 15) /* Bit 15: :Channel 15 (VINP[i]) pre selection */
#define ADC_PCSEL_PCSEL16 (1 << 16) /* Bit 16: :Channel 16 (VINP[i]) pre selection */
#define ADC_PCSEL_PCSEL17 (1 << 17) /* Bit 17: :Channel 17 (VINP[i]) pre selection */
#define ADC_PCSEL_PCSEL18 (1 << 18) /* Bit 18: :Channel 18 (VINP[i]) pre selection */
#define ADC_PCSEL_PCSEL19 (1 << 19) /* Bit 19: :Channel 19 (VINP[i]) pre selection */
/* ADC watchdog threshold register 1 Lower */
#define ADC_LTR1_LT_SHIFT (0) /* Bits 0-25: Analog watchdog 1 lower threshold */
#define ADC_LTR1_LT_MASK (0x03ffffff << ADC_LTR1_LT_SHIFT)
/* ADC watchdog threshold register 1 Higher */
#define ADC_HTR1_HT_SHIFT (0) /* Bits 0-25: Analog watchdog 1 higher threshold */
#define ADC_HTR1_HT_MASK (0x03ffffff << ADC_HTR1_HT_SHIFT)
/* Offset between SQ bits */
#define ADC_SQ_OFFSET (6)
/* ADC regular sequence register 1 */
#define ADC_SQR1_L_SHIFT (0) /* Bits 0-3: Regular channel sequence length */
#define ADC_SQR1_L_MASK (0x0f << ADC_SQR1_L_SHIFT)
/* Bits 4-5: Reserved */
#define ADC_SQR1_SQ1_SHIFT (6) /* Bits 6-10: 13th conversion in regular sequence */
#define ADC_SQR1_SQ1_MASK (0x1f << ADC_SQR1_SQ1_SHIFT)
/* Bit 11: Reserved */
#define ADC_SQR1_SQ2_SHIFT (12) /* Bits 12-16: 2nd conversion in regular sequence */
#define ADC_SQR1_SQ2_MASK (0x1f << ADC_SQR1_SQ2_SHIFT)
/* Bit 17: Reserved */
#define ADC_SQR1_SQ3_SHIFT (18) /* Bits 18-22: 3rd conversion in regular sequence */
#define ADC_SQR1_SQ3_MASK (0x1f << ADC_SQR1_SQ3_SHIFT)
/* Bit 23: Reserved */
#define ADC_SQR1_SQ4_SHIFT (24) /* Bits 24-28: 4th conversion in regular sequence */
#define ADC_SQR1_SQ4_MASK (0x1f << ADC_SQR1_SQ4_SHIFT)
/* Bits 29-31: Reserved */
#define ADC_SQR1_RESERVED (0xe0820830)
#define ADC_SQR1_FIRST (1)
#define ADC_SQR1_LAST (4)
#define ADC_SQR1_SQ_OFFSET (1*ADC_SQ_OFFSET)
/* ADC regular sequence register 2 */
#define ADC_SQR2_SQ5_SHIFT (0) /* Bits 4-0: 5th conversion in regular sequence */
#define ADC_SQR2_SQ5_MASK (0x1f << ADC_SQR2_SQ5_SHIFT)
/* Bits 4-5: Reserved */
#define ADC_SQR2_SQ6_SHIFT (6) /* Bits 6-10: 6th conversion in regular sequence */
#define ADC_SQR2_SQ6_MASK (0x1f << ADC_SQR2_SQ6_SHIFT)
/* Bit 11: Reserved */
#define ADC_SQR2_SQ7_SHIFT (12) /* Bits 12-16: 7th conversion in regular sequence */
#define ADC_SQR2_SQ7_MASK (0x1f << ADC_SQR2_SQ7_SHIFT)
/* Bit 17: Reserved */
#define ADC_SQR2_SQ8_SHIFT (18) /* Bits 18-22: 8th conversion in regular sequence */
#define ADC_SQR2_SQ8_MASK (0x1f << ADC_SQR2_SQ8_SHIFT)
/* Bit 23: Reserved */
#define ADC_SQR2_SQ9_SHIFT (24) /* Bits 24-28: 9th conversion in regular sequence */
#define ADC_SQR2_SQ9_MASK (0x1f << ADC_SQR2_SQ9_SHIFT )
/* Bits 29-31: Reserved */
#define ADC_SQR2_RESERVED (0xe0820820)
#define ADC_SQR2_FIRST (5)
#define ADC_SQR2_LAST (9)
#define ADC_SQR2_SQ_OFFSET (0)
/* ADC regular sequence register 3 */
#define ADC_SQR3_SQ10_SHIFT (0) /* Bits 4-0: 10th conversion in regular sequence */
#define ADC_SQR3_SQ10_MASK (0x1f << ADC_SQR3_SQ10_SHIFT)
/* Bits 4-5: Reserved */
#define ADC_SQR3_SQ11_SHIFT (6) /* Bits 6-10: 11th conversion in regular sequence */
#define ADC_SQR3_SQ11_MASK (0x1f << ADC_SQR3_SQ11_SHIFT)
/* Bit 11: Reserved */
#define ADC_SQR3_SQ12_SHIFT (12) /* Bits 12-16: 12th conversion in regular sequence */
#define ADC_SQR3_SQ12_MASK (0x1f << ADC_SQR3_SQ12_SHIFT)
/* Bit 17: Reserved */
#define ADC_SQR3_SQ13_SHIFT (18) /* Bits 18-22: 13th conversion in regular sequence */
#define ADC_SQR3_SQ13_MASK (0x1f << ADC_SQR3_SQ13_SHIFT)
/* Bit 23: Reserved */
#define ADC_SQR3_SQ14_SHIFT (24) /* Bits 24-28: 14th conversion in regular sequence */
#define ADC_SQR3_SQ14_MASK (0x1f << ADC_SQR3_SQ14_SHIFT)
#define ADC_SQR3_RESERVED (0xe0820820)
#define ADC_SQR3_FIRST (10)
#define ADC_SQR3_LAST (14)
#define ADC_SQR3_SQ_OFFSET (0)
/* ADC regular sequence register 4 */
#define ADC_SQR4_SQ15_SHIFT (0) /* Bits 4-0: 15th conversion in regular sequence */
#define ADC_SQR4_SQ15_MASK (0x1f << ADC_SQR4_SQ15_SHIFT)
/* Bit 5: Reserved */
#define ADC_SQR4_SQ16_SHIFT (6) /* Bits 6-10: 16th conversion in regular sequence */
#define ADC_SQR4_SQ16_MASK (0x1f << ADC_SQR4_SQ16_SHIFT)
/* Bits 11-31: Reserved */
#define ADC_SQR4_RESERVED (0xfffff820)
#define ADC_SQR4_FIRST (15)
#define ADC_SQR4_LAST (16)
#define ADC_SQR4_SQ_OFFSET (0)
/* ADC regular data register */
#define ADC_DR_MASK (0xffffffff)
/* ADC injected sequence register */
#define ADC_JSQR_JL_SHIFT (0) /* Bits 0-1: Injected Sequence length */
#define ADC_JSQR_JL_MASK (3 << ADC_JSQR_JL_SHIFT)
# define ADC_JSQR_JL(n) (((n)-1) << ADC_JSQR_JL_SHIFT) /* n=1..4 */
#define ADC_JSQR_JEXTSEL_SHIFT (2) /* Bits 2-6: External Trigger Selection for injected group */
#define ADC_JSQR_JEXTSEL_MASK (31 << ADC_JSQR_JEXTSEL_SHIFT)
# define ADC_JSQR_JEXTSEL(event) ((event) << ADC_JSQR_JEXTSEL_SHIFT) /* Event = 0..31 */
#define ADC_JSQR_JEXTEN_SHIFT (7) /* Bits 7-8: External trigger selection for injected greoup */
#define ADC_JSQR_JEXTEN_MASK (3 << ADC_JSQR_JEXTEN_SHIFT)
# define ADC_JSQR_JEXTEN_NONE (0 << ADC_JSQR_JEXTEN_SHIFT) /* 00: Trigger detection disabled */
# define ADC_JSQR_JEXTEN_RISING (1 << ADC_JSQR_JEXTEN_SHIFT) /* 01: Trigger detection on the rising edge */
# define ADC_JSQR_JEXTEN_FALLING (2 << ADC_JSQR_JEXTEN_SHIFT) /* 10: Trigger detection on the falling edge */
# define ADC_JSQR_JEXTEN_BOTH (3 << ADC_JSQR_JEXTEN_SHIFT) /* 11: Trigger detection on both the rising and falling edges */
#define ADC_JSQR_JSQ1_SHIFT (9) /* Bits 9-13: 1st conversion in injected sequence */
#define ADC_JSQR_JSQ1_MASK (0x1f << ADC_JSQR_JSQ1_SHIFT)
# define ADC_JSQR_JSQ1(ch) ((ch) << ADC_JSQR_JSQ1_SHIFT) /* Channel number 0..19 */
/* Bit 14: Reserved */
#define ADC_JSQR_JSQ2_SHIFT (15) /* Bits 15-19: 2nd conversion in injected sequence */
#define ADC_JSQR_JSQ2_MASK (0x1f << ADC_JSQR_JSQ2_MASK)
# define ADC_JSQR_JSQ2(ch) ((ch) << ADC_JSQR_JSQ2_MASK) /* Channel number 0..19 */
/* Bit 20: Reserved */
#define ADC_JSQR_JSQ3_SHIFT (21) /* Bits 21-25: 3rd conversion in injected sequence */
#define ADC_JSQR_JSQ3_MASK (0x1f << ADC_JSQR_JSQ3_SHIFT)
# define ADC_JSQR_JSQ3(ch) ((ch) << ADC_JSQR_JSQ3_SHIFT) /* Channel number 0..19 */
/* Bit 26: Reserved */
#define ADC_JSQR_JSQ4_SHIFT (27) /* Bits 27-31: 4th conversion in injected sequence */
#define ADC_JSQR_JSQ4_MASK (0x1f << ADC_JSQR_JSQ4_SHIFT)
# define ADC_JSQR_JSQ4(ch) ((ch) << ADC_JSQR_JSQ4_SHIFT) /* Channel number 0..19 */
/* ADC offset register 1, 2, 3, and 4 */
#define ADC_OFR_OFFSETY_SHIFT (0) /* Bits 0-25: Data offset y for channel OFFSETY_CH */
#define ADC_OFR_OFFSETY_MASK (0x03ffffff << ADC_OFR_OFFSETY_SHIFT)
# define ADC_OFR_OFFSETY(offset) ((offset) << ADC_OFR_OFFSETY_SHIFT)
#define ADC_OFR_OFFSETY_CH_SHIFT (26) /* Bits 26-30: Channel selection for data offset y */
#define ADC_OFR_OFFSETY_CH_MASK (31 << ADC_OFR_OFFSETY_CH_SHIFT)
# define ADC_OFR_OFFSETY_CH(ch) ((ch) << ADC_OFR_OFFSETY_CH_SHIFT)
#define ADC_OFR_SSATE_EN (1 << 31) /* Bit 31: Signed saturation Enable */
/* ADC injected data register 1, 2, 3, and 4 */
#define ADC_JDR_MASK (0xffffffff)
/* ADC analog watchdog 2 configuration register */
#define ADC_AWD2CR_CH_SHIFT (0) /* Bits 0-19: Analog watchdog 2 channel selection */
#define ADC_AWD2CR_CH_MASK (0xfffff << ADC_AWD2CR_CH_SHIFT)
# define ADC_AWD2CR_CH(n) (1 << (n)) /* Channel n=0..19 */
/* Bits 20-31: Reserved */
/* ADC analog watchdog 3 configuration register */
#define ADC_AWD3CR_CH_SHIFT (0) /* Bits 0-19: Analog watchdog 2 channel selection */
#define ADC_AWD3CR_CH_MASK (0xfffff << ADC_AWD3CR_CH_SHIFT)
# define ADC_AWD3CR_CH(n) (1 << (n)) /* Channel n=0..19 */
/* Bits 20-31: Reserved */
/* ADC watchdog threshold register 2 Lower */
#define ADC_LTR2_LT_SHIFT (0) /* Bits 0-25: Analog watchdog 2 lower threshold */
#define ADC_LTR2_LT_MASK (0x03ffffff << ADC_LTR2_LT_SHIFT)
/* Bits 26-31: Reserved */
/* ADC watchdog threshold register 2 Higher */
#define ADC_HTR2_HT_SHIFT (0) /* Bits 0-25: Analog watchdog 2 higher threshold */
#define ADC_HTR2_HT_MASK (0x03ffffff << ADC_HTR2_LT_SHIFT)
/* Bits 26-31: Reserved */
/* ADC watchdog threshold register 3 Lower */
#define ADC_LTR3_LT_SHIFT (0) /* Bits 0-25: Analog watchdog 3 lower threshold */
#define ADC_LTR3_LT_MASK (0x03ffffff << ADC_LTR3_LT_SHIFT)
/* Bits 26-31: Reserved */
/* ADC watchdog threshold register 2 Higher */
#define ADC_HTR3_HT_SHIFT (0) /* Bits 0-25: Analog watchdog 3 higher threshold */
#define ADC_HTR3_HT_MASK (0x03ffffff << ADC_HTR3_LT_SHIFT)
/* Bits 26-31: Reserved */
/* ADC differential mode selection register */
#define ADC_DIFSEL_CH_SHIFT (0) /* Bits 0-19: Analog watchdog 2 channel selection */
#define ADC_DIFSEL_CH_MASK (0xfffff << ADC_DIFSEL_CH_SHIFT)
# define ADC_DIFSEL_CH(n) (1 << (n)) /* Channel n=0..19 */
/* Bits 20-31: Reserved */
/* ADC calibration factors */
#define ADC_CALFACT_S_SHIFT (0) /* Bits 0-10: Calibration factors in single-ended mode */
#define ADC_CALFACT_S_MASK (0x7ff << ADC_CALFACT_S_SHIFT)
#define ADC_CALFACT_D_SHIFT (16) /* Bits 16-26: Calibration Factors indifferential mode */
#define ADC_CALFACT_D_MASK (0x7ff << ADC_CALFACT_D_SHIFT)
/* Bits 27-31: Reserved */
/* ADC calibration factor register 2 */
#define ADC_CALFACT2_LINCALFACT_SHIFT (0) /* Bits 0-29: Calibration factors in single-ended mode */
#define ADC_CALFACT2_LINCALFACT_MASK (0x3fffffff << ADC_CALFACT2_LINCALFACT_SHIFT)
/* Bits 30-31: Reserved */
/* Common status register */
#define ADC_CSR_ADRDY_MST (1 << 0) /* Bit 0: Master ADC ready */
#define ADC_CSR_EOSMP_MST (1 << 1) /* Bit 1: End of Sampling phase flag (master ADC) */
#define ADC_CSR_EOC_MST (1 << 2) /* Bit 2: End of regular conversion (master ADC) */
#define ADC_CSR_EOS_MST (1 << 3) /* Bit 3: End of regular sequence flag (master ADC) */
#define ADC_CSR_OVR_MST (1 << 4) /* Bit 4: Overrun flag (master ADC) */
#define ADC_CSR_JEOC_MST (1 << 5) /* Bit 5: End of injected conversion flag (master ADC) */
#define ADC_CSR_JEOS_MST (1 << 6) /* Bit 6: End of injected sequence flag (master ADC) */
#define ADC_CSR_AWD1_MST (1 << 7) /* Bit 7: Analog watchdog 1 flag (master ADC) */
#define ADC_CSR_AWD2_MST (1 << 8) /* Bit 8: Analog watchdog 2 flag (master ADC) */
#define ADC_CSR_AWD3_MST (1 << 9) /* Bit 9: Analog watchdog 3 flag (master ADC) */
#define ADC_CSR_JQOVF_MST (1 << 10) /* Bit 10: Injected Context Queue Overflow flag (master ADC) */
/* Bits 11-15: Reserved */
#define ADC_CSR_ADRDY_SLV (1 << 16) /* Bit 16: Slave ADC ready */
#define ADC_CSR_EOSMP_SLV (1 << 17) /* Bit 17: End of Sampling phase flag (slave ADC) */
#define ADC_CSR_EOC_SLV (1 << 18) /* Bit 18: End of regular conversion (slave ADC) */
#define ADC_CSR_EOS_SLV (1 << 19) /* Bit 19: End of regular sequence flag (slave ADC) */
#define ADC_CSR_OVR_SLV (1 << 20) /* Bit 20: Overrun flag (slave ADC) */
#define ADC_CSR_JEOC_SLV (1 << 21) /* Bit 21: End of injected conversion flag (slave ADC) */
#define ADC_CSR_JEOS_SLV (1 << 22) /* Bit 22: End of injected sequence flag (slave ADC) */
#define ADC_CSR_AWD1_SLV (1 << 23) /* Bit 23: Analog watchdog 1 flag (slave ADC) */
#define ADC_CSR_AWD2_SLV (1 << 24) /* Bit 24: Analog watchdog 2 flag (slave ADC) */
#define ADC_CSR_AWD3_SLV (1 << 25) /* Bit 25: Analog watchdog 3 flag (slave ADC) */
#define ADC_CSR_JQOVF_SLV (1 << 26) /* Bit 26: Injected Context Queue Overflow flag (slave ADC) */
/* Bits 27-31: Reserved */
/* Common control register */
#define ADC_CCR_DUAL_SHIFT (0) /* Bits 0-4: Dual ADC mode selection */
#define ADC_CCR_DUAL_MASK (31 << ADC_CCR_DUAL_SHIFT)
# define ADC_CCR_DUAL_IND (0 << ADC_CCR_DUAL_SHIFT) /* Independent mode */
# define ADC_CCR_DUAL_DUAL (1 << ADC_CCR_DUAL_SHIFT) /* Dual mode, master/slave ADCs together */
# define ADC_CCR_DUAL_SIMINJ (1 << ADC_CCR_DUAL_SHIFT) /* Combined regular sim. + injected sim. */
# define ADC_CCR_DUAL_SIMALT (2 << ADC_CCR_DUAL_SHIFT) /* Combined regular sim. + alternate trigger */
# define ADC_CCR_DUAL_INJECTED (5 << ADC_CCR_DUAL_SHIFT) /* Injected simultaneous mode only */
# define ADC_CCR_DUAL_SIM (6 << ADC_CCR_DUAL_SHIFT) /* Regular simultaneous mode only */
# define ADC_CCR_DUAL_INTERLEAVE (7 << ADC_CCR_DUAL_SHIFT) /* Interleaved mode only */
# define ADC_CCR_DUAL_ALT (9 << ADC_CCR_DUAL_SHIFT) /* Alternate trigger mode only */
/* Bits 5-7: Reserved */
#define ADC_CCR_DELAY_SHIFT (8) /* Bits 8-11: Delay between 2 sampling phases */
#define ADC_CCR_DELAY_MASK (15 << ADC_CCR_DELAY_SHIFT)
# define ADC_CCR_DELAY(n) (((n)-1) << ADC_CCR_DELAY_SHIFT) /* n * TADCCLK, 1-13 */
/* Bits 12-13: Reserved */
#define ADC_CCR_DAMDF_SHIFT (14) /* Bits 14-15: Dual ADC Mode Data Format */
#define ADC_CCR_DAMDF_MASK (3 << ADC_CCR_DAMDF_MASK)
# define ADC_CCR_DAMDF_NOPACK (0 << ADC_CCR_DAMDF_MASK) /* Dual ADC mode without data packing */
# define ADC_CCR_DAMDF_RESERVD (1 << ADC_CCR_DAMDF_MASK) /* Reserved. */
# define ADC_CCR_DAMDF_32_10 (2 << ADC_CCR_DAMDF_MASK) /* Data formatting mode for 32 down to 10-bit resolution */
# define ADC_CCR_DAMDF_8 (3 << ADC_CCR_DAMDF_MASK) /* Data formatting mode for 8-bit resolution */
#define ADC_CCR_CKMODE_SHIFT (16) /* Bits 16-17: ADC clock mode */
#define ADC_CCR_CKMODE_MASK (3 << ADC_CCR_CKMODE_SHIFT)
# define ADC_CCR_CKMODE_ASYCH (0 << ADC_CCR_CKMODE_SHIFT) /* Asynchronous clock mode */
# define ADC_CCR_CKMODE_SYNCH_DIV1 (1 << ADC_CCR_CKMODE_SHIFT) /* Synchronous clock mode divided by 1 */
# define ADC_CCR_CKMODE_SYNCH_DIV2 (2 << ADC_CCR_CKMODE_SHIFT) /* Synchronous clock mode divided by 2 */
# define ADC_CCR_CKMODE_SYNCH_DIV4 (3 << ADC_CCR_CKMODE_SHIFT) /* Synchronous clock mode divided by 4 */
#define ADC_CCR_PRESC_SHIFT (18) /* Bits 18-21: ADC prescaler */
#define ADC_CCR_PRESC_MASK (15 << ADC_CCR_PRESC_SHIFT)
# define ADC_CCR_PRESC_NOT_DIV (0 << ADC_CCR_PRESC_SHIFT) /* Input ADC clock not divided */
# define ADC_CCR_PRESC_DIV2 (1 << ADC_CCR_PRESC_SHIFT) /* Input ADC clock divided by 2 */
# define ADC_CCR_PRESC_DIV4 (2 << ADC_CCR_PRESC_SHIFT) /* Input ADC clock divided by 4 */
# define ADC_CCR_PRESC_DIV6 (3 << ADC_CCR_PRESC_SHIFT) /* Input ADC clock divided by 6 */
# define ADC_CCR_PRESC_DIV8 (4 << ADC_CCR_PRESC_SHIFT) /* Input ADC clock divided by 8 */
# define ADC_CCR_PRESC_DIV10 (5 << ADC_CCR_PRESC_SHIFT) /* Input ADC clock divided by 10 */
# define ADC_CCR_PRESC_DIV12 (6 << ADC_CCR_PRESC_SHIFT) /* Input ADC clock divided by 12 */
# define ADC_CCR_PRESC_DIV16 (7 << ADC_CCR_PRESC_SHIFT) /* Input ADC clock divided by 16 */
# define ADC_CCR_PRESC_DIV32 (8 << ADC_CCR_PRESC_SHIFT) /* Input ADC clock divided by 32 */
# define ADC_CCR_PRESC_DIV64 (9 << ADC_CCR_PRESC_SHIFT) /* Input ADC clock divided by 64 */
# define ADC_CCR_PRESC_DIV128 (10 << ADC_CCR_PRESC_SHIFT) /* Input ADC clock divided by 128 */
# define ADC_CCR_PRESC_DIV256 (11 << ADC_CCR_PRESC_SHIFT) /* Input ADC clock divided by 256 */
#define ADC_CCR_VREFEN (1 << 22) /* Bit 22: VREFINT enable */
#define ADC_CCR_VSENSEEN (1 << 23) /* Bit 23: Temperature sensor voltage enable */
#define ADC_CCR_VBATEN (1 << 24) /* Bit 22: VBAT enable */
/* Common regular data register for dual mode */
#define ADC_CDR_RDATA_MST_SHIFT (0) /* Bits 0-15: Regular data of the master ADC */
#define ADC_CDR_RDATA_MST_MASK (0xffff << ADC_CDR_RDATA_MST_SHIFT)
#define ADC_CDR_RDATA_SLV_SHIFT (16) /* Bits 16-31: Regular data of the slave ADC */
#define ADC_CDR_RDATA_SLV_MASK (0xffff << ADC_CDR_RDATA_SLV_SHIFT)
/* Common regular data register for 32 bit dual mode */
#define ADC_CDR2_RDATA_ALT_SHIFT (0) /* Bits 0-31: Regular data of the master/slave alternated ADCs */
#define ADC_CDR2_RDATA_ALT_MASK (0xffffffff << ADC_CDR_RDATA_ALT_SHIFT)
#endif /* __ARCH_ARM_SRC_STM32H7_HARDWARE_STM32_ADC_H */

View File

@ -70,6 +70,68 @@
* pins in this file.
*/
/* ADC */
#define GPIO_ADC1_INP2 (GPIO_ANALOG|GPIO_PORTF|GPIO_PIN11)
#define GPIO_ADC1_INN2 (GPIO_ANALOG|GPIO_PORTF|GPIO_PIN12)
#define GPIO_ADC1_INP6 (GPIO_ANALOG|GPIO_PORTF|GPIO_PIN12)
#define GPIO_ADC1_INP16 (GPIO_ANALOG|GPIO_PORTA|GPIO_PIN0)
#define GPIO_ADC1_INN16 (GPIO_ANALOG|GPIO_PORTA|GPIO_PIN1)
#define GPIO_ADC1_INP17 (GPIO_ANALOG|GPIO_PORTA|GPIO_PIN1)
#define GPIO_ADC12_INP0 (GPIO_ANALOG|GPIO_PORTA|GPIO_PIN0_C)
#define GPIO_ADC12_INP1 (GPIO_ANALOG|GPIO_PORTA|GPIO_PIN1_C)
#define GPIO_ADC12_INN1 (GPIO_ANALOG|GPIO_PORTA|GPIO_PIN0_C)
#define GPIO_ADC12_INP3 (GPIO_ANALOG|GPIO_PORTA|GPIO_PIN6)
#define GPIO_ADC12_INN3 (GPIO_ANALOG|GPIO_PORTA|GPIO_PIN7)
#define GPIO_ADC12_INP4 (GPIO_ANALOG|GPIO_PORTC|GPIO_PIN4)
#define GPIO_ADC12_INN4 (GPIO_ANALOG|GPIO_PORTC|GPIO_PIN5)
#define GPIO_ADC12_INP5 (GPIO_ANALOG|GPIO_PORTB|GPIO_PIN1)
#define GPIO_ADC12_INN5 (GPIO_ANALOG|GPIO_PORTB|GPIO_PIN0)
#define GPIO_ADC12_INP7 (GPIO_ANALOG|GPIO_PORTA|GPIO_PIN7)
#define GPIO_ADC12_INP8 (GPIO_ANALOG|GPIO_PORTC|GPIO_PIN5)
#define GPIO_ADC12_INP9 (GPIO_ANALOG|GPIO_PORTB|GPIO_PIN0)
#define GPIO_ADC12_INN12 (GPIO_ANALOG|GPIO_PORTC|GPIO_PIN3)
#define GPIO_ADC12_INP13 (GPIO_ANALOG|GPIO_PORTC|GPIO_PIN3)
#define GPIO_ADC12_INP14 (GPIO_ANALOG|GPIO_PORTA|GPIO_PIN2)
#define GPIO_ADC12_INP15 (GPIO_ANALOG|GPIO_PORTA|GPIO_PIN3)
#define GPIO_ADC12_INP18 (GPIO_ANALOG|GPIO_PORTA|GPIO_PIN4)
#define GPIO_ADC12_INN18 (GPIO_ANALOG|GPIO_PORTA|GPIO_PIN5)
#define GPIO_ADC12_INP19 (GPIO_ANALOG|GPIO_PORTA|GPIO_PIN5)
#define GPIO_ADC123_INP10 (GPIO_ANALOG|GPIO_PORTC|GPIO_PIN0)
#define GPIO_ADC123_INN10 (GPIO_ANALOG|GPIO_PORTC|GPIO_PIN1)
#define GPIO_ADC123_INP11 (GPIO_ANALOG|GPIO_PORTC|GPIO_PIN1)
#define GPIO_ADC123_INN11 (GPIO_ANALOG|GPIO_PORTC|GPIO_PIN2)
#define GPIO_ADC123_INP12 (GPIO_ANALOG|GPIO_PORTC|GPIO_PIN2)
#define GPIO_ADC2_INN2 (GPIO_ANALOG|GPIO_PORTF|GPIO_PIN14)
#define GPIO_ADC2_INP2 (GPIO_ANALOG|GPIO_PORTF|GPIO_PIN13)
#define GPIO_ADC2_INP6 (GPIO_ANALOG|GPIO_PORTF|GPIO_PIN14)
#define GPIO_ADC3_INP0 (GPIO_ANALOG|GPIO_PORTC|GPIO_PIN2_C)
#define GPIO_ADC3_INP1 (GPIO_ANALOG|GPIO_PORTC|GPIO_PIN3_C)
#define GPIO_ADC3_INN1 (GPIO_ANALOG|GPIO_PORTC|GPIO_PIN2_C)
#define GPIO_ADC3_INP2 (GPIO_ANALOG|GPIO_PORTF|GPIO_PIN9)
#define GPIO_ADC3_INN2 (GPIO_ANALOG|GPIO_PORTF|GPIO_PIN10)
#define GPIO_ADC3_INP3 (GPIO_ANALOG|GPIO_PORTF|GPIO_PIN7)
#define GPIO_ADC3_INN3 (GPIO_ANALOG|GPIO_PORTF|GPIO_PIN8)
#define GPIO_ADC3_INP4 (GPIO_ANALOG|GPIO_PORTF|GPIO_PIN5)
#define GPIO_ADC3_INN4 (GPIO_ANALOG|GPIO_PORTF|GPIO_PIN6)
#define GPIO_ADC3_INP5 (GPIO_ANALOG|GPIO_PORTF|GPIO_PIN3)
#define GPIO_ADC3_INN5 (GPIO_ANALOG|GPIO_PORTF|GPIO_PIN4)
#define GPIO_ADC3_INP6 (GPIO_ANALOG|GPIO_PORTF|GPIO_PIN10)
#define GPIO_ADC3_INP7 (GPIO_ANALOG|GPIO_PORTF|GPIO_PIN8)
#define GPIO_ADC3_INP8 (GPIO_ANALOG|GPIO_PORTF|GPIO_PIN6)
#define GPIO_ADC3_INP9 (GPIO_ANALOG|GPIO_PORTF|GPIO_PIN4)
#define GPIO_ADC3_INP13 (GPIO_ANALOG|GPIO_PORTH|GPIO_PIN2)
#define GPIO_ADC3_INN13 (GPIO_ANALOG|GPIO_PORTH|GPIO_PIN3)
#define GPIO_ADC3_INP14 (GPIO_ANALOG|GPIO_PORTH|GPIO_PIN3)
#define GPIO_ADC3_INN14 (GPIO_ANALOG|GPIO_PORTH|GPIO_PIN4)
#define GPIO_ADC3_INP15 (GPIO_ANALOG|GPIO_PORTH|GPIO_PIN4)
#define GPIO_ADC3_INN15 (GPIO_ANALOG|GPIO_PORTH|GPIO_PIN5)
#define GPIO_ADC3_INP16 (GPIO_ANALOG|GPIO_PORTH|GPIO_PIN5)
/* CAN */
#define GPIO_CAN1_RX_1 (GPIO_ALT|GPIO_AF9|GPIO_SPEED_50MHz|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN11)

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,829 @@
/************************************************************************************
* arch/arm/src/stm32h7/stm32_adc.h
*
* Copyright (C) 2009, 2011, 2015-2017,2019 Gregory Nutt. All rights reserved.
* Copyright (C) 2015 Omni Hoverboards Inc. All rights reserved.
* Authors: Gregory Nutt <gnutt@nuttx.org>
* Paul Alexander Patience <paul-a.patience@polymtl.ca>
* David Sidrane <david_s5@nscdg.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.
*
************************************************************************************/
#ifndef __ARCH_ARM_SRC_STM32H7_STM32_ADC_H
#define __ARCH_ARM_SRC_STM32H7_STM32_ADC_H
/************************************************************************************
* Included Files
************************************************************************************/
#include <nuttx/config.h>
#include <nuttx/analog/adc.h>
#include "chip.h"
#include "hardware/stm32_adc.h"
/************************************************************************************
* Pre-processor Definitions
************************************************************************************/
/* Configuration ********************************************************************/
/* Timer devices may be used for different purposes. One special purpose is to
* control periodic ADC sampling. If CONFIG_STM32H7_TIMn is defined then
* CONFIG_STM32H7_TIMn_ADC must also be defined to indicate that timer "n" is
* intended to be used for that purpose. Timers 1,2,3,6 and 15 may be used on
* STM32H7X3, while STM32H7X6 adds support for timers 4 and 8 as well.
*/
#ifndef CONFIG_STM32H7_TIM1
# undef CONFIG_STM32H7_TIM1_ADC
# undef CONFIG_STM32H7_TIM1_ADC1
# undef CONFIG_STM32H7_TIM1_ADC2
# undef CONFIG_STM32H7_TIM1_ADC3
#endif
#ifndef CONFIG_STM32H7_TIM2
# undef CONFIG_STM32H7_TIM2_ADC
# undef CONFIG_STM32H7_TIM2_ADC1
# undef CONFIG_STM32H7_TIM2_ADC2
# undef CONFIG_STM32H7_TIM2_ADC3
#endif
#ifndef CONFIG_STM32H7_TIM3
# undef CONFIG_STM32H7_TIM3_ADC
# undef CONFIG_STM32H7_TIM3_ADC1
# undef CONFIG_STM32H7_TIM3_ADC2
# undef CONFIG_STM32H7_TIM3_ADC3
#endif
#ifndef CONFIG_STM32H7_TIM4
# undef CONFIG_STM32H7_TIM4_ADC
# undef CONFIG_STM32H7_TIM4_ADC1
# undef CONFIG_STM32H7_TIM4_ADC2
# undef CONFIG_STM32H7_TIM4_ADC3
#endif
#ifndef CONFIG_STM32H7_TIM6
# undef CONFIG_STM32H7_TIM6_ADC
# undef CONFIG_STM32H7_TIM6_ADC1
# undef CONFIG_STM32H7_TIM6_ADC2
# undef CONFIG_STM32H7_TIM6_ADC3
#endif
#ifndef CONFIG_STM32H7_TIM8
# undef CONFIG_STM32H7_TIM8_ADC
# undef CONFIG_STM32H7_TIM8_ADC1
# undef CONFIG_STM32H7_TIM8_ADC2
# undef CONFIG_STM32H7_TIM8_ADC3
#endif
#ifndef CONFIG_STM32H7_TIM15
# undef CONFIG_STM32H7_TIM15_ADC
# undef CONFIG_STM32H7_TIM15_ADC1
# undef CONFIG_STM32H7_TIM15_ADC2
# undef CONFIG_STM32H7_TIM15_ADC3
#endif
#if defined(CONFIG_STM32H7_ADC1) || defined(CONFIG_STM32H7_ADC2) || \
defined(CONFIG_STM32H7_ADC3)
/* ADC output to DFSDM support. Note that DFSDM and DMA are
* mutually exclusive.
*/
#undef ADC_HAVE_DFSDM
#if defined(CONFIG_STM32H7_ADC1_OUTPUT_DFSDM) || \
defined(CONFIG_STM32H7_ADC2_OUTPUT_DFSDM) || \
defined(CONFIG_STM32H7_ADC3_OUTPUT_DFSDM)
# define ADC_HAVE_DFSDM
#endif
#if defined(CONFIG_STM32H7_ADC1_OUTPUT_DFSDM)
# define ADC1_HAVE_DFSDM 1
# undef CONFIG_STM32H7_ADC1_DMA
#else
# undef ADC1_HAVE_DFSDM
#endif
#if defined(CONFIG_STM32H7_ADC2_OUTPUT_DFSDM)
# define ADC2_HAVE_DFSDM 1
# undef CONFIG_STM32H7_ADC2_DMA
#else
# undef ADC2_HAVE_DFSDM
#endif
#if defined(CONFIG_STM32H7_ADC3_OUTPUT_DFSDM)
# define ADC3_HAVE_DFSDM 1
# undef CONFIG_STM32H7_ADC3_DMA
#else
# undef ADC3_HAVE_DFSDM
#endif
/* DMA support */
#undef ADC_HAVE_DMA
#if defined(CONFIG_STM32H7_ADC1_DMA) || defined(CONFIG_STM32H7_ADC2_DMA) || \
defined(CONFIG_STM32H7_ADC3_DMA)
# define ADC_HAVE_DMA 1
#endif
#ifdef CONFIG_STM32H7_ADC1_DMA
# define ADC1_HAVE_DMA 1
#else
# undef ADC1_HAVE_DMA
#endif
#ifdef CONFIG_STM32H7_ADC2_DMA
# define ADC2_HAVE_DMA 1
#else
# undef ADC2_HAVE_DMA
#endif
#ifdef CONFIG_STM32H7_ADC3_DMA
# define ADC3_HAVE_DMA 1
#else
# undef ADC3_HAVE_DMA
#endif
/* Timer configuration: If a timer trigger is specified, then get
* information about the timer.
*/
#if defined(CONFIG_STM32H7_TIM1_ADC1)
# define ADC1_HAVE_TIMER 1
# define ADC1_TIMER_BASE STM32_TIM1_BASE
# define ADC1_TIMER_PCLK_FREQUENCY STM32_APB2_TIM1_CLKIN
# define ADC1_TIMER_RCC_ENR STM32_RCC_APB2ENR
# define ADC1_TIMER_RCC_EN RCC_APB2ENR_TIM1EN
#elif defined(CONFIG_STM32H7_TIM2_ADC1)
# define ADC1_HAVE_TIMER 1
# define ADC1_TIMER_BASE STM32_TIM2_BASE
# define ADC1_TIMER_PCLK_FREQUENCY STM32_APB1_TIM2_CLKIN
# define ADC1_TIMER_RCC_ENR STM32_RCC_APB1LENR
# define ADC1_TIMER_RCC_EN RCC_APB1LENR_TIM2EN
#elif defined(CONFIG_STM32H7_TIM3_ADC1)
# define ADC1_HAVE_TIMER 1
# define ADC1_TIMER_BASE STM32_TIM3_BASE
# define ADC1_TIMER_PCLK_FREQUENCY STM32_APB1_TIM3_CLKIN
# define ADC1_TIMER_RCC_ENR STM32_RCC_APB1LENR
# define ADC1_TIMER_RCC_EN RCC_APB1LENR_TIM3EN
#elif defined(CONFIG_STM32H7_TIM4_ADC1)
# define ADC1_HAVE_TIMER 1
# define ADC1_TIMER_BASE STM32_TIM4_BASE
# define ADC1_TIMER_PCLK_FREQUENCY STM32_APB1_TIM4_CLKIN
# define ADC1_TIMER_RCC_ENR STM32_RCC_APB1LENR
# define ADC1_TIMER_RCC_EN RCC_APB1LENR_TIM4EN
#elif defined(CONFIG_STM32H7_TIM6_ADC1)
# define ADC1_HAVE_TIMER 1
# define ADC1_TIMER_BASE STM32_TIM6_BASE
# define ADC1_TIMER_PCLK_FREQUENCY STM32_APB1_TIM6_CLKIN
# define ADC1_TIMER_RCC_ENR STM32_RCC_APB1LENR
# define ADC1_TIMER_RCC_EN RCC_APB1LENR_TIM6EN
#elif defined(CONFIG_STM32H7_TIM8_ADC1)
# define ADC1_HAVE_TIMER 1
# define ADC1_TIMER_BASE STM32_TIM8_BASE
# define ADC1_TIMER_PCLK_FREQUENCY STM32_APB2_TIM8_CLKIN
# define ADC1_TIMER_RCC_ENR STM32_RCC_APB2ENR
# define ADC1_TIMER_RCC_EN RCC_APB2ENR_TIM8EN
#elif defined(CONFIG_STM32H7_TIM15_ADC1)
# define ADC1_HAVE_TIMER 1
# define ADC1_TIMER_BASE STM32_TIM15_BASE
# define ADC1_TIMER_PCLK_FREQUENCY STM32_APB2_TIM15_CLKIN
# define ADC1_TIMER_RCC_ENR STM32_RCC_APB2ENR
# define ADC1_TIMER_RCC_EN RCC_APB2ENR_TIM15EN
#else
# undef ADC1_HAVE_TIMER
#endif
#ifdef ADC1_HAVE_TIMER
# ifndef CONFIG_STM32H7_ADC1_SAMPLE_FREQUENCY
# error "CONFIG_STM32H7_ADC1_SAMPLE_FREQUENCY not defined"
# endif
# ifndef CONFIG_STM32H7_ADC1_TIMTRIG
# error "CONFIG_STM32H7_ADC1_TIMTRIG not defined"
# warning "Values 0:CC1 1:CC2 2:CC3 3:CC4 4:TRGO"
# endif
#endif
#if defined(CONFIG_STM32H7_TIM1_ADC2)
# define ADC2_HAVE_TIMER 1
# define ADC2_TIMER_BASE STM32_TIM1_BASE
# define ADC2_TIMER_PCLK_FREQUENCY STM32_APB2_TIM1_CLKIN
# define ADC2_TIMER_RCC_ENR STM32_RCC_APB2ENR
# define ADC2_TIMER_RCC_EN RCC_APB2ENR_TIM1EN
#elif defined(CONFIG_STM32H7_TIM2_ADC2)
# define ADC2_HAVE_TIMER 1
# define ADC2_TIMER_BASE STM32_TIM2_BASE
# define ADC2_TIMER_PCLK_FREQUENCY STM32_APB1_TIM2_CLKIN
# define ADC2_TIMER_RCC_ENR STM32_RCC_APB1LENR
# define ADC2_TIMER_RCC_EN RCC_APB1LENR_TIM2EN
#elif defined(CONFIG_STM32H7_TIM3_ADC2)
# define ADC2_HAVE_TIMER 1
# define ADC2_TIMER_BASE STM32_TIM3_BASE
# define ADC2_TIMER_PCLK_FREQUENCY STM32_APB1_TIM3_CLKIN
# define ADC2_TIMER_RCC_ENR STM32_RCC_APB1LENR
# define ADC2_TIMER_RCC_EN RCC_APB1LENR_TIM3EN
#elif defined(CONFIG_STM32H7_TIM4_ADC2)
# define ADC2_HAVE_TIMER 1
# define ADC2_TIMER_BASE STM32_TIM4_BASE
# define ADC2_TIMER_PCLK_FREQUENCY STM32_APB1_TIM4_CLKIN
# define ADC2_TIMER_RCC_ENR STM32_RCC_APB1LENR
# define ADC2_TIMER_RCC_EN RCC_APB1LENR_TIM4EN
#elif defined(CONFIG_STM32H7_TIM6_ADC2)
# define ADC2_HAVE_TIMER 1
# define ADC2_TIMER_BASE STM32_TIM6_BASE
# define ADC2_TIMER_PCLK_FREQUENCY STM32_APB1_TIM6_CLKIN
# define ADC2_TIMER_RCC_ENR STM32_RCC_APB1LENR
# define ADC2_TIMER_RCC_EN RCC_APB1LENR_TIM6EN
#elif defined(CONFIG_STM32H7_TIM8_ADC2)
# define ADC2_HAVE_TIMER 1
# define ADC2_TIMER_BASE STM32_TIM8_BASE
# define ADC2_TIMER_PCLK_FREQUENCY STM32_APB2_TIM8_CLKIN
# define ADC2_TIMER_RCC_ENR STM32_RCC_APB2ENR
# define ADC2_TIMER_RCC_EN RCC_APB2ENR_TIM8EN
#elif defined(CONFIG_STM32H7_TIM15_ADC2)
# define ADC2_HAVE_TIMER 1
# define ADC2_TIMER_BASE STM32_TIM15_BASE
# define ADC2_TIMER_PCLK_FREQUENCY STM32_APB2_TIM15_CLKIN
# define ADC2_TIMER_RCC_ENR STM32_RCC_APB2ENR
# define ADC2_TIMER_RCC_EN RCC_APB2ENR_TIM15EN
#else
# undef ADC2_HAVE_TIMER
#endif
#ifdef ADC2_HAVE_TIMER
# ifndef CONFIG_STM32H7_ADC2_SAMPLE_FREQUENCY
# error "CONFIG_STM32H7_ADC2_SAMPLE_FREQUENCY not defined"
# endif
# ifndef CONFIG_STM32H7_ADC2_TIMTRIG
# error "CONFIG_STM32H7_ADC2_TIMTRIG not defined"
# warning "Values 0:CC1 1:CC2 2:CC3 3:CC4 4:TRGO"
# endif
#endif
#if defined(CONFIG_STM32H7_TIM1_ADC3)
# define ADC3_HAVE_TIMER 1
# define ADC3_TIMER_BASE STM32_TIM1_BASE
# define ADC3_TIMER_PCLK_FREQUENCY STM32_APB2_TIM1_CLKIN
# define ADC3_TIMER_RCC_ENR STM32_RCC_APB2ENR
# define ADC3_TIMER_RCC_EN RCC_APB2ENR_TIM1EN
#elif defined(CONFIG_STM32H7_TIM2_ADC3)
# define ADC3_HAVE_TIMER 1
# define ADC3_TIMER_BASE STM32_TIM2_BASE
# define ADC3_TIMER_PCLK_FREQUENCY STM32_APB1_TIM2_CLKIN
# define ADC3_TIMER_RCC_ENR STM32_RCC_APB1LENR
# define ADC3_TIMER_RCC_EN RCC_APB1LENR_TIM2EN
#elif defined(CONFIG_STM32H7_TIM3_ADC3)
# define ADC3_HAVE_TIMER 1
# define ADC3_TIMER_BASE STM32_TIM3_BASE
# define ADC3_TIMER_PCLK_FREQUENCY STM32_APB1_TIM3_CLKIN
# define ADC3_TIMER_RCC_ENR STM32_RCC_APB1LENR
# define ADC3_TIMER_RCC_EN RCC_APB1LENR_TIM3EN
#elif defined(CONFIG_STM32H7_TIM4_ADC3)
# define ADC3_HAVE_TIMER 1
# define ADC3_TIMER_BASE STM32_TIM4_BASE
# define ADC3_TIMER_PCLK_FREQUENCY STM32_APB1_TIM4_CLKIN
# define ADC3_TIMER_RCC_ENR STM32_RCC_APB1LENR
# define ADC3_TIMER_RCC_EN RCC_APB1LENR_TIM4EN
#elif defined(CONFIG_STM32H7_TIM6_ADC3)
# define ADC3_HAVE_TIMER 1
# define ADC3_TIMER_BASE STM32_TIM6_BASE
# define ADC3_TIMER_PCLK_FREQUENCY STM32_APB1_TIM6_CLKIN
# define ADC3_TIMER_RCC_ENR STM32_RCC_APB1LENR
# define ADC3_TIMER_RCC_EN RCC_APB1LENR_TIM6EN
#elif defined(CONFIG_STM32H7_TIM8_ADC3)
# define ADC3_HAVE_TIMER 1
# define ADC3_TIMER_BASE STM32_TIM8_BASE
# define ADC3_TIMER_PCLK_FREQUENCY STM32_APB2_TIM8_CLKIN
# define ADC3_TIMER_RCC_ENR STM32_RCC_APB2ENR
# define ADC3_TIMER_RCC_EN RCC_APB2ENR_TIM8EN
#elif defined(CONFIG_STM32H7_TIM15_ADC3)
# define ADC3_HAVE_TIMER 1
# define ADC3_TIMER_BASE STM32_TIM15_BASE
# define ADC3_TIMER_PCLK_FREQUENCY STM32_APB2_TIM15_CLKIN
# define ADC3_TIMER_RCC_ENR STM32_RCC_APB2ENR
# define ADC3_TIMER_RCC_EN RCC_APB2ENR_TIM15EN
#else
# undef ADC3_HAVE_TIMER
#endif
#ifdef ADC3_HAVE_TIMER
# ifndef CONFIG_STM32H7_ADC3_SAMPLE_FREQUENCY
# error "CONFIG_STM32H7_ADC3_SAMPLE_FREQUENCY not defined"
# endif
# ifndef CONFIG_STM32H7_ADC3_TIMTRIG
# error "CONFIG_STM32H7_ADC3_TIMTRIG not defined"
# warning "Values 0:CC1 1:CC2 2:CC3 3:CC4 4:TRGO"
# endif
#endif
#if defined(ADC1_HAVE_TIMER) || defined(ADC2_HAVE_TIMER) || \
defined(ADC3_HAVE_TIMER)
# define ADC_HAVE_TIMER 1
#else
# undef ADC_HAVE_TIMER
#endif
/* NOTE: The following assumes that all possible combinations of timers and
* values are support EXTSEL. That is not so and it varies from one STM32
* to another. But this (wrong) assumptions keeps the logic as simple as
* possible. If unsupported combination is used, an error will show up
* later during compilation although it may be difficult to track it back
* to this simplification.
*/
#define ADC1_EXTSEL_T1CC1 ADC_CFGR_EXTSEL_T1CC1
#define ADC1_EXTSEL_T1CC2 ADC_CFGR_EXTSEL_T1CC2
#define ADC1_EXTSEL_T1CC3 ADC_CFGR_EXTSEL_T1CC3
#define ADC1_EXTSEL_T1CC4 ADC_CFGR_EXTSEL_T1CC4
#define ADC1_EXTSEL_T1TRGO ADC_CFGR_EXTSEL_T1TRGO
#define ADC1_EXTSEL_T1TRGO2 ADC_CFGR_EXTSEL_T1TRGO2
#define ADC2_EXTSEL_T1CC1 ADC_CFGR_EXTSEL_T1CC1
#define ADC2_EXTSEL_T1CC2 ADC_CFGR_EXTSEL_T1CC2
#define ADC2_EXTSEL_T1CC3 ADC_CFGR_EXTSEL_T1CC3
#define ADC2_EXTSEL_T1CC4 ADC_CFGR_EXTSEL_T1CC4
#define ADC2_EXTSEL_T1TRGO ADC_CFGR_EXTSEL_T1TRGO
#define ADC2_EXTSEL_T1TRGO2 ADC_CFGR_EXTSEL_T1TRGO2
#define ADC3_EXTSEL_T1CC1 ADC_CFGR_EXTSEL_T1CC1
#define ADC3_EXTSEL_T1CC2 ADC_CFGR_EXTSEL_T1CC2
#define ADC3_EXTSEL_T1CC3 ADC_CFGR_EXTSEL_T1CC3
#define ADC3_EXTSEL_T1CC4 ADC_CFGR_EXTSEL_T1CC4
#define ADC3_EXTSEL_T1TRGO ADC_CFGR_EXTSEL_T1TRGO
#define ADC3_EXTSEL_T1TRGO2 ADC_CFGR_EXTSEL_T1TRGO2
#define ADC1_EXTSEL_T2CC1 ADC_CFGR_EXTSEL_T2CC1
#define ADC1_EXTSEL_T2CC2 ADC_CFGR_EXTSEL_T2CC2
#define ADC1_EXTSEL_T2CC3 ADC_CFGR_EXTSEL_T2CC3
#define ADC1_EXTSEL_T2CC4 ADC_CFGR_EXTSEL_T2CC4
#define ADC1_EXTSEL_T2TRGO ADC_CFGR_EXTSEL_T2TRGO
#define ADC2_EXTSEL_T2CC1 ADC_CFGR_EXTSEL_T2CC1
#define ADC2_EXTSEL_T2CC2 ADC_CFGR_EXTSEL_T2CC2
#define ADC2_EXTSEL_T2CC3 ADC_CFGR_EXTSEL_T2CC3
#define ADC2_EXTSEL_T2CC4 ADC_CFGR_EXTSEL_T2CC4
#define ADC2_EXTSEL_T2TRGO ADC_CFGR_EXTSEL_T2TRGO
#define ADC3_EXTSEL_T2CC1 ADC_CFGR_EXTSEL_T2CC1
#define ADC3_EXTSEL_T2CC2 ADC_CFGR_EXTSEL_T2CC2
#define ADC3_EXTSEL_T2CC3 ADC_CFGR_EXTSEL_T2CC3
#define ADC3_EXTSEL_T2CC4 ADC_CFGR_EXTSEL_T2CC4
#define ADC3_EXTSEL_T2TRGO ADC_CFGR_EXTSEL_T2TRGO
#define ADC1_EXTSEL_T3CC1 ADC_CFGR_EXTSEL_T3CC1
#define ADC1_EXTSEL_T3CC2 ADC_CFGR_EXTSEL_T3CC2
#define ADC1_EXTSEL_T3CC3 ADC_CFGR_EXTSEL_T3CC3
#define ADC1_EXTSEL_T3CC4 ADC_CFGR_EXTSEL_T3CC4
#define ADC1_EXTSEL_T3TRGO ADC_CFGR_EXTSEL_T3TRGO
#define ADC2_EXTSEL_T3CC1 ADC_CFGR_EXTSEL_T3CC1
#define ADC2_EXTSEL_T3CC2 ADC_CFGR_EXTSEL_T3CC2
#define ADC2_EXTSEL_T3CC3 ADC_CFGR_EXTSEL_T3CC3
#define ADC2_EXTSEL_T3CC4 ADC_CFGR_EXTSEL_T3CC4
#define ADC2_EXTSEL_T3TRGO ADC_CFGR_EXTSEL_T3TRGO
#define ADC3_EXTSEL_T3CC1 ADC_CFGR_EXTSEL_T3CC1
#define ADC3_EXTSEL_T3CC2 ADC_CFGR_EXTSEL_T3CC2
#define ADC3_EXTSEL_T3CC3 ADC_CFGR_EXTSEL_T3CC3
#define ADC3_EXTSEL_T3CC4 ADC_CFGR_EXTSEL_T3CC4
#define ADC3_EXTSEL_T3TRGO ADC_CFGR_EXTSEL_T3TRGO
#define ADC1_EXTSEL_T4CC1 ADC_CFGR_EXTSEL_T4CC1
#define ADC1_EXTSEL_T4CC2 ADC_CFGR_EXTSEL_T4CC2
#define ADC1_EXTSEL_T4CC3 ADC_CFGR_EXTSEL_T4CC3
#define ADC1_EXTSEL_T4CC4 ADC_CFGR_EXTSEL_T4CC4
#define ADC1_EXTSEL_T4TRGO ADC_CFGR_EXTSEL_T4TRGO
#define ADC2_EXTSEL_T4CC1 ADC_CFGR_EXTSEL_T4CC1
#define ADC2_EXTSEL_T4CC2 ADC_CFGR_EXTSEL_T4CC2
#define ADC2_EXTSEL_T4CC3 ADC_CFGR_EXTSEL_T4CC3
#define ADC2_EXTSEL_T4CC4 ADC_CFGR_EXTSEL_T4CC4
#define ADC2_EXTSEL_T4TRGO ADC_CFGR_EXTSEL_T4TRGO
#define ADC3_EXTSEL_T4CC1 ADC_CFGR_EXTSEL_T4CC1
#define ADC3_EXTSEL_T4CC2 ADC_CFGR_EXTSEL_T4CC2
#define ADC3_EXTSEL_T4CC3 ADC_CFGR_EXTSEL_T4CC3
#define ADC3_EXTSEL_T4CC4 ADC_CFGR_EXTSEL_T4CC4
#define ADC3_EXTSEL_T4TRGO ADC_CFGR_EXTSEL_T4TRGO
#define ADC1_EXTSEL_T6CC1 ADC_CFGR_EXTSEL_T6CC1
#define ADC1_EXTSEL_T6CC2 ADC_CFGR_EXTSEL_T6CC2
#define ADC1_EXTSEL_T6CC3 ADC_CFGR_EXTSEL_T6CC3
#define ADC1_EXTSEL_T6CC4 ADC_CFGR_EXTSEL_T6CC4
#define ADC1_EXTSEL_T6TRGO ADC_CFGR_EXTSEL_T6TRGO
#define ADC2_EXTSEL_T6CC1 ADC_CFGR_EXTSEL_T6CC1
#define ADC2_EXTSEL_T6CC2 ADC_CFGR_EXTSEL_T6CC2
#define ADC2_EXTSEL_T6CC3 ADC_CFGR_EXTSEL_T6CC3
#define ADC2_EXTSEL_T6CC4 ADC_CFGR_EXTSEL_T6CC4
#define ADC2_EXTSEL_T6TRGO ADC_CFGR_EXTSEL_T6TRGO
#define ADC3_EXTSEL_T6CC1 ADC_CFGR_EXTSEL_T6CC1
#define ADC3_EXTSEL_T6CC2 ADC_CFGR_EXTSEL_T6CC2
#define ADC3_EXTSEL_T6CC3 ADC_CFGR_EXTSEL_T6CC3
#define ADC3_EXTSEL_T6CC4 ADC_CFGR_EXTSEL_T6CC4
#define ADC3_EXTSEL_T6TRGO ADC_CFGR_EXTSEL_T6TRGO
#define ADC1_EXTSEL_T8CC1 ADC_CFGR_EXTSEL_T8CC1
#define ADC1_EXTSEL_T8CC2 ADC_CFGR_EXTSEL_T8CC2
#define ADC1_EXTSEL_T8CC3 ADC_CFGR_EXTSEL_T8CC3
#define ADC1_EXTSEL_T8CC4 ADC_CFGR_EXTSEL_T8CC4
#define ADC1_EXTSEL_T8TRGO ADC_CFGR_EXTSEL_T8TRGO
#define ADC1_EXTSEL_T8TRGO2 ADC_CFGR_EXTSEL_T8TRGO2
#define ADC2_EXTSEL_T8CC1 ADC_CFGR_EXTSEL_T8CC1
#define ADC2_EXTSEL_T8CC2 ADC_CFGR_EXTSEL_T8CC2
#define ADC2_EXTSEL_T8CC3 ADC_CFGR_EXTSEL_T8CC3
#define ADC2_EXTSEL_T8CC4 ADC_CFGR_EXTSEL_T8CC4
#define ADC2_EXTSEL_T8TRGO ADC_CFGR_EXTSEL_T8TRGO
#define ADC2_EXTSEL_T8TRGO2 ADC_CFGR_EXTSEL_T8TRGO2
#define ADC3_EXTSEL_T8CC1 ADC_CFGR_EXTSEL_T8CC1
#define ADC3_EXTSEL_T8CC2 ADC_CFGR_EXTSEL_T8CC2
#define ADC3_EXTSEL_T8CC3 ADC_CFGR_EXTSEL_T8CC3
#define ADC3_EXTSEL_T8CC4 ADC_CFGR_EXTSEL_T8CC4
#define ADC3_EXTSEL_T8TRGO ADC_CFGR_EXTSEL_T8TRGO
#define ADC3_EXTSEL_T8TRGO2 ADC_CFGR_EXTSEL_T8TRGO2
#define ADC1_EXTSEL_T15CC1 ADC_CFGR_EXTSEL_T15CC1
#define ADC1_EXTSEL_T15CC2 ADC_CFGR_EXTSEL_T15CC2
#define ADC1_EXTSEL_T15CC3 ADC_CFGR_EXTSEL_T15CC3
#define ADC1_EXTSEL_T15CC4 ADC_CFGR_EXTSEL_T15CC4
#define ADC1_EXTSEL_T15TRGO ADC_CFGR_EXTSEL_T15TRGO
#define ADC2_EXTSEL_T15CC1 ADC_CFGR_EXTSEL_T15CC1
#define ADC2_EXTSEL_T15CC2 ADC_CFGR_EXTSEL_T15CC2
#define ADC2_EXTSEL_T15CC3 ADC_CFGR_EXTSEL_T15CC3
#define ADC2_EXTSEL_T15CC4 ADC_CFGR_EXTSEL_T15CC4
#define ADC2_EXTSEL_T15TRGO ADC_CFGR_EXTSEL_T15TRGO
#define ADC3_EXTSEL_T15CC1 ADC_CFGR_EXTSEL_T15CC1
#define ADC3_EXTSEL_T15CC2 ADC_CFGR_EXTSEL_T15CC2
#define ADC3_EXTSEL_T15CC3 ADC_CFGR_EXTSEL_T15CC3
#define ADC3_EXTSEL_T15CC4 ADC_CFGR_EXTSEL_T15CC4
#define ADC3_EXTSEL_T15TRGO ADC_CFGR_EXTSEL_T15TRGO
#if defined(CONFIG_STM32H7_TIM1_ADC1)
# if CONFIG_STM32H7_ADC1_TIMTRIG == 0
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T1CC1
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 1
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T1CC2
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 2
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T1CC3
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 3
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T1CC4
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 4
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T1TRGO
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 5
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T1TRGO2
# else
# error "CONFIG_STM32H7_ADC1_TIMTRIG is out of range"
# endif
#elif defined(CONFIG_STM32H7_TIM2_ADC1)
# if CONFIG_STM32H7_ADC1_TIMTRIG == 0
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T2CC1
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 1
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T2CC2
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 2
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T2CC3
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 3
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T2CC4
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 4
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T2TRGO
# else
# error "CONFIG_STM32H7_ADC1_TIMTRIG is out of range"
# endif
#elif defined(CONFIG_STM32H7_TIM3_ADC1)
# if CONFIG_STM32H7_ADC1_TIMTRIG == 0
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T3CC1
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 1
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T3CC2
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 2
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T3CC3
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 3
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T3CC4
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 4
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T3TRGO
# else
# error "CONFIG_STM32H7_ADC1_TIMTRIG is out of range"
# endif
#elif defined(CONFIG_STM32H7_TIM4_ADC1)
# if CONFIG_STM32H7_ADC1_TIMTRIG == 0
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T4CC1
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 1
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T4CC2
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 2
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T4CC3
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 3
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T4CC4
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 4
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T4TRGO
# else
# error "CONFIG_STM32H7_ADC1_TIMTRIG is out of range"
# endif
#elif defined(CONFIG_STM32H7_TIM6_ADC1)
# if CONFIG_STM32H7_ADC1_TIMTRIG == 0
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T6CC1
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 1
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T6CC2
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 2
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T6CC3
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 3
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T6CC4
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 4
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T6TRGO
# else
# error "CONFIG_STM32H7_ADC1_TIMTRIG is out of range"
# endif
#elif defined(CONFIG_STM32H7_TIM8_ADC1)
# if CONFIG_STM32H7_ADC1_TIMTRIG == 0
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T8CC1
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 1
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T8CC2
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 2
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T8CC3
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 3
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T8CC4
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 4
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T8TRGO
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 5
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T8TRGO2
# else
# error "CONFIG_STM32H7_ADC1_TIMTRIG is out of range"
# endif
#elif defined(CONFIG_STM32H7_TIM15_ADC1)
# if CONFIG_STM32H7_ADC1_TIMTRIG == 0
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T15CC1
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 1
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T15CC2
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 2
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T15CC3
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 3
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T15CC4
# elif CONFIG_STM32H7_ADC1_TIMTRIG == 4
# define ADC1_EXTSEL_VALUE ADC1_EXTSEL_T15TRGO
# else
# error "CONFIG_STM32H7_ADC1_TIMTRIG is out of range"
# endif
#endif
#if defined(CONFIG_STM32H7_TIM1_ADC2)
# if CONFIG_STM32H7_ADC2_TIMTRIG == 0
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T1CC1
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 1
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T1CC2
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 2
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T1CC3
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 3
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T1CC4
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 4
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T1TRGO
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 5
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T1TRGO2
# else
# error "CONFIG_STM32H7_ADC2_TIMTRIG is out of range"
# endif
#elif defined(CONFIG_STM32H7_TIM2_ADC2)
# if CONFIG_STM32H7_ADC2_TIMTRIG == 0
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T2CC1
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 1
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T2CC2
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 2
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T2CC3
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 3
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T2CC4
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 4
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T2TRGO
# else
# error "CONFIG_STM32H7_ADC2_TIMTRIG is out of range"
# endif
#elif defined(CONFIG_STM32H7_TIM3_ADC2)
# if CONFIG_STM32H7_ADC2_TIMTRIG == 0
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T3CC1
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 1
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T3CC2
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 2
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T3CC3
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 3
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T3CC4
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 4
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T3TRGO
# else
# error "CONFIG_STM32H7_ADC2_TIMTRIG is out of range"
# endif
#elif defined(CONFIG_STM32H7_TIM4_ADC2)
# if CONFIG_STM32H7_ADC2_TIMTRIG == 0
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T4CC1
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 1
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T4CC2
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 2
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T4CC3
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 3
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T4CC4
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 4
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T4TRGO
# else
# error "CONFIG_STM32H7_ADC2_TIMTRIG is out of range"
# endif
#elif defined(CONFIG_STM32H7_TIM6_ADC2)
# if CONFIG_STM32H7_ADC2_TIMTRIG == 0
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T6CC1
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 1
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T6CC2
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 2
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T6CC3
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 3
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T6CC4
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 4
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T6TRGO
# else
# error "CONFIG_STM32H7_ADC2_TIMTRIG is out of range"
# endif
#elif defined(CONFIG_STM32H7_TIM8_ADC2)
# if CONFIG_STM32H7_ADC2_TIMTRIG == 0
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T8CC1
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 1
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T8CC2
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 2
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T8CC3
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 3
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T8CC4
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 4
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T8TRGO
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 5
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T8TRGO2
# else
# error "CONFIG_STM32H7_ADC2_TIMTRIG is out of range"
# endif
#elif defined(CONFIG_STM32H7_TIM15_ADC2)
# if CONFIG_STM32H7_ADC2_TIMTRIG == 0
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T15CC1
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 1
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T15CC2
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 2
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T15CC3
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 3
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T15CC4
# elif CONFIG_STM32H7_ADC2_TIMTRIG == 4
# define ADC2_EXTSEL_VALUE ADC2_EXTSEL_T15TRGO
# else
# error "CONFIG_STM32H7_ADC2_TIMTRIG is out of range"
# endif
#endif
#if defined(CONFIG_STM32H7_TIM1_ADC3)
# if CONFIG_STM32H7_ADC3_TIMTRIG == 0
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T1CC1
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 1
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T1CC2
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 2
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T1CC3
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 3
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T1CC4
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 4
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T1TRGO
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 5
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T1TRGO2
# else
# error "CONFIG_STM32H7_ADC3_TIMTRIG is out of range"
# endif
#elif defined(CONFIG_STM32H7_TIM2_ADC3)
# if CONFIG_STM32H7_ADC3_TIMTRIG == 0
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T2CC1
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 1
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T2CC2
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 2
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T2CC3
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 3
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T2CC4
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 4
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T2TRGO
# else
# error "CONFIG_STM32H7_ADC3_TIMTRIG is out of range"
# endif
#elif defined(CONFIG_STM32H7_TIM3_ADC3)
# if CONFIG_STM32H7_ADC3_TIMTRIG == 0
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T3CC1
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 1
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T3CC2
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 2
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T3CC3
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 3
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T3CC4
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 4
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T3TRGO
# else
# error "CONFIG_STM32H7_ADC3_TIMTRIG is out of range"
# endif
#elif defined(CONFIG_STM32H7_TIM4_ADC3)
# if CONFIG_STM32H7_ADC3_TIMTRIG == 0
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T4CC1
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 1
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T4CC2
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 2
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T4CC3
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 3
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T4CC4
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 4
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T4TRGO
# else
# error "CONFIG_STM32H7_ADC3_TIMTRIG is out of range"
# endif
#elif defined(CONFIG_STM32H7_TIM6_ADC3)
# if CONFIG_STM32H7_ADC3_TIMTRIG == 0
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T6CC1
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 1
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T6CC2
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 2
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T6CC3
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 3
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T6CC4
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 4
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T6TRGO
# else
# error "CONFIG_STM32H7_ADC3_TIMTRIG is out of range"
# endif
#elif defined(CONFIG_STM32H7_TIM8_ADC3)
# if CONFIG_STM32H7_ADC3_TIMTRIG == 0
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T8CC1
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 1
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T8CC2
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 2
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T8CC3
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 3
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T8CC4
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 4
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T8TRGO
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 5
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T8TRGO2
# else
# error "CONFIG_STM32H7_ADC3_TIMTRIG is out of range"
# endif
#elif defined(CONFIG_STM32H7_TIM15_ADC3)
# if CONFIG_STM32H7_ADC3_TIMTRIG == 0
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T15CC1
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 1
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T15CC2
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 2
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T15CC3
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 3
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T15CC4
# elif CONFIG_STM32H7_ADC3_TIMTRIG == 4
# define ADC3_EXTSEL_VALUE ADC3_EXTSEL_T15TRGO
# else
# error "CONFIG_STM32H7_ADC3_TIMTRIG is out of range"
# endif
#endif
/************************************************************************************
* Public Types
************************************************************************************/
/************************************************************************************
* Public Function Prototypes
************************************************************************************/
#ifndef __ASSEMBLY__
#ifdef __cplusplus
#define EXTERN extern "C"
extern "C"
{
#else
#define EXTERN extern
#endif
/****************************************************************************
* Name: stm32h7_adc_initialize
*
* Description:
* Initialize the ADC.
*
* Input Parameters:
* intf - Could be {1,2,3} for ADC1, ADC2, or ADC3
* chanlist - The list of channels
* nchannels - Number of channels
*
* Returned Value:
* Valid ADC device structure reference on success; a NULL on failure
*
****************************************************************************/
struct adc_dev_s;
struct adc_dev_s *stm32h7_adc_initialize(int intf,
FAR const uint8_t *chanlist,
int nchannels);
#undef EXTERN
#ifdef __cplusplus
}
#endif
#endif /* __ASSEMBLY__ */
#endif /* CONFIG_STM32H7_ADC1 || CONFIG_STM32H7_ADC2 || CONFIG_STM32H7_ADC3 */
#endif /* __ARCH_ARM_SRC_STM32H7_STM32_ADC_H */

View File

@ -1482,11 +1482,14 @@ static int up_interrupt(int irq, void *context, FAR void *arg)
static int up_ioctl(struct file *filep, int cmd, unsigned long arg)
{
#if defined(CONFIG_SERIAL_TERMIOS) || defined(CONFIG_SERIAL_TIOCSERGSTRUCT) \
|| defined(CONFIG_STM32H7_USART_SINGLEWIRE) \
|| defined(CONFIG_STM32H7_SERIALBRK_BSDCOMPAT)
struct inode *inode = filep->f_inode;
struct uart_dev_s *dev = inode->i_private;
#endif
#if defined(CONFIG_SERIAL_TERMIOS) || defined(CONFIG_STM32H7_SERIALBRK_BSDCOMPAT)
#if defined(CONFIG_SERIAL_TERMIOS) \
|| defined(CONFIG_STM32H7_USART_SINGLEWIRE) \
|| defined(CONFIG_STM32H7_SERIALBRK_BSDCOMPAT)
struct up_dev_s *priv = (struct up_dev_s *)dev->priv;
#endif
int ret = OK;
@ -1701,21 +1704,12 @@ static int up_ioctl(struct file *filep, int cmd, unsigned long arg)
flags = enter_critical_section();
cr1 = up_serialin(priv, STM32_USART_CR1_OFFSET);
up_serialout(priv, STM32_USART_CR1_OFFSET, cr1 | USART_CR1_SBK);
up_serialout(priv, STM32_USART_RQR_OFFSET, cr1 | USART_RQR_SBKRQ);
leave_critical_section(flags);
}
break;
case TIOCCBRK: /* No BSD compatibility: May turn off break too soon */
{
uint32_t cr1;
irqstate_t flags;
flags = enter_critical_section();
cr1 = up_serialin(priv, STM32_USART_CR1_OFFSET);
up_serialout(priv, STM32_USART_CR1_OFFSET, cr1 & ~USART_CR1_SBK);
leave_critical_section(flags);
}
case TIOCCBRK: /* No BSD compatibility: HW does not support stopping a break */
break;
# endif
#endif

View File

@ -389,7 +389,7 @@ struct stm32_tim_priv_s stm32_tim12_priv =
#endif
#ifdef CONFIG_STM32H7_TIM13
struct stm32_tim_priv_s stm32_tim12_priv =
struct stm32_tim_priv_s stm32_tim13_priv =
{
.ops = &stm32_tim_ops,
.mode = STM32_TIM_MODE_UNUSED,
@ -398,7 +398,7 @@ struct stm32_tim_priv_s stm32_tim12_priv =
#endif
#ifdef CONFIG_STM32H7_TIM14
struct stm32_tim_priv_s stm32_tim12_priv =
struct stm32_tim_priv_s stm32_tim14_priv =
{
.ops = &stm32_tim_ops,
.mode = STM32_TIM_MODE_UNUSED,
@ -1430,7 +1430,7 @@ int stm32_tim_deinit(FAR struct stm32_tim_dev_s * dev)
#endif
#ifdef CONFIG_STM32H7_TIM7
case STM32_TIM7_BASE:
modifyreg32(STM32_RCC_APB1LENR, RCC_APB1ENR_TIM7EN, 0);
modifyreg32(STM32_RCC_APB1LENR, RCC_APB1LENR_TIM7EN, 0);
break;
#endif
#ifdef CONFIG_STM32H7_TIM8
@ -1444,7 +1444,7 @@ int stm32_tim_deinit(FAR struct stm32_tim_dev_s * dev)
break;
#endif
#ifdef CONFIG_STM32H7_TIM13
case STM32_TIM12_BASE:
case STM32_TIM13_BASE:
modifyreg32(STM32_RCC_APB1LENR, RCC_APB1LENR_TIM13EN, 0);
break;
#endif

View File

@ -145,6 +145,11 @@ static inline void rcc_enableahb1(void)
*/
regval = getreg32(STM32_RCC_AHB1ENR);
#if defined(CONFIG_STM32H7_ADC1) || defined(CONFIG_STM32H7_ADC2)
/* ADC1 & 2 clock enable */
regval |= RCC_AHB1ENR_ADC12EN;
#endif
#ifdef CONFIG_STM32H7_DMA1
/* DMA 1 clock enable */
@ -262,6 +267,12 @@ static inline void rcc_enableahb4(void)
regval = getreg32(STM32_RCC_AHB4ENR);
#ifdef CONFIG_STM32H7_ADC3
/* ADC3 clock enable */
regval |= RCC_AHB4ENR_ADC3EN;
#endif
/* Enable GPIO, GPIOB, ... GPIOK */
#if STM32H7_NGPIO > 0
@ -673,16 +684,26 @@ static void stm32_stdclockconfig(void)
regval |= RCC_CR_PLL1ON;
putreg32(regval, STM32_RCC_CR);
/* TODO: Enable the PLL2 */
/* Enable the PLL2 */
regval = getreg32(STM32_RCC_CR);
regval |= RCC_CR_PLL2ON;
putreg32(regval, STM32_RCC_CR);
/* TODO: Enable the PLL3 */
/* Wait until the PLL is ready */
/* Wait until the PLL1 is ready */
while ((getreg32(STM32_RCC_CR) & RCC_CR_PLL1RDY) == 0)
{
}
/* Wait until the PLL2 is ready */
while ((getreg32(STM32_RCC_CR) & RCC_CR_PLL2RDY) == 0)
{
}
/* Configure FLASH wait states */
regval = FLASH_ACR_LATENCY(BOARD_FLASH_WAITSTATES);
@ -760,6 +781,16 @@ static void stm32_stdclockconfig(void)
putreg32(regval, STM32_RCC_D2CCIP2R);
#endif
/* Configure ADC source clock */
#if defined(STM32_RCC_D3CCIPR_ADCSEL)
regval = getreg32(STM32_RCC_D3CCIPR);
regval &= ~RCC_D3CCIPR_ADCSEL_MASK;
regval |= STM32_RCC_D3CCIPR_ADCSEL;
putreg32(regval, STM32_RCC_D3CCIPR);
#endif
#if defined(CONFIG_STM32H7_IWDG) || defined(CONFIG_STM32H7_RTC_LSICLOCK)
/* Low speed internal clock source LSI */

View File

@ -134,15 +134,17 @@
/* PLL2 */
#define STM32_PLLCFG_PLL2CFG 0
#define STM32_PLLCFG_PLL2M 0
#define STM32_PLLCFG_PLL2N 0
#define STM32_PLLCFG_PLL2P 0
#define STM32_PLLCFG_PLL2Q 0
#define STM32_PLLCFG_PLL2R 0
#define STM32_PLLCFG_PLL2CFG (RCC_PLLCFGR_PLL2VCOSEL_WIDE | \
RCC_PLLCFGR_PLL2RGE_4_8_MHZ | \
RCC_PLLCFGR_DIVP2EN)
#define STM32_PLLCFG_PLL2M RCC_PLLCKSELR_DIVM2(2)
#define STM32_PLLCFG_PLL2N RCC_PLL2DIVR_N2(200)
#define STM32_PLLCFG_PLL2P RCC_PLL2DIVR_P2(40)
#define STM32_PLLCFG_PLL2Q 0
#define STM32_PLLCFG_PLL2R 0
#define STM32_VCO2_FREQUENCY
#define STM32_PLL2P_FREQUENCY
#define STM32_VCO2_FREQUENCY ((STM32_HSE_FREQUENCY / 2) * 200)
#define STM32_PLL2P_FREQUENCY (STM32_VCO2_FREQUENCY / 2)
#define STM32_PLL2Q_FREQUENCY
#define STM32_PLL2R_FREQUENCY
@ -248,7 +250,11 @@
/* USB 1 and 2 clock source - HSI48 */
#define STM32_RCC_D2CCIP2R_USBSRC RCC_D2CCIP2R_USBSEL_HSI48
#define STM32_RCC_D2CCIP2R_USBSRC RCC_D2CCIP2R_USBSEL_HSI48
/* ADC 1 2 3 clock source - pll2_pclk */
#define STM32_RCC_D3CCIPR_ADCSEL RCC_D3CCIPR_ADCSEL_PLL2
/* FLASH wait states
*

View File

@ -38,6 +38,10 @@
ASRCS =
CSRCS = stm32_boot.c stm32_bringup.c
ifeq ($(CONFIG_ADC),y)
CSRCS += stm32_adc.c
endif
ifeq ($(CONFIG_ARCH_LEDS),y)
CSRCS += stm32_autoleds.c
else

View File

@ -186,8 +186,6 @@ void stm32_spidev_initialize(void);
*
************************************************************************************/
// TODO: implement ADC or delete this
#ifdef CONFIG_ADC
int stm32_adc_setup(void);
#endif

View File

@ -0,0 +1,218 @@
/************************************************************************************
* configs/nucleo-h743zi/src/stm32_adc.c
*
* Copyright (C) 2016, 2019 Gregory Nutt. All rights reserved.
* Authors: Gregory Nutt <gnutt@nuttx.org>
* David Sidrane <david.sidrane@nscdg.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/adc.h>
#include <arch/board/board.h>
#include "chip.h"
#include "stm32_gpio.h"
#include "stm32_adc.h"
#include "nucleo-h743zi.h"
#ifdef CONFIG_ADC
/************************************************************************************
* Pre-processor Definitions
************************************************************************************/
/* Configuration ********************************************************************/
/* Up to 3 ADC interfaces are supported */
#if defined(CONFIG_STM32H7_ADC1) || defined(CONFIG_STM32H7_ADC2) || defined(CONFIG_STM32H7_ADC3)
#ifndef CONFIG_STM32H7_ADC1
# warning "Channel information only available for ADC1"
#endif
/* The number of ADC channels in the conversion list */
#define ADC1_NCHANNELS 5
#define ADC3_NCHANNELS 1
/************************************************************************************
* Private Data
************************************************************************************/
#ifdef CONFIG_STM32H7_ADC1
/* Identifying number of each ADC channel: Variable Resistor.
*
* ADC1: {5, 10, 12, 13, 15};
*/
static const uint8_t g_adc1_chanlist[ADC1_NCHANNELS] = {5, 10, 12, 13, 15};
/* Configurations of pins used by each ADC channels
*
* ADC1: {GPIO_ADC12_INP5, GPIO_ADC123_INP10, GPIO_ADC123_INP12, GPIO_ADC12_INP13,
* GPIO_ADC12_INP15};
*/
static const uint32_t g_adc1_pinlist[ADC1_NCHANNELS] = {GPIO_ADC12_INP5, \
GPIO_ADC123_INP10, \
GPIO_ADC123_INP12, \
GPIO_ADC12_INP13, \
GPIO_ADC12_INP15};
#endif
#ifdef CONFIG_STM32H7_ADC3
/* Identifying number of each ADC channel: Variable Resistor.
*
* ADC3: {6,};
*/
static const uint8_t g_adc3_chanlist[ADC1_NCHANNELS] = {6};
/* Configurations of pins used by each ADC channels
*
*
* ADC3: {GPIO_ADC3_INP6}
*/
static const uint32_t g_adc3_pinlist[ADC3_NCHANNELS] = {GPIO_ADC3_INP6};
#endif
/************************************************************************************
* Private Functions
************************************************************************************/
/************************************************************************************
* Public Functions
************************************************************************************/
/************************************************************************************
* Name: stm32_adc_setup
*
* Description:
* Initialize ADC and register the ADC driver.
*
************************************************************************************/
int stm32_adc_setup(void)
{
#if defined(CONFIG_STM32H7_ADC1) || defined(CONFIG_STM32H7_ADC3)
static bool initialized = false;
struct adc_dev_s *adc;
int ret;
int i;
char devname[] = "/dev/adc0";
/* Check if we have already initialized */
if (!initialized)
{
#endif
#if defined(CONFIG_STM32H7_ADC1)
/* Configure the pins as analog inputs for the selected channels */
for (i = 0; i < ADC1_NCHANNELS; i++)
{
if (g_adc1_pinlist[i] != 0)
{
stm32_configgpio(g_adc1_pinlist[i]);
}
}
/* Call stm32_adcinitialize() to get an instance of the ADC interface */
adc = stm32h7_adc_initialize(1, g_adc1_chanlist, ADC1_NCHANNELS);
if (adc == NULL)
{
aerr("ERROR: Failed to get ADC1 interface\n");
return -ENODEV;
}
/* Register the ADC driver at "/dev/adc0" */
ret = adc_register(devname, adc);
if (ret < 0)
{
aerr("ERROR: adc_register(%s) failed: %d\n", devname, ret);
return ret;
}
devname[8]++;
#endif
#if defined(CONFIG_STM32H7_ADC3)
/* Configure the pins as analog inputs for the selected channels */
for (i = 0; i < ADC3_NCHANNELS; i++)
{
if (g_adc3_pinlist[i] != 0)
{
stm32_configgpio(g_adc3_pinlist[i]);
}
}
/* Call stm32_adcinitialize() to get an instance of the ADC interface */
adc = stm32h7_adc_initialize(3, g_adc3_chanlist, ADC3_NCHANNELS);
if (adc == NULL)
{
aerr("ERROR: Failed to get ADC3 interface\n");
return -ENODEV;
}
/* Register the ADC driver at "/dev/adc0 or 1" */
ret = adc_register(devname, adc);
if (ret < 0)
{
aerr("ERROR: adc_register(%s) failed: %d\n", devname, ret);
return ret;
}
#endif
#if defined(CONFIG_STM32H7_ADC1) || defined(CONFIG_STM32H7_ADC3)
/* Now we are initialized */
initialized = true;
}
return OK;
#else
return -ENOSYS;
#endif
}
#endif /* CONFIG_STM32H7_ADC1 || CONFIG_STM32H7_ADC2 || CONFIG_STM32H7_ADC3 */
#endif /* CONFIG_ADC */