123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563 |
- ////////////////////////////////////////////////////////////////////////////////
- /// @file hal_adc.c
- /// @author AE TEAM
- /// @brief THIS FILE PROVIDES ALL THE ADC FIRMWARE FUNCTIONS.
- ////////////////////////////////////////////////////////////////////////////////
- /// @attention
- ///
- /// THE EXISTING FIRMWARE IS ONLY FOR REFERENCE, WHICH IS DESIGNED TO PROVIDE
- /// CUSTOMERS WITH CODING INFORMATION ABOUT THEIR PRODUCTS SO THEY CAN SAVE
- /// TIME. THEREFORE, MINDMOTION SHALL NOT BE LIABLE FOR ANY DIRECT, INDIRECT OR
- /// CONSEQUENTIAL DAMAGES ABOUT ANY CLAIMS ARISING OUT OF THE CONTENT OF SUCH
- /// HARDWARE AND/OR THE USE OF THE CODING INFORMATION CONTAINED HEREIN IN
- /// CONNECTION WITH PRODUCTS MADE BY CUSTOMERS.
- ///
- /// <H2><CENTER>© COPYRIGHT MINDMOTION </CENTER></H2>
- ////////////////////////////////////////////////////////////////////////////////
- // Define to prevent recursive inclusion
- #define _HAL_ADC_C_
- // Files includes
- #include "hal_adc.h"
- #include "hal_rcc.h"
- ////////////////////////////////////////////////////////////////////////////////
- /// @addtogroup MM32_Hardware_Abstract_Layer
- /// @{
- ////////////////////////////////////////////////////////////////////////////////
- /// @addtogroup ADC_HAL
- /// @{
- ////////////////////////////////////////////////////////////////////////////////
- /// @addtogroup ADC_Exported_Functions
- /// @{
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Deinitializes the adc peripheral registers to their default
- /// reset values.
- /// @param adc: select the ADC peripheral.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_DeInit(ADC_TypeDef* adc)
- {
- switch (*(vu32*)&adc) {
- case ADC1_BASE:
- exRCC_APB2PeriphReset(RCC_APB2ENR_ADC1);
- break;
- case ADC2_BASE:
- exRCC_APB2PeriphReset(RCC_APB2ENR_ADC2);
- break;
- case ADC3_BASE:
- exRCC_APB2PeriphReset(RCC_APB2ENR_ADC3);
- break;
- default:
- break;
- }
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Initializes the adc peripheral according to the specified parameters
- /// in the init_struct, Please use this function if you want to be
- /// compatible with older versions of the library.
- /// @param adc: select the ADC peripheral.
- /// @param init_struct: pointer to an ADC_InitTypeDef structure that contains
- /// the configuration information for the specified ADC peripheral.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_Init(ADC_TypeDef* adc, ADC_InitTypeDef* init_struct)
- {
- adc->ADCFG &= ~(ADC_CFGR_PRE | ADC_CFGR_RSLTCTL);
- adc->ADCFG |= (u32)(init_struct->ADC_PRESCARE) | init_struct->ADC_Resolution;
- adc->ADCR &= ~(ADC_CR_ALIGN | ADC_CR_MODE | ADC_CR_TRGSEL);
- adc->ADCR |= ((u32)init_struct->ADC_DataAlign) | init_struct->ADC_ExternalTrigConv | ((u32)init_struct->ADC_Mode);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Fills each init_struct member with its default value.
- /// @param init_struct : pointer to an ADC_InitTypeDef structure which will be
- /// initialized.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_StructInit(ADC_InitTypeDef* init_struct)
- {
- init_struct->ADC_Resolution = ADC_Resolution_12b;
- init_struct->ADC_PRESCARE = ADC_PCLK2_PRESCARE_2;
- init_struct->ADC_Mode = ADC_CR_IMM; //ADC_Mode_Single;
- init_struct->ADC_ContinuousConvMode = DISABLE; // useless
- init_struct->ADC_ExternalTrigConv = ADC1_ExternalTrigConv_T1_CC1;
- init_struct->ADC_DataAlign = ADC_DataAlign_Right;
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Enables or disables the specified ADC peripheral.
- /// @param adc:select the ADC peripheral.
- /// @param state: new state of the adc peripheral.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_Cmd(ADC_TypeDef* adc, FunctionalState state)
- {
- (state) ? (adc->ADCFG |= ADC_CFGR_ADEN) : (adc->ADCFG &= ~ADC_CFGR_ADEN);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Enables or disables the specified ADC DMA request.
- /// @param adc: select the ADC peripheral.
- /// @param state: New state of the selected ADC DMA transfer.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_DMACmd(ADC_TypeDef* adc, FunctionalState state)
- {
- (state) ? (adc->ADCR |= ADC_CR_DMAEN) : (adc->ADCR &= ~ADC_CR_DMAEN);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Enables or disables the specified ADC interrupts.
- /// @param adc: select the ADC peripheral.
- /// @param adc_interrupt: specifies the ADC interrupt sources to be enabled or disabled.
- /// @param state: New state of the specified ADC interrupts.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_ITConfig(ADC_TypeDef* adc, ADCFLAG_TypeDef adc_interrupt, FunctionalState state)
- {
- if (adc_interrupt == ADC_IT_EOC)
- (state) ? (adc->ADCR |= ADC_CR_ADIE) : (adc->ADCR &= ~ADC_CR_ADIE);
- else
- (state) ? (adc->ADCR |= ADC_CR_ADWIE) : (adc->ADCR &= ~ADC_CR_ADWIE);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Enables or disables the selected ADC software start conversion .
- /// @param adc: select the ADC peripheral.
- /// @param state: New state of the selected ADC software start conversion.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_SoftwareStartConvCmd(ADC_TypeDef* adc, FunctionalState state)
- {
- (state) ? (adc->ADCR |= ADC_CR_ADST) : (adc->ADCR &= ~ADC_CR_ADST);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Gets the selected ADC Software start conversion Status.
- /// @param adc: select the ADC peripheral.
- /// @retval The new state of ADC software start conversion (SET or RESET).
- ////////////////////////////////////////////////////////////////////////////////
- FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* adc)
- {
- return (((adc->ADCR & ADC_CR_ADST) != (u32)RESET) ? SET : RESET);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Enable the selected ADC channel and configure its sample time. Please
- /// use this function if you want to be compatible with older versions
- /// of the library.
- /// @param adc: select the ADC peripheral.
- /// @param channel: the ADC channel to configure.
- /// @param sample_time: the ADC Channel n Sample time to configure.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_RegularChannelConfig(ADC_TypeDef* adc, u32 channel, u8 rank, u32 sample_time) //ADCSAM_TypeDef
- {
- u32 tempchan;
- sample_time = sample_time & 0xF;
- tempchan = channel;
- if(tempchan > 8) {
- tempchan = tempchan & 0xF;
- tempchan = tempchan - 8;
- adc->SMPR2 &= ~(0xF << tempchan);
- adc->SMPR2 |= (sample_time << tempchan);
- }
- else {
- adc->SMPR1 &= ~(0xF << tempchan);
- adc->SMPR1 |= (sample_time << tempchan);
- }
- adc->ADCHS &= ~(1 << channel);
- adc->ADCHS |= (1 << channel);
- if (channel & ADC_CHSR_CHT)
- ADC_TempSensorVrefintCmd(ENABLE);
- else if (channel & ADC_CHSR_CHV)
- ADC_TempSensorVrefintCmd(ENABLE);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Enables or disables the adc conversion through external trigger.
- /// @param adc: select the ADC peripheral.
- /// @param state: New state of the selected ADC external trigger.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_ExternalTrigConvCmd(ADC_TypeDef* adc, FunctionalState state)
- {
- (state) ? (adc->ADCR |= ADC_CR_TRGEN) : (adc->ADCR &= ~ADC_CR_TRGEN);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Configures the adc external trigger for injected channels conversion.
- /// @param adc: select the ADC peripheral.
- /// @param adc_external_trig_source: Configuring the external trigger source
- /// for the ADC.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_ExternalTrigConvConfig(ADC_TypeDef* adc, EXTERTRIG_TypeDef adc_external_trig_source)
- {
- adc->ADCR &= ~ADC_CR_TRGSEL;
- adc->ADCR |= adc_external_trig_source;
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Returns the last adc conversion result data for regular channel.
- /// @param adc: select the ADC peripheral.
- /// @retval The data conversion value.
- ////////////////////////////////////////////////////////////////////////////////
- u16 ADC_GetConversionValue(ADC_TypeDef* adc)
- {
- return (u16)adc->ADDATA;
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Returns the last ADC conversion result data in dual mode.
- /// @param None
- /// @retval The Data conversion value.
- ////////////////////////////////////////////////////////////////////////////////
- u32 ADC_GetDualModeConversionValue()
- {
- return (*(vu32*)ADC1_BASE);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Enables or disables the analog watchdog.
- /// @param adc: to select the ADC peripheral.
- /// @param state: New state of the selected ADC analog watchdog.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_AnalogWatchdogCmd(ADC_TypeDef* adc, FunctionalState state)
- {
- (state) ? (adc->ADCFG |= ADC_CFGR_ADWEN) : (adc->ADCFG &= ~ADC_CFGR_ADWEN);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Configures the high and low thresholds of the analog watchdog.
- /// @param adc: select the ADC peripheral.
- /// @param high_threshold: the ADC analog watchdog High threshold value.
- /// This parameter must be a 12bit value.
- /// @param low_threshold: the ADC analog watchdog Low threshold value.
- /// This parameter must be a 12bit value.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* adc, u16 high_threshold, u16 low_threshold)
- {
- u32 tempThreshold;
- tempThreshold = high_threshold;
- adc->ADCMPR = (tempThreshold << 16) | low_threshold;
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Configures the analog watchdog guarded single channel
- /// @param adc: select the ADC peripheral.
- /// @param channel: the ADC channel to configure for the analog watchdog.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* adc, ADCCHANNEL_TypeDef channel)
- {
- adc->ADCR &= ~ADC_CR_CMPCH;
- adc->ADCR |= (channel << ADC_CR_CMPCH_Pos);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Enables or disables the temperature sensor and Vrefint channel.
- /// @param state: New state of the temperature sensor.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_TempSensorVrefintCmd(FunctionalState state)
- {
- (state) ? (ADC1->ADCFG |= (ADC_CFGR_TEN | ADC_CFGR_VEN))
- : (ADC1->ADCFG &= ~(ADC_CFGR_TEN | ADC_CFGR_VEN));
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Enables or disables the temperature sensor .
- /// @param state: New state of the temperature sensor.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_TempSensorCmd(FunctionalState state)
- {
- ADC_TempSensorVrefintCmd(state);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Enables or disables the Vrefint channel.
- /// @param state: New state of the Vrefint channel.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_VrefintCmd(FunctionalState state)
- {
- ADC_TempSensorVrefintCmd(state);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Enables or disables the temperature sensor and Vrefint channel.
- /// @param chs: temperature sensor bit & Vrefint bit.
- /// @param state: New state of the temperature sensor.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void exADC_TempSensorVrefintCmd(u32 chs, FunctionalState state)
- {
- if (chs & ADC_CHSR_CHT) {
- (state) ? (ADC1->ADCFG |= ADC_CFGR_TEN)
- : (ADC1->ADCFG &= ~ADC_CFGR_TEN);
- }
- else if (chs & ADC_CHSR_CHV) {
- (state) ? (ADC1->ADCFG |= ADC_CFGR_VEN)
- : (ADC1->ADCFG &= ~ADC_CFGR_VEN);
- }
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Checks whether the specified ADC flag is set or not.
- /// @param adc: select the ADC peripheral.
- /// @param adc_flag: specifies the flag to check.
- /// @retval The New state of adc_flag (SET or RESET).
- ////////////////////////////////////////////////////////////////////////////////
- FlagStatus ADC_GetFlagStatus(ADC_TypeDef* adc, ADCFLAG_TypeDef adc_flag)
- {
- return (adc_flag == ADC_IT_EOC) ? ((adc->ADSTA & ADC_SR_ADIF) ? SET : RESET) : ((adc->ADSTA & ADC_SR_ADWIF) ? SET : RESET);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Clears the adc's pending flags.
- /// @param adc: select the ADC peripheral.
- /// @param adc_flag: specifies the flag to clear.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_ClearFlag(ADC_TypeDef* adc, ADCFLAG_TypeDef adc_flag)
- {
- (adc_flag == ADC_IT_EOC) ? (adc->ADSTA |= ADC_SR_ADIF) : (adc->ADSTA |= ADC_SR_ADWIF);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Checks whether the specified adc's interrupt has occurred or not.
- /// @param adc: select the ADC peripheral.
- /// @param adc_interrupt: specifies the ADC interrupt source to check.
- /// @retval The new state of adc_interrupt (SET or RESET).
- ////////////////////////////////////////////////////////////////////////////////
- ITStatus ADC_GetITStatus(ADC_TypeDef* adc, ADCFLAG_TypeDef adc_interrupt)
- {
- return (adc_interrupt == ADC_IT_EOC) ? ((adc->ADSTA & ADC_SR_ADIF) ? SET : RESET) : ((adc->ADSTA & ADC_SR_ADWIF) ? SET : RESET);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Clears the adc's interrupt pending bits.
- /// @param adc: select the ADC peripheral.
- /// @param adc_interrupt: specifies the ADC interrupt pending bit to clear.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_ClearITPendingBit(ADC_TypeDef* adc, ADCFLAG_TypeDef adc_interrupt)
- {
- (adc_interrupt == ADC_IT_EOC) ? (adc->ADSTA |= ADC_SR_ADIF) : (adc->ADSTA |= ADC_SR_ADWIF);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Configures the adc any channels conversion rank and channel.
- /// @param adc: select the ADC peripheral.
- /// @param rank: rank can be 0x0~0xf for the convert sequence.
- /// @param adc_channel: Configuring the target channel to be converted.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_ANY_CH_Config(ADC_TypeDef* adc, u8 rank, ADCCHANNEL_TypeDef adc_channel)
- {
- rank = rank & 0xF;
- if(rank < 8) {
- adc->CHANY0 &= ~(0x0F << (4 * rank));
- adc->CHANY0 |= (adc_channel << (4 * rank));
- }
- else {
- adc->CHANY1 &= ~(0x0F << (4 * (rank - 8)));
- adc->CHANY1 |= (adc_channel << (4 * (rank - 8)));
- }
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Configures the adc any channels conversion Max rank number
- /// @param adc: select the ADC peripheral.
- /// @param num: Configuring the max rank number for the ADC.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_ANY_NUM_Config(ADC_TypeDef* adc, u8 num)
- {
- if(num > 15) num = 15; //15 ? 16 need to be confirmed
- adc->ANYCFG = num;
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Enables or disables the ANY channel converter.
- /// @param state: enable or disable the ANY channel converter mode.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_ANY_Cmd(ADC_TypeDef* adc, FunctionalState state)
- {
- (state) ? (adc->ANYCR |= ADC1_CHANY_CR_MDEN) : (adc->ANYCR &= ~ADC1_CHANY_CR_MDEN);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Enables or disables the selected ADC automatic injected group
- /// conversion after regular one.
- /// @param adc: where x can be 1, 2 or 3 to select the ADC peripheral.
- /// @param state: new state of the selected ADC auto injected conversion
- /// This parameter can be: ENABLE or DISABLE.
- /// @retval None
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_AutoInjectedConvCmd(ADC_TypeDef* adc, FunctionalState state)
- {
- (state) ? (adc->ANYCR |= ADC_ANY_CR_JAUTO) : (adc->ANYCR &= ~ADC_ANY_CR_JAUTO);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Configures the adc external trigger for injected channels conversion.
- /// @param adc: where x can be 1, 2 or 3 to select the ADC peripheral.
- /// @param ADC_ExtInjTrigSource: specifies the ADC trigger to start injected conversion.
- /// @retval None
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_ExternalTrigInjectedConvertConfig(ADC_TypeDef* adc, EXTER_INJ_TRIG_TypeDef ADC_ExtInjTrigSource)
- {
- u32 tmpreg = 0;
- // Get the old register value
- tmpreg = adc->ANYCR;
- // Clear the old external event selection for injected group
- tmpreg &= ADC_ANY_CR_JTRGSEL;
- // Set the external event selection for injected group
- tmpreg |= ADC_ExtInjTrigSource;
- // Store the new register value
- adc->ANYCR = tmpreg;
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Enables or disables the adc injected channels conversion through
- /// external trigger
- /// @param adc: where x can be 1, 2 or 3 to select the ADC peripheral.
- /// @param state: new state of the selected ADC external trigger start of
- /// injected conversion.
- /// This parameter can be: ENABLE or DISABLE.
- /// @retval None
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* adc, FunctionalState state)
- {
- (state) ? (adc->ANYCR |= ADC_ANY_CR_JTRGEN) : (adc->ANYCR &= ~ADC_ANY_CR_JTRGEN);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Enables or disables the selected ADC start of the injected
- /// channels conversion.
- /// @param adc: where x can be 1, 2 or 3 to select the ADC peripheral.
- /// @param state: new state of the selected ADC software start injected conversion.
- /// This parameter can be: ENABLE or DISABLE.
- /// @retval None
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_InjectedConvCmd(ADC_TypeDef* adc, FunctionalState state)
- {
- (state) ? (adc->ANYCR |= ADC_ANY_CR_JCEN) : (adc->ANYCR &= ~ADC_ANY_CR_JCEN);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Enables or disables the selected ADC start of the injected
- /// channels conversion.
- /// @param adc: where x can be 1, 2 or 3 to select the ADC peripheral.
- /// @param NewState: new state of the selected ADC software start injected conversion.
- /// This parameter can be: ENABLE or DISABLE.
- /// @retval None
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef* adc, FunctionalState state)
- {
- (state) ? (adc->ANYCR |= ADC_ANY_CR_JADST) : (adc->ANYCR &= ~ADC_ANY_CR_JADST);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Enable the selected ADC channel and configure its sample time. Please
- /// use this function if you want to be compatible with older versions
- /// of the library.
- /// @param adc: select the ADC peripheral.
- /// @param event: the ADC external event to configure.
- /// @param sample_time: the ADC Channel n Sample time to configure.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_InjectedSequencerConfig(ADC_TypeDef* adc, u32 event, u32 sample_time)
- {
- adc->ANYCR &= ~(ADC_ANY_CR_JCEN | ADC_ANY_CR_CHANY_MDEN | ADC_ANY_CR_JTRGSEL_EXTI12 \
- | ADC_ANY_CR_JTRGSHIFT_512 | ADC_ANY_CR_JTRGEN);
- adc->ANYCR |= (ADC_ANY_CR_JCEN | ADC_ANY_CR_CHANY_MDEN | sample_time | event | ADC_ANY_CR_JTRGEN);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Injection channel length configuration.
- /// @param adc: select the ADC peripheral.
- /// @param Length: Injection channel length.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* adc, ADC_INJ_SEQ_LEN_TypeDef Length)
- {
- adc->JSQR &= ~(0x03 << ADC_JSQR_JL_Pos);
- adc->JSQR |= Length << ADC_JSQR_JL_Pos;
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Injection channel configuration.
- /// @param adc : select the ADC peripheral.
- /// @param off_addr : Injection channel offset address.
- /// @param channel: The sampling channel.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_InjectedSequencerChannelConfig(ADC_TypeDef* adc, ADC_INJ_SEQ_Channel_TypeDef off_addr, ADCCHANNEL_TypeDef channel)
- {
- adc->JSQR &= ~(0x1F << (off_addr >> 2) * 5);
- adc->JSQR |= (channel << (off_addr >> 2) * 5);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Injection channel converted value.
- /// @param adc : select the ADC peripheral.
- /// @param off_addr : Injection channel offset address.
- /// @retval value.
- ////////////////////////////////////////////////////////////////////////////////
- u16 ADC_GetInjectedConversionValue(ADC_TypeDef* adc, ADC_INJ_SEQ_Channel_TypeDef off_addr)
- {
- u32 value;
- value = (*(vu32*)(*(vu32*)&adc + 0xB0 + off_addr)) - (*(vu32*)(*(vu32*)&adc + 0x7C + off_addr));
- return (u16)value;
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Injection current converted value.
- /// @param adc : select the ADC peripheral.
- /// @retval value. Returns the last adc conversion result data for injected channel.
- ////////////////////////////////////////////////////////////////////////////////
- u16 ADC_GetInjectedCurrentConvertedValue(ADC_TypeDef* adc)
- {
- return (u16)adc->JDATA;
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Injection channel compensation configuration.
- /// @param adc : select the ADC peripheral.
- /// @param off_addr : Injection channel.
- /// @param value : compensation value.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void ADC_SetInjectedOffset(ADC_TypeDef* adc, ADC_INJ_SEQ_Channel_TypeDef off_addr, u16 value)
- {
- *(vu32*)(*(vu32*)&adc + 0x7C + off_addr) = value;
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Get channel convertion result.
- /// @param adc : select the ADC peripheral.
- /// @param channel : Converted channel.
- /// @retval The Data conversion value.
- ////////////////////////////////////////////////////////////////////////////////
- u16 ADC_GetChannelConvertedValue(ADC_TypeDef* adc, ADCCHANNEL_TypeDef channel)
- {
- return (u16)(*(vu32*) ((u32)adc + 0x18 + ((u32)channel << 2)));
- }
- /// @}
- /// @}
- /// @}
|