blackmagic/include/libopencm3/stm32/common/adc_common_v2_multi.h
Karl Palsson f67e217ffb stm32: adc-v2: Pull up the two forms of the adc-v2
The adc v2 periph has the same register map, but comes in two flavours, one
supporting injected channels, more watchdogs, per channel sampling times and
so on, and one "simple" version.

Pull up the f3 and f0 portions into the appropriate files, after comparing with
L0 and L4 reference manuals, even if those are not fully landed yet.
2016-03-30 16:59:56 +00:00

157 lines
5.5 KiB
C

/** @addtogroup adc_defines
@author @htmlonly &copy; @endhtmlonly 2015 Karl Palsson <karlp@tweak.net.au>
*/
/*
* This file is part of the libopencm3 project.
*
* Copyright (C) 2015 Karl Palsson <karlp@tweak.net.au>
*
* This library is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
/**@{*/
/* THIS FILE SHOULD NOT BE INCLUDED DIRECTLY, BUT ONLY VIA ADC.H
The order of header inclusion is important. adc.h includes the device
specific memorymap.h header before including this header file.*/
/** @cond */
#ifdef LIBOPENCM3_ADC_H
/** @endcond */
#ifndef LIBOPENCM3_ADC_COMMON_V2_MULTI_H
#define LIBOPENCM3_ADC_COMMON_V2_MULTI_H
/*
* The adc v2 peripheral optionally supports per channel sampling, injected
* sequences, watchdogs, offsets and other "advanced" features, and is
* found on the (so far) F3 and L4,
* or only a much "simpler" version as found on (so far) f0 and l0.
*/
/* ----- ADC registers -----------------------------------------------------*/
/* Sample Time Register 2 */
#define ADC_SMPR2(adc) MMIO32((adc) + 0x18)
/* Watchdog Threshold Register 2 */
#define ADC_TR2(adc) MMIO32((adc) + 0x24)
/* Watchdog Threshold Register 3 */
#define ADC_TR3(adc) MMIO32((adc) + 0x28)
/* Regular Sequence Register x (ADCx_SQRy, x=1..4, y=1..4) SQRy */
#define ADC_SQR1(adc) MMIO32((adc) + 0x30)
#define ADC_SQR2(adc) MMIO32((adc) + 0x34)
#define ADC_SQR3(adc) MMIO32((adc) + 0x38)
#define ADC_SQR4(adc) MMIO32((adc) + 0x3C)
/* Injected Sequence Register (ADCx_JSQR, x=1..4) JSQR */
#define ADC_JSQR(adc) MMIO32((adc) + 0x30)
/* Offset Register x (ADCx_OFRy, x=1..4) (y=1..4) OFRy */
#define ADC_OFR1(adc) MMIO32((adc) + 0x60)
#define ADC_OFR2(adc) MMIO32((adc) + 0x64)
#define ADC_OFR3(adc) MMIO32((adc) + 0x68)
#define ADC_OFR4(adc) MMIO32((adc) + 0x6C)
/* Injected Data Register y (ADCx_JDRy, x=1..4, y= 1..4) JDRy */
#define ADC_JDR1(adc) MMIO32((adc) + 0x80)
#define ADC_JDR2(adc) MMIO32((adc) + 0x84)
#define ADC_JDR3(adc) MMIO32((adc) + 0x88)
#define ADC_JDR4(adc) MMIO32((adc) + 0x8C)
/* Analog Watchdog 2 Configuration Register (ADCx_AWD2CR, x=1..4) AWD2CR */
#define ADC_AWD2CR(adc) MMIO32((adc) + 0xA0)
/* Analog Watchdog 3 Configuration Register (ADCx_AWD3CR, x=1..4) AWD3CR */
#define ADC_AWD3CR(adc) MMIO32((adc) + 0xA4)
/* Differential Mode Selection Register 2 (ADCx_DIFSEL, x=1..4) DIFSEL */
#define ADC_DIFSEL(adc) MMIO32((adc) + 0xB0)
/* Calibration Factors (ADCx_CALFACT, x=1..4) CALFACT */
#define ADC_CALFACT(adc) MMIO32((adc) + 0xB4)
/* ADC common (shared) registers */
#define ADC_CSR(adc) MMIO32((adc) + 0x300 + 0x0)
#define ADC_CDR(adc) MMIO32((adc) + 0x300 + 0xa)
/* --- Register values ------------------------------------------------------*/
/* ADC_ISR Values -----------------------------------------------------------*/
/* QOVF: Injected context queue overflow */
#define ADC_ISR_JQOVF (1 << 10)
/* AWD3: Analog watchdog 3 flag */
#define ADC_ISR_AWD3 (1 << 9)
/* AWD2: Analog watchdog 2 flag */
#define ADC_ISR_AWD2 (1 << 8)
/* JEOS: Injected channel end of sequence flag */
#define ADC_ISR_JEOS (1 << 6)
/* JEOC: Injected channel end of conversion flag */
#define ADC_ISR_JEOC (1 << 5)
/* ADC_IER Values -----------------------------------------------------------*/
/* JQOVFIE: Injected context queue overflow interrupt enable */
#define ADC_IER_JQOVFIE (1 << 10)
/* AWD3IE: Analog watchdog 3 interrupt enable */
#define ADC_IER_AWD3IE (1 << 9)
/* AWD2IE: Analog watchdog 2 interrupt enable */
#define ADC_IER_AWD2IE (1 << 8)
/* JEOSIE: End of injected sequence of conversions interrupt enable */
#define ADC_IER_JEOSIE (1 << 6)
/* JEOCIE: End of injected conversion interrupt enable */
#define ADC_IER_JEOCIE (1 << 5)
/* ADC_CR Values ------------------------------------------------------------*/
/* ADCALDIF: Differential mode for calibration */
#define ADC_CR_ADCALDIF (1 << 30)
/* JADSTP: ADC stop of injected conversion command */
#define ADC_CR_JADSTP (1 << 5)
/* JADSTART: ADC start of injected conversion */
#define ADC_CR_JADSTART (1 << 3)
/* ADC_CFGR1 Values ---------------------------------------------------------*/
/* JAUTO: Autoamtic injected group conversion */
#define ADC_CFGR1_JAUTO (1 << 25)
/* JAWD1EN: Analog watchdog 1 enable on injected channels */
#define ADC_CFGR1_JAWD1EN (1 << 24)
/* JQM: JSQR queue mode */
#define ADC_CFGR1_JQM (1 << 21)
/* JDISCEN: Discontinuous mode on injected channels */
#define ADC_CFGR1_JDISCEN (1 << 20)
/* DISCNUM[2:0]: Discontinuous mode channel count */
#define ADC_CFGR1_DISCNUM_SHIFT 17
#define ADC_CFGR1_DISCNUM_MASK (0x7 << ADC_CFGR1_DISCNUM_SHIFT)
#define ADC_CFGR1_DISCNUM_VAL(x) (((x) - 1) << ADC_CFGR1_DISCNUM_SHIFT)
/* EXTSEL[3:0]: External trigger selection for regular group */
#define ADC_CFGR1_EXTSEL_SHIFT 6
#define ADC_CFGR1_EXTSEL_MASK (0xf << ADC_CFGR1_EXTSEL_SHIFT)
#define ADC_CFGR1_EXTSEL_VAL(x) ((x) << ADC_CFGR1_EXTSEL_SHIFT)
/* --- Function prototypes ------------------------------------------------- */
BEGIN_DECLS
END_DECLS
#endif
#endif /* LIBOPENCM3_ADC_H */
/**@}*/