mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-15 17:02:53 +08:00
347 lines
12 KiB
C
347 lines
12 KiB
C
/*!
|
|
* @file apm32f0xx_adc.h
|
|
*
|
|
* @brief This file contains all the functions prototypes for the ADC firmware library
|
|
*
|
|
* @version V1.0.1
|
|
*
|
|
* @date 2021-07-01
|
|
*
|
|
*/
|
|
|
|
#ifndef __ADC_H
|
|
#define __ADC_H
|
|
|
|
#include "apm32f0xx.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/** @addtogroup Peripherals_Library Standard Peripheral Library
|
|
@{
|
|
*/
|
|
|
|
/** @addtogroup ADC_Driver ADC Driver
|
|
@{
|
|
*/
|
|
|
|
/** @addtogroup ADC_Enumerations Enumerations
|
|
@{
|
|
*/
|
|
|
|
/**
|
|
* @brief ADC conversion mode
|
|
*/
|
|
typedef enum
|
|
{
|
|
ADC_CONVERSION_SINGLE = ((uint8_t)0), //!< Single conversion mode
|
|
ADC_CONVERSION_CONTINUOUS = ((uint8_t)1), //!< Continuous conversion mode
|
|
} ADC_CONVERSION_T;
|
|
|
|
/**
|
|
* @brief ADC Jitter
|
|
*/
|
|
typedef enum
|
|
{
|
|
ADC_JITTER_PCLKDIV2 = ((uint8_t)0x01), //!< ADC clocked by PCLK div2
|
|
ADC_JITTER_PCLKDIV4 = ((uint8_t)0x02), //!< ADC clocked by PCLK div4
|
|
} ADC_JITTER_T;
|
|
|
|
/**
|
|
* @brief ADC clock mode
|
|
*/
|
|
typedef enum
|
|
{
|
|
ADC_CLOCK_MODE_ASYNCLK = ((uint8_t)0x00), //!< ADC Asynchronous clock mode
|
|
ADC_CLOCK_MODE_SYNCLKDIV2 = ((uint8_t)0x01), //!< Synchronous clock mode divided by 2
|
|
ADC_CLOCK_MODE_SYNCLKDIV4 = ((uint8_t)0x02), //!< Synchronous clock mode divided by 4
|
|
} ADC_CLOCK_MODE_T;
|
|
|
|
/**
|
|
* @brief ADC data resolution
|
|
*/
|
|
typedef enum
|
|
{
|
|
ADC_RESOLUTION_12B = ((uint8_t)0x00), //!< ADC Resolution is 12 bits
|
|
ADC_RESOLUTION_10B = ((uint8_t)0x01), //!< ADC Resolution is 10 bits
|
|
ADC_RESOLUTION_8B = ((uint8_t)0x02), //!< ADC Resolution is 8 bits
|
|
ADC_RESOLUTION_6B = ((uint8_t)0x03), //!< ADC Resolution is 6 bits
|
|
} ADC_RESOLUTION_T;
|
|
|
|
/**
|
|
* @brief ADC data alignment
|
|
*/
|
|
typedef enum
|
|
{
|
|
ADC_DATA_ALIGN_RIGHT = ((uint8_t)0), //!< Data alignment right
|
|
ADC_DATA_ALIGN_LEFT = ((uint8_t)1), //!< Data alignment left
|
|
} ADC_DATA_ALIGN_T;
|
|
|
|
/**
|
|
* @brief ADC scan sequence direction
|
|
*/
|
|
typedef enum
|
|
{
|
|
ADC_SCAN_DIR_UPWARD = ((uint8_t)0), //!< from CHSEL0 to CHSEL17
|
|
ADC_SCAN_DIR_BACKWARD = ((uint8_t)1), //!< from CHSEL17 to CHSEL0
|
|
} ADC_SCAN_DIR_T;
|
|
|
|
/**
|
|
* @brief ADC DMA Mode
|
|
*/
|
|
typedef enum
|
|
{
|
|
ADC_DMA_MODE_ONESHOUT = ((uint8_t)0), //!< ADC DMA Mode Select one shot
|
|
ADC_DMA_MODE_CIRCULAR = ((uint8_t)1), //!< ADC DMA Mode Select circular
|
|
} ADC_DMA_MODE_T;
|
|
|
|
/**
|
|
* @brief ADC external conversion trigger edge selectio
|
|
*/
|
|
typedef enum
|
|
{
|
|
ADC_EXT_TRIG_EDGE_NONE = ((uint8_t)0x00), //!< ADC External Trigger Conversion mode disabled
|
|
ADC_EXT_TRIG_EDGE_RISING = ((uint8_t)0x01), //!< ADC External Trigger Conversion mode rising edge
|
|
ADC_EXT_TRIG_EDGE_FALLING = ((uint8_t)0x02), //!< ADC External Trigger Conversion mode falling edge
|
|
ADC_EXT_TRIG_EDGE_ALL = ((uint8_t)0x03), //!< ADC External Trigger Conversion mode rising and falling edges
|
|
} ADC_EXT_TRIG_EDGE_T;
|
|
|
|
/**
|
|
* @brief ADC external trigger sources selection chann conversion
|
|
*/
|
|
typedef enum
|
|
{
|
|
ADC_EXT_TRIG_CONV_TRG0 = ((uint8_t)0x00), //!< ADC External Trigger Conversion timer1 TRG0
|
|
ADC_EXT_TRIG_CONV_TRG1 = ((uint8_t)0x01), //!< ADC External Trigger Conversion timer1 CC4
|
|
ADC_EXT_TRIG_CONV_TRG2 = ((uint8_t)0x02), //!< ADC External Trigger Conversion timer2 TRGO
|
|
ADC_EXT_TRIG_CONV_TRG3 = ((uint8_t)0x03), //!< ADC External Trigger Conversion timer3 TRG0
|
|
ADC_EXT_TRIG_CONV_TRG4 = ((uint8_t)0x04), //!< ADC External Trigger Conversion timer15 TRG0
|
|
} ADC_EXT_TRIG_CONV_T;
|
|
|
|
/**
|
|
* @brief ADC analog watchdog channel selection
|
|
*/
|
|
typedef enum
|
|
{
|
|
ADC_ANALG_WDT_CHANNEL_0 = ((uint8_t)0x00), //!< AWD Channel 0
|
|
ADC_ANALG_WDT_CHANNEL_1 = ((uint8_t)0x01), //!< AWD Channel 1
|
|
ADC_ANALG_WDT_CHANNEL_2 = ((uint8_t)0x02), //!< AWD Channel 2
|
|
ADC_ANALG_WDT_CHANNEL_3 = ((uint8_t)0x03), //!< AWD Channel 3
|
|
ADC_ANALG_WDT_CHANNEL_4 = ((uint8_t)0x04), //!< AWD Channel 4
|
|
ADC_ANALG_WDT_CHANNEL_5 = ((uint8_t)0x05), //!< AWD Channel 5
|
|
ADC_ANALG_WDT_CHANNEL_6 = ((uint8_t)0x06), //!< AWD Channel 6
|
|
ADC_ANALG_WDT_CHANNEL_7 = ((uint8_t)0x07), //!< AWD Channel 7
|
|
ADC_ANALG_WDT_CHANNEL_8 = ((uint8_t)0x08), //!< AWD Channel 8
|
|
ADC_ANALG_WDT_CHANNEL_9 = ((uint8_t)0x09), //!< AWD Channel 9
|
|
ADC_ANALG_WDT_CHANNEL_10 = ((uint8_t)0x0A), //!< AWD Channel 10
|
|
ADC_ANALG_WDT_CHANNEL_11 = ((uint8_t)0x0B), //!< AWD Channel 11
|
|
ADC_ANALG_WDT_CHANNEL_12 = ((uint8_t)0x0C), //!< AWD Channel 12
|
|
ADC_ANALG_WDT_CHANNEL_13 = ((uint8_t)0x0D), //!< AWD Channel 13
|
|
ADC_ANALG_WDT_CHANNEL_14 = ((uint8_t)0x0E), //!< AWD Channel 14
|
|
ADC_ANALG_WDT_CHANNEL_15 = ((uint8_t)0x0F), //!< AWD Channel 15
|
|
ADC_ANALG_WDT_CHANNEL_16 = ((uint8_t)0x10), //!< AWD Channel 16
|
|
ADC_ANALG_WDT_CHANNEL_17 = ((uint8_t)0x11), //!< AWD Channel 17
|
|
ADC_ANALG_WDT_CHANNEL_18 = ((uint8_t)0x12), //!< AWD Channel 18
|
|
} ADC_ANALG_WDT_CHANNEL_T;
|
|
|
|
/**
|
|
* @brief ADC sampling times
|
|
*/
|
|
typedef enum
|
|
{
|
|
ADC_SAMPLE_TIME_1_5 = ((uint8_t)0x00), //!< 1.5 ADC clock cycles
|
|
ADC_SAMPLE_TIME_7_5 = ((uint8_t)0x01), //!< 7.5 ADC clock cycles
|
|
ADC_SAMPLE_TIME_13_5 = ((uint8_t)0x02), //!< 13.5 ADC clock cycles
|
|
ADC_SAMPLE_TIME_28_5 = ((uint8_t)0x03), //!< 28.5 ADC clock cycles
|
|
ADC_SAMPLE_TIME_41_5 = ((uint8_t)0x04), //!< 41.5 ADC clock cycles
|
|
ADC_SAMPLE_TIME_55_5 = ((uint8_t)0x05), //!< 55.5 ADC clock cycles
|
|
ADC_SAMPLE_TIME_71_5 = ((uint8_t)0x06), //!< 71.5 ADC clock cycles
|
|
ADC_SAMPLE_TIME_239_5 = ((uint8_t)0x07), //!< 239.5 ADC clock cycles
|
|
} ADC_SAMPLE_TIME_T;
|
|
|
|
/**
|
|
* @brief ADC channel selection
|
|
*/
|
|
typedef enum
|
|
{
|
|
ADC_CHANNEL_0 = ((uint32_t)0x00000001), //!< ADC Channel 0
|
|
ADC_CHANNEL_1 = ((uint32_t)0x00000002), //!< ADC Channel 1
|
|
ADC_CHANNEL_2 = ((uint32_t)0x00000004), //!< ADC Channel 2
|
|
ADC_CHANNEL_3 = ((uint32_t)0x00000008), //!< ADC Channel 3
|
|
ADC_CHANNEL_4 = ((uint32_t)0x00000010), //!< ADC Channel 4
|
|
ADC_CHANNEL_5 = ((uint32_t)0x00000020), //!< ADC Channel 5
|
|
ADC_CHANNEL_6 = ((uint32_t)0x00000040), //!< ADC Channel 6
|
|
ADC_CHANNEL_7 = ((uint32_t)0x00000080), //!< ADC Channel 7
|
|
ADC_CHANNEL_8 = ((uint32_t)0x00000100), //!< ADC Channel 8
|
|
ADC_CHANNEL_9 = ((uint32_t)0x00000200), //!< ADC Channel 9
|
|
ADC_CHANNEL_10 = ((uint32_t)0x00000400), //!< ADC Channel 10
|
|
ADC_CHANNEL_11 = ((uint32_t)0x00000800), //!< ADC Channel 11
|
|
ADC_CHANNEL_12 = ((uint32_t)0x00001000), //!< ADC Channel 12
|
|
ADC_CHANNEL_13 = ((uint32_t)0x00002000), //!< ADC Channel 13
|
|
ADC_CHANNEL_14 = ((uint32_t)0x00004000), //!< ADC Channel 14
|
|
ADC_CHANNEL_15 = ((uint32_t)0x00008000), //!< ADC Channel 15
|
|
ADC_CHANNEL_16 = ((uint32_t)0x00010000), //!< ADC Channel 16
|
|
ADC_CHANNEL_17 = ((uint32_t)0x00020000), //!< ADC Channel 17
|
|
ADC_CHANNEL_18 = ((uint32_t)0x00040000), //!< ADC Channel 18 (Not for APM32F030 devices)
|
|
} ADC_CHANNEL_T;
|
|
|
|
/**
|
|
* @brief ADC interrupts definition
|
|
*/
|
|
typedef enum
|
|
{
|
|
ADC_INT_ADRDY = ((uint8_t)0x01), //!< ADC ready interrupt
|
|
ADC_INT_CSMP = ((uint8_t)0x02), //!< End of sampling interrupt
|
|
ADC_INT_CC = ((uint8_t)0x04), //!< End of conversion interrupt
|
|
ADC_INT_CS = ((uint8_t)0x08), //!< End of sequence interrupt
|
|
ADC_INT_OVR = ((uint8_t)0x10), //!< ADC overrun interrupt
|
|
ADC_INT_AWD = ((uint8_t)0x80), //!< Analog watchdog interrupt
|
|
} ADC_INT_T;
|
|
|
|
/**
|
|
* @brief ADC Interrupt flag
|
|
*/
|
|
typedef enum
|
|
{
|
|
ADC_INT_FLAG_ADRDY = ((uint8_t)0x01), //!< ADC ready interrupt flag
|
|
ADC_INT_FLAG_CSMP = ((uint8_t)0x02), //!< End of sampling interrupt flag
|
|
ADC_INT_FLAG_CC = ((uint8_t)0x04), //!< End of conversion interrupt flag
|
|
ADC_INT_FLAG_CS = ((uint8_t)0x08), //!< End of sequence interrupt flag
|
|
ADC_INT_FLAG_OVR = ((uint8_t)0x10), //!< ADC overrun interrupt flag
|
|
ADC_INT_FLAG_AWD = ((uint8_t)0x80), //!< Analog watchdog interrupt flag
|
|
} ADC_INT_FLAG_T;
|
|
|
|
/**
|
|
* @brief ADC flag
|
|
*/
|
|
typedef enum
|
|
{
|
|
ADC_FLAG_ADCON = ((uint32_t)0x01000001), //!< ADC enable flag
|
|
ADC_FLAG_ADCOFF = ((uint32_t)0x01000002), //!< ADC disable flag
|
|
ADC_FLAG_ADCSTA = ((uint32_t)0x01000004), //!< ADC start conversion flag
|
|
ADC_FLAG_ADCSTOP = ((uint32_t)0x01000010), //!< ADC stop conversion flag
|
|
ADC_FLAG_ADCCAL = ((int) 0x81000000), //!< ADC calibration flag
|
|
|
|
ADC_FLAG_ADRDY = ((uint8_t)0x01), //!< ADC ready flag
|
|
ADC_FLAG_CSMP = ((uint8_t)0x02), //!< End of sampling flag
|
|
ADC_FLAG_CC = ((uint8_t)0x04), //!< End of conversion flag
|
|
ADC_FLAG_CS = ((uint8_t)0x08), //!< End of sequence flag
|
|
ADC_FLAG_OVR = ((uint8_t)0x10), //!< ADC overrun flag
|
|
ADC_FLAG_AWD = ((uint8_t)0x80), //!< Analog watchdog flag
|
|
} ADC_FLAG_T;
|
|
|
|
/**@} end of group ADC_Enumerations*/
|
|
|
|
|
|
/** @addtogroup ADC_Macros Macros
|
|
@{
|
|
*/
|
|
|
|
/** ADC_channels */
|
|
#define ADC_Channel_TempSensor ((uint32_t)ADC_CHANNEL_16)
|
|
#define ADC_Channel_Vrefint ((uint32_t)ADC_CHANNEL_17)
|
|
#define ADC_Channel_Vbat ((uint32_t)ADC_CHANNEL_18)
|
|
|
|
/* ADC CFGR mask */
|
|
#define CFGR1_CLEAR_MASK ((uint32_t)0xFFFFD203)
|
|
|
|
/* Calibration time out */
|
|
#define CALIBRATION_TIMEOUT ((uint32_t)0x0000F000)
|
|
|
|
/**@} end of group ADC_Macros*/
|
|
|
|
|
|
/** @addtogroup ADC_Structure Data Structure
|
|
@{
|
|
*/
|
|
|
|
/**
|
|
* @brief ADC Config struct definition
|
|
*/
|
|
typedef struct
|
|
{
|
|
ADC_RESOLUTION_T resolution; //!< Specifies the ADC data resolution
|
|
ADC_DATA_ALIGN_T dataAlign; //!< Specifies the data alignment mode
|
|
ADC_SCAN_DIR_T scanDir; //!< Specifies the scan mode
|
|
ADC_CONVERSION_T convMode; //!< Specifies the conversion mode
|
|
ADC_EXT_TRIG_CONV_T extTrigConv; //!< Specifies the external trigger sources
|
|
ADC_EXT_TRIG_EDGE_T extTrigEdge; //!< Specifies the external conversion trigger edge
|
|
} ADC_Config_T;
|
|
|
|
/**@} end of group ADC_Structure*/
|
|
|
|
|
|
/** @addtogroup ADC_Fuctions Fuctions
|
|
@{
|
|
*/
|
|
|
|
/** ADC reset and configuration */
|
|
void ADC_Reset(void);
|
|
void ADC_Config(ADC_Config_T* adcConfig);
|
|
void ADC_ConfigStructInit(ADC_Config_T* adcConfig);
|
|
void ADC_Enable(void);
|
|
void ADC_Disable(void);
|
|
void ADC_EnableAutoPowerOff(void);
|
|
void ADC_DisableAutoPowerOff(void);
|
|
void ADC_EnableWaitMode(void);
|
|
void ADC_DisableWaitMode(void);
|
|
void ADC_ConfigChannel(uint32_t channel, uint8_t sampleTime);
|
|
void ADC_EnableContinuousMode(void);
|
|
void ADC_DisableContinuousMode(void);
|
|
void ADC_EnableDiscMode(void);
|
|
void ADC_DisableDiscMode(void);
|
|
void ADC_EnableOverrunMode(void);
|
|
void ADC_DisableOverrunMode(void);
|
|
void ADC_StopConversion(void);
|
|
void ADC_StartConversion(void);
|
|
void ADC_DMARequestMode(ADC_DMA_MODE_T DMARequestMode);
|
|
|
|
/** ADC clock and jitter */
|
|
void ADC_ClockMode(ADC_CLOCK_MODE_T clockMode);
|
|
void ADC_EnableJitter(ADC_JITTER_T jitter);
|
|
void ADC_DisableJitter(ADC_JITTER_T jitter);
|
|
|
|
/** ADC analog watchdog */
|
|
void ADC_EnableAnalogWatchdog(void);
|
|
void ADC_DisableAnalogWatchdog(void);
|
|
void ADC_AnalogWatchdogLowThreshold(uint16_t lowThreshold);
|
|
void ADC_AnalogWatchdogHighThreshold(uint16_t highThreshold);
|
|
void ADC_AnalogWatchdogSingleChannel(uint32_t channel);
|
|
void ADC_EnableAnalogWatchdogSingleChannel(void);
|
|
void ADC_DisableAnalogWatchdogSingleChannel(void);
|
|
|
|
/** ADC common configuration */
|
|
void ADC_EnableTempSensor(void);
|
|
void ADC_DisableTempSensor(void);
|
|
void ADC_EnableVrefint(void);
|
|
void ADC_DisableVrefint(void);
|
|
void ADC_EnableVbat(void); //!< Not for APM32F030 devices
|
|
void ADC_DisableVbat(void); //!< Not for APM32F030 devices
|
|
|
|
/** Read data */
|
|
uint32_t ADC_ReadCalibrationFactor(void);
|
|
uint16_t ADC_ReadConversionValue(void);
|
|
|
|
/** DMA */
|
|
void ADC_EnableDMA(void);
|
|
void ADC_DisableDMA(void);
|
|
|
|
/** Interrupt and flag */
|
|
void ADC_EnableInterrupt(uint8_t interrupt);
|
|
void ADC_DisableInterrupt(uint8_t interrupt);
|
|
uint8_t ADC_ReadStatusFlag(ADC_FLAG_T flag);
|
|
void ADC_ClearStatusFlag(uint32_t flag);
|
|
uint8_t ADC_ReadIntFlag(ADC_INT_FLAG_T flag);
|
|
void ADC_ClearIntFlag(uint32_t flag);
|
|
|
|
/**@} end of group ADC_Fuctions*/
|
|
/**@} end of group ADC_Driver*/
|
|
/**@} end of group Peripherals_Library*/
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __ADC_H */
|