mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-22 17:12:55 +08:00
333 lines
11 KiB
C
333 lines
11 KiB
C
/*!
|
|
* @file apm32e10x_adc.h
|
|
*
|
|
* @brief This file contains all the functions prototypes for the ADC firmware library
|
|
*
|
|
* @version V1.0.0
|
|
*
|
|
* @date 2021-07-26
|
|
*
|
|
*/
|
|
|
|
#ifndef __APM32E10X_ADC_H
|
|
#define __APM32E10X_ADC_H
|
|
|
|
#include "apm32e10x.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/** @addtogroup Peripherals_Library Standard Peripheral Library
|
|
@{
|
|
*/
|
|
|
|
/** @addtogroup ADC_Driver ADC Driver
|
|
@{
|
|
*/
|
|
|
|
/** @addtogroup ADC_Enumerations Enumerations
|
|
@{
|
|
*/
|
|
|
|
/**
|
|
* @brief ADC configuration Mode
|
|
*/
|
|
typedef enum
|
|
{
|
|
ADC_MODE_INDEPENDENT = ((uint32_t)0x00000000), //!< Independent mode
|
|
ADC_MODE_REG_INJEC_SIMULT = ((uint32_t)0x00010000), //!< Combined regular simultaneous and injected simultaneous mode
|
|
ADC_MODE_REG_SIMULT_ALTER_TRIG = ((uint32_t)0x00020000), //!< Combined regular simultaneous and alternate trigger mode
|
|
ADC_MODE_INJEC_SIMULT_FAST_TNTERL = ((uint32_t)0x00030000), //!< Combined injected simultaneous and fast interleaved mode
|
|
ADC_MODE_INJEC_SIMULT_SLOW_INTERL = ((uint32_t)0x00040000), //!< Combined injected simultaneous and slow interleaved mode
|
|
ADC_MODE_INJEC_SIMULT = ((uint32_t)0x00050000), //!< Injected simultaneous mode
|
|
ADC_MODE_REG_SIMULT = ((uint32_t)0x00060000), //!< Regular simultaneous mode
|
|
ADC_MODE_FAST_INTERL = ((uint32_t)0x00070000), //!< Fast interleaved mode
|
|
ADC_MODE_SLOW_INTERL = ((uint32_t)0x00080000), //!< Slow interleaved mode
|
|
ADC_MODE_ALTER_TRIG = ((uint32_t)0x00090000) //!< Alternate trigger mode
|
|
} ADC_MODE_T;
|
|
|
|
/**
|
|
* @brief ADC external trigger sources for regular channels conversion enumeration
|
|
*/
|
|
typedef enum
|
|
{
|
|
ADC_EXT_TRIG_CONV_TMR1_CC1 = ((uint32_t)0x00000000),
|
|
ADC_EXT_TRIG_CONV_TMR1_CC2 = ((uint32_t)0x00020000),
|
|
ADC_EXT_TRIG_CONV_TMR2_CC2 = ((uint32_t)0x00060000),
|
|
ADC_EXT_TRIG_CONV_TMR3_TRGO = ((uint32_t)0x00080000),
|
|
ADC_EXT_TRIG_CONV_TMR4_CC4 = ((uint32_t)0x000A0000),
|
|
ADC_EXT_TRIG_CONV_EINT9_T8_TRGO = ((uint32_t)0x000C0000),
|
|
ADC_EXT_TRIG_CONV_TMR1_CC3 = ((uint32_t)0x00040000),
|
|
ADC_EXT_TRIG_CONV_None = ((uint32_t)0x000E0000),
|
|
|
|
ADC_EXT_TRIG_CONV_TMR3_CC1 = ((uint32_t)0x00000000),
|
|
ADC_EXT_TRIG_CONV_TMR2_CC3 = ((uint32_t)0x00030000),
|
|
ADC_EXT_TRIG_CONV_TMR8_CC1 = ((uint32_t)0x00060000),
|
|
ADC_EXT_TRIG_CONV_TMR8_TRGO = ((uint32_t)0x00080000),
|
|
ADC_EXT_TRIG_CONV_TMR5_CC1 = ((uint32_t)0x000A0000),
|
|
ADC_EXT_TRIG_CONV_TMR5_CC3 = ((uint32_t)0x000C0000)
|
|
} ADC_EXT_TRIG_CONV_T;
|
|
|
|
/**
|
|
* @brief ADC Data Align
|
|
*/
|
|
typedef enum
|
|
{
|
|
ADC_DATA_ALIGN_RIGHT = 0x00000000,
|
|
ADC_DATA_ALIGN_LEFT = 0x00000800
|
|
} ADC_DATA_ALIGN_T;
|
|
|
|
/**
|
|
* @brief ADC Channels
|
|
*/
|
|
typedef enum
|
|
{
|
|
ADC_CHANNEL_0 = ((uint8_t)0x00),
|
|
ADC_CHANNEL_1 = ((uint8_t)0x01),
|
|
ADC_CHANNEL_2 = ((uint8_t)0x02),
|
|
ADC_CHANNEL_3 = ((uint8_t)0x03),
|
|
ADC_CHANNEL_4 = ((uint8_t)0x04),
|
|
ADC_CHANNEL_5 = ((uint8_t)0x05),
|
|
ADC_CHANNEL_6 = ((uint8_t)0x06),
|
|
ADC_CHANNEL_7 = ((uint8_t)0x07),
|
|
ADC_CHANNEL_8 = ((uint8_t)0x08),
|
|
ADC_CHANNEL_9 = ((uint8_t)0x09),
|
|
ADC_CHANNEL_10 = ((uint8_t)0x0A),
|
|
ADC_CHANNEL_11 = ((uint8_t)0x0B),
|
|
ADC_CHANNEL_12 = ((uint8_t)0x0C),
|
|
ADC_CHANNEL_13 = ((uint8_t)0x0D),
|
|
ADC_CHANNEL_14 = ((uint8_t)0x0E),
|
|
ADC_CHANNEL_15 = ((uint8_t)0x0F),
|
|
ADC_CHANNEL_16 = ((uint8_t)0x10),
|
|
ADC_CHANNEL_TEMP_SENSOR = ((uint8_t)0x10),
|
|
ADC_CHANNEL_17 = ((uint8_t)0x11),
|
|
ADC_CHANNEL_V_REFINT = ((uint8_t)0x11)
|
|
} ADC_CHANNEL_T;
|
|
|
|
/**
|
|
* @brief ADC Sampling Time
|
|
*/
|
|
typedef enum
|
|
{
|
|
ADC_SAMPLE_TIME_1_5 = ((uint8_t)0x00),
|
|
ADC_SAMPLE_TIME_7_5 = ((uint8_t)0x01),
|
|
ADC_SAMPLE_TIME_13_5 = ((uint8_t)0x02),
|
|
ADC_SAMPLE_TIME_28_5 = ((uint8_t)0x03),
|
|
ADC_SAMPLE_TIME_41_5 = ((uint8_t)0x04),
|
|
ADC_SAMPLE_TIME_55_5 = ((uint8_t)0x05),
|
|
ADC_SAMPLE_TIME_71_5 = ((uint8_t)0x06),
|
|
ADC_SAMPLE_TIME_239_5 = ((uint8_t)0x07)
|
|
} ADC_SAMPLE_TIME_T;
|
|
|
|
/**
|
|
* @brief ADC external trigger sources for injected channels conversion
|
|
*/
|
|
typedef enum
|
|
{
|
|
/** for ADC1 and ADC2 */
|
|
ADC_EXT_TRIG_INJEC_CONV_TMR2_TRGO = ((uint8_t)0x02),
|
|
ADC_EXT_TRIG_INJEC_CONV_TMR2_CC1 = ((uint8_t)0x03),
|
|
ADC_EXT_TRIG_INJEC_CONV_TMR3_CC4 = ((uint8_t)0x04),
|
|
ADC_EXT_TRIG_INJEC_CONV_TMR4_TRGO = ((uint8_t)0x05),
|
|
ADC_EXT_TRIG_INJEC_CONV_EINT15_T8_CC4 = ((uint8_t)0x06),
|
|
|
|
/** for ADC1, ADC2 and ADC3 */
|
|
ADC_EXT_TRIG_INJEC_CONV_TMR1_TRGO = ((uint8_t)0x00),
|
|
ADC_EXT_TRIG_INJEC_CONV_TMR1_CC4 = ((uint8_t)0x01),
|
|
ADC_EXT_TRIG_INJEC_CONV_NONE = ((uint8_t)0x07),
|
|
|
|
/** for ADC3 only */
|
|
ADC_EXT_TRIG_INJEC_CONV_TMR4_CC3 = ((uint8_t)0x02),
|
|
ADC_EXT_TRIG_INJEC_CONV_TMR8_CC2 = ((uint8_t)0x03),
|
|
ADC_EXT_TRIG_INJEC_CONV_TMR8_CC4 = ((uint8_t)0x04),
|
|
ADC_EXT_TRIG_INJEC_CONV_TMR5_TRGO = ((uint8_t)0x05),
|
|
ADC_EXT_TRIG_INJEC_CONV_TMR5_CC4 = ((uint8_t)0x06)
|
|
} ADC_EXT_TRIG_INJEC_CONV_T;
|
|
|
|
/**
|
|
* @brief ADC Injected channels
|
|
*/
|
|
typedef enum
|
|
{
|
|
ADC_INJEC_CHANNEL_1 = ((uint8_t)0x14),
|
|
ADC_INJEC_CHANNEL_2 = ((uint8_t)0x18),
|
|
ADC_INJEC_CHANNEL_3 = ((uint8_t)0x1C),
|
|
ADC_INJEC_CHANNEL_4 = ((uint8_t)0x20)
|
|
} ADC_INJEC_CHANNEL_T;
|
|
|
|
/**
|
|
* @brief ADC Analog Watchdog Selection
|
|
*/
|
|
typedef enum
|
|
{
|
|
ADC_ANALOG_WATCHDOG_SINGLE_REG = ((uint32_t)0x00800200),
|
|
ADC_ANALOG_WATCHDOG_SINGLE_INJEC = ((uint32_t)0x00400200),
|
|
ADC_ANALOG_WATCHDOG_SINGLE_REG_INJEC = ((uint32_t)0x00C00200),
|
|
ADC_ANALOG_WATCHDOG_ALL_REG = ((uint32_t)0x00800000),
|
|
ADC_ANALOG_WATCHDOG_ALL_INJEC = ((uint32_t)0x00400000),
|
|
ADC_ANALOG_WATCHDOG_ALL_REG_ALL_INJEC = ((uint32_t)0x00C00000),
|
|
ADC_ANALOG_WATCHDOG_NONE = ((uint32_t)0x00000000)
|
|
} ADC_ANALOG_WATCHDOG_T;
|
|
|
|
/**
|
|
* @brief ADC Interrupt definition
|
|
*/
|
|
typedef enum
|
|
{
|
|
ADC_INT_AWD = ((uint16_t)0x0140), //!< Analog Watchdog interrupt
|
|
ADC_INT_EOC = ((uint16_t)0x0220), //!< End Of Conversion interrupt
|
|
ADC_INT_INJEOC = ((uint16_t)0x0480) //!< Injected Channel End Of Conversion interrupt
|
|
} ADC_INT_T;
|
|
|
|
/**
|
|
* @brief ADC Flag
|
|
*/
|
|
typedef enum
|
|
{
|
|
ADC_FLAG_AWD = ((uint8_t)0x01), //!< Analog Watchdog event occur flag
|
|
ADC_FLAG_EOC = ((uint8_t)0x02), //!< End Of Conversion flag
|
|
ADC_FLAG_INJEOC = ((uint8_t)0x04), //!< Injected Channel End Of Conversion flag
|
|
ADC_FLAG_INJCS = ((uint8_t)0x08), //!< Injected Channel Conversion Start flag
|
|
ADC_FLAG_REGCS = ((uint8_t)0x10) //!< Regular Channel Conversion Start flag
|
|
} ADC_FLAG_T;
|
|
|
|
/**@} end of group ADC_Enumerations*/
|
|
|
|
|
|
/** @addtogroup ADC_Macros Macros
|
|
@{
|
|
*/
|
|
|
|
/** ADC_IJD Offset */
|
|
#define INJDATA_OFFSET ((uint8_t)0x28)
|
|
|
|
/** ADC_RDG register address */
|
|
#define RDG_ADDRESS ((uint32_t)0x4001244C)
|
|
|
|
/** INJSEQ register config */
|
|
#define INJSEQ_SET_INJSEQC ((uint32_t)0x0000001F)
|
|
#define INJSEQ_SET_INJSEQLEN ((uint32_t)0x00300000)
|
|
|
|
/** SMPTIM register SET */
|
|
#define SMPCYCCFG_SET_SMPTIM1 ((uint32_t)0x00000007)
|
|
#define SMPCYCCFG_SET_SMPTIM2 ((uint32_t)0x00000007)
|
|
|
|
/** REGSEQ register SET */
|
|
#define REGSEQC_SET_REGSEQ3 ((uint32_t)0x0000001F)
|
|
#define REGSEQC_SET_REGSEQ2 ((uint32_t)0x0000001F)
|
|
#define REGSEQC_SET_REGSEQ1 ((uint32_t)0x0000001F)
|
|
|
|
/**@} end of group ADC_Macros*/
|
|
|
|
|
|
/** @addtogroup ADC_Structure Data Structure
|
|
@{
|
|
*/
|
|
|
|
/**
|
|
* @brief ADC Config structure definition
|
|
*/
|
|
typedef struct
|
|
{
|
|
ADC_MODE_T mode;
|
|
uint8_t scanConvMode; //!< This parameter can be ENABLE or DISABLE.
|
|
uint8_t continuosConvMode; //!< This parameter can be ENABLE or DISABLE.
|
|
ADC_EXT_TRIG_CONV_T externalTrigConv;
|
|
ADC_DATA_ALIGN_T dataAlign;
|
|
uint8_t nbrOfChannel; //!< This parameter must range from 1 to 16.
|
|
} ADC_Config_T;
|
|
|
|
/**@} end of group ADC_Structure*/
|
|
|
|
|
|
/** @addtogroup ADC_Fuctions Fuctions
|
|
@{
|
|
*/
|
|
|
|
/** ADC reset and common configuration */
|
|
void ADC_Reset(ADC_T* adc);
|
|
void ADC_Config(ADC_T* adc, ADC_Config_T* adcConfig);
|
|
void ADC_ConfigStructInit(ADC_Config_T* adcConfig);
|
|
void ADC_ConfigRegularChannel(ADC_T* adc, uint8_t channel,uint8_t rank, uint8_t sampleTime);
|
|
void ADC_Enable(ADC_T* adc);
|
|
void ADC_Disable(ADC_T* adc);
|
|
|
|
/** ADC for DMA */
|
|
void ADC_EnableDMA(ADC_T* adc);
|
|
void ADC_DisableDMA(ADC_T* adc);
|
|
|
|
/** ADC Calibration */
|
|
void ADC_ResetCalibration(ADC_T* adc);
|
|
uint8_t ADC_ReadResetCalibrationStatus(ADC_T* adc);
|
|
void ADC_StartCalibration(ADC_T* adc);
|
|
uint8_t ADC_ReadCalibrationStartFlag(ADC_T* adc);
|
|
|
|
/** ADC software start conversion */
|
|
void ADC_EnableSoftwareStartConv(ADC_T* adc);
|
|
void ADC_DisableSoftwareStartConv(ADC_T* adc);
|
|
uint8_t ADC_ReadSoftwareStartConvStatus(ADC_T* adc);
|
|
|
|
/** ADC Discontinuous mode */
|
|
void ADC_ConfigDiscModeChannel(ADC_T* adc, uint8_t number);
|
|
void ADC_EnableDiscMode(ADC_T* adc);
|
|
void ADC_DisableDiscMode(ADC_T* adc);
|
|
|
|
/** ADC External trigger conversion */
|
|
void ADC_EnableExternalTrigConv(ADC_T* adc);
|
|
void ADC_DisableExternalTrigConv(ADC_T* adc);
|
|
|
|
/** ADC Conversion result */
|
|
uint16_t ADC_ReadConversionValue(ADC_T* adc);
|
|
uint32_t ADC_ReadDualModeConversionValue(ADC_T* adc);
|
|
|
|
/** ADC Automatic injected group */
|
|
void ADC_EnableInjectedConv(ADC_T* adc);
|
|
void ADC_DisableInjectedConv(ADC_T* adc);
|
|
void ADC_EnableInjectedDiscMode(ADC_T* adc);
|
|
void ADC_DisableInjectedDiscMode(ADC_T* adc);
|
|
|
|
/** ADC External trigger for injected channels conversion */
|
|
void ADC_ConfigExternalTrigInjectedConv(ADC_T* adc, ADC_EXT_TRIG_INJEC_CONV_T extTrigInjecConv);
|
|
void ADC_EnableExternalTrigInjectedConv(ADC_T* adc);
|
|
void ADC_DisableExternalTrigInjectedConv(ADC_T* adc);
|
|
|
|
/** ADC Start of the injected channels conversion */
|
|
void ADC_EnableSoftwareStartInjectedConv(ADC_T* adc);
|
|
void ADC_DisableSoftwareStartInjectedConv(ADC_T* adc);
|
|
uint8_t ADC_ReadSoftwareStartInjectedConvStatus(ADC_T* adc);
|
|
|
|
/** ADC injected channel */
|
|
void ADC_ConfigInjectedChannel(ADC_T* adc, uint8_t channel, uint8_t rank, uint8_t sampleTime);
|
|
void ADC_ConfigInjectedSequencerLength(ADC_T* adc, uint8_t length);
|
|
void ADC_ConfigInjectedOffset(ADC_T* adc, ADC_INJEC_CHANNEL_T channel, uint16_t offSet);
|
|
uint16_t ADC_ReadInjectedConversionValue(ADC_T* adc, ADC_INJEC_CHANNEL_T channel);
|
|
|
|
/** ADC analog watchdog */
|
|
void ADC_EnableAnalogWatchdog(ADC_T* adc, uint32_t analogWatchdog);
|
|
void ADC_DisableAnalogWatchdog(ADC_T* adc);
|
|
void ADC_ConfigAnalogWatchdogThresholds(ADC_T* adc, uint16_t highThreshold, uint16_t lowThreshold);
|
|
void ADC_ConfigAnalogWatchdogSingleChannel(ADC_T* adc, uint8_t channel);
|
|
|
|
/** ADC temperature sensor */
|
|
void ADC_EnableTempSensorVrefint(ADC_T* adc);
|
|
void ADC_DisableTempSensorVrefint(ADC_T* adc);
|
|
|
|
/** Interrupt and flag */
|
|
void ADC_EnableInterrupt(ADC_T* adc, uint16_t interrupt);
|
|
void ADC_DisableInterrupt(ADC_T* adc, uint16_t interrupt);
|
|
uint8_t ADC_ReadStatusFlag(ADC_T* adc, ADC_FLAG_T flag);
|
|
void ADC_ClearStatusFlag(ADC_T* adc, uint8_t flag);
|
|
uint8_t ADC_ReadIntFlag(ADC_T* adc, ADC_INT_T interrupt);
|
|
void ADC_ClearIntFlag(ADC_T* adc, uint16_t interrupt);
|
|
|
|
/**@} end of group ADC_Fuctions*/
|
|
/**@} end of group ADC_Driver*/
|
|
/**@} end of group Peripherals_Library*/
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /** __APM32E10X_ADC_H */
|