mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-22 17:12:55 +08:00
386 lines
9.8 KiB
C
386 lines
9.8 KiB
C
|
/*!
|
||
|
* @file apm32f0xx_crs.c
|
||
|
*
|
||
|
* @brief This file contains all the functions for the CRS peripheral
|
||
|
*
|
||
|
* @note It's only for APM32F072 and APM32F091 devices
|
||
|
*
|
||
|
* @version V1.0.1
|
||
|
*
|
||
|
* @date 2021-07-01
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#include "apm32f0xx_crs.h"
|
||
|
#include "apm32f0xx_rcm.h"
|
||
|
|
||
|
/** @addtogroup Peripherals_Library Standard Peripheral Library
|
||
|
@{
|
||
|
*/
|
||
|
|
||
|
/** @addtogroup CRS_Driver CRS Driver
|
||
|
@{
|
||
|
*/
|
||
|
|
||
|
/** @addtogroup CRS_Fuctions Fuctions
|
||
|
@{
|
||
|
*/
|
||
|
|
||
|
/*!
|
||
|
* @brief Resets the CRS peripheral registers to their default reset values.
|
||
|
*
|
||
|
* @param None
|
||
|
*
|
||
|
* @retval None
|
||
|
*/
|
||
|
void CRS_Reset(void)
|
||
|
{
|
||
|
RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_CRS);
|
||
|
RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_CRS);
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Adjusts the Internal High Speed 48 oscillator (HSI 48) calibration value.
|
||
|
*
|
||
|
* @param calibrationVal: HSI48 oscillator smooth trimming value. It can be 0x0 to 0xF.
|
||
|
*
|
||
|
* @retval None
|
||
|
*/
|
||
|
void CRS_AdjustHSI48CalibrationValue(uint8_t calibrationVal)
|
||
|
{
|
||
|
CRS->CTRL_B.HSI48TRM = calibrationVal;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Enables the oscillator clock for frequency error counter.
|
||
|
*
|
||
|
* @param None
|
||
|
*
|
||
|
* @retval None
|
||
|
*/
|
||
|
void CRS_EnableFrequencyErrorCounter(void)
|
||
|
{
|
||
|
CRS->CTRL_B.CNTEN = SET;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Disables the oscillator clock for frequency error counter.
|
||
|
*
|
||
|
* @param None
|
||
|
*
|
||
|
* @retval None
|
||
|
*/
|
||
|
void CRS_DisableFrequencyErrorCounter(void)
|
||
|
{
|
||
|
CRS->CTRL_B.CNTEN = RESET;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Enables the automatic hardware adjustement of HSI48TRM bits.
|
||
|
*
|
||
|
* @param None
|
||
|
*
|
||
|
* @retval None
|
||
|
*/
|
||
|
void CRS_EnableAutomaticCalibration(void)
|
||
|
{
|
||
|
CRS->CTRL_B.AUTOTRMEN = SET;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Disables the automatic hardware adjustement of HSI48TRM bits.
|
||
|
*
|
||
|
* @param None
|
||
|
*
|
||
|
* @retval None
|
||
|
*/
|
||
|
void CRS_DisableAutomaticCalibration(void)
|
||
|
{
|
||
|
CRS->CTRL_B.AUTOTRMEN = RESET;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Generate the software synchronization event.
|
||
|
*
|
||
|
* @param None
|
||
|
*
|
||
|
* @retval None
|
||
|
*/
|
||
|
void CRS_GenerateSoftwareSynchronization(void)
|
||
|
{
|
||
|
CRS->CTRL_B.SWSGNR = SET;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Adjusts the Internal High Speed 48 oscillator (HSI 48) calibration value.
|
||
|
*
|
||
|
* @param reloadVal: specifies the HSI calibration trimming value.
|
||
|
* This parameter must be a number between 0 and 0xFFFF.
|
||
|
*
|
||
|
* @retval None
|
||
|
*/
|
||
|
void CRS_FrequencyErrorCounterReloadValue(uint16_t reloadVal)
|
||
|
{
|
||
|
CRS->CFG_B.RLDVAL = reloadVal;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Configs the frequency error limit value.
|
||
|
*
|
||
|
* @param errLimitVal: specifies the HSI calibration trimming value.
|
||
|
*
|
||
|
* @retval None
|
||
|
*/
|
||
|
void CRS_ConfigFrequencyErrorLimit(uint8_t errLimitVal)
|
||
|
{
|
||
|
CRS->CFG_B.FELMT = errLimitVal;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Configs SYNC divider.
|
||
|
*
|
||
|
* @param div: defines the SYNC divider.
|
||
|
* This parameter can be one of the following values:
|
||
|
* @arg CRS_SYNC_DIV1
|
||
|
* @arg CRS_SYNC_DIV2
|
||
|
* @arg CRS_SYNC_DIV4
|
||
|
* @arg CRS_SYNC_DIV8
|
||
|
* @arg CRS_SYNC_DIV16
|
||
|
* @arg CRS_SYNC_DIV32
|
||
|
* @arg CRS_SYNC_DIV64
|
||
|
* @arg CRS_SYNC_DIV128
|
||
|
*
|
||
|
* @retval None
|
||
|
*/
|
||
|
void CRS_ConfigSynchronizationPrescaler(CRS_SYNC_DIV_T div)
|
||
|
{
|
||
|
CRS->CFG_B.SYNCPSC = div;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Configs the SYNC signal source.
|
||
|
*
|
||
|
* @param source: specifies the SYNC signal source.
|
||
|
* This parameter can be one of the following values:
|
||
|
* @arg CRS_SYNC_SOURCE_GPIO
|
||
|
* @arg CRS_SYNC_SOURCE_LSE
|
||
|
* @arg CRS_SYNC_SOURCE_USB
|
||
|
*
|
||
|
* @retval None
|
||
|
*/
|
||
|
void CRS_ConfigSynchronizationSource(CRS_SYNC_SOURCE_T source)
|
||
|
{
|
||
|
CRS->CFG_B.SYNCSRCSEL = source;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Configs the SYNC polarity.
|
||
|
*
|
||
|
* @param polarity: specifies SYNC polarity.
|
||
|
* This parameter can be one of the following values:
|
||
|
* @arg CRS_SYNC_POL_RISING
|
||
|
* @arg CRS_SYNC_POL_FALLING
|
||
|
*
|
||
|
* @retval None
|
||
|
*/
|
||
|
void CRS_ConfigSynchronizationPolarity(CRS_SYNC_POL_T polarity)
|
||
|
{
|
||
|
CRS->CFG_B.SYNCPOLSEL = polarity;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Returns the Relaod value.
|
||
|
*
|
||
|
* @param None
|
||
|
*
|
||
|
* @retval The reload value
|
||
|
*/
|
||
|
uint32_t CRS_ReadReloadValue(void)
|
||
|
{
|
||
|
return (uint32_t)CRS->CFG_B.RLDVAL;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Returns the HSI48 Calibration value.
|
||
|
*
|
||
|
* @param None
|
||
|
*
|
||
|
* @retval The reload value
|
||
|
*/
|
||
|
uint32_t CRS_ReadHSI48CalibrationValue(void)
|
||
|
{
|
||
|
return (uint32_t)CRS->CTRL_B.HSI48TRM;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Returns the frequency error capture.
|
||
|
*
|
||
|
* @param None
|
||
|
*
|
||
|
* @retval The frequency error capture value
|
||
|
*/
|
||
|
uint32_t CRS_ReadFrequencyErrorValue(void)
|
||
|
{
|
||
|
return (uint32_t)CRS->INTSTS_B.FECPT;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Returns the frequency error direction.
|
||
|
*
|
||
|
* @param None
|
||
|
*
|
||
|
* @retval The frequency error direction.
|
||
|
* The returned value can be one of the following values:
|
||
|
* 0: Up counting
|
||
|
* 1: Down counting
|
||
|
*/
|
||
|
uint32_t CRS_ReadFrequencyErrorDirection(void)
|
||
|
{
|
||
|
return (uint32_t)CRS->INTSTS_B.CNTDRCT;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Enables the specified CRS interrupts.
|
||
|
*
|
||
|
* @param interrupt: specifies the RCC interrupt sources to be enabled or disabled.
|
||
|
* This parameter can be any combination of the following values:
|
||
|
* @arg CRS_INT_SYNCOK : SYNC event OK interrupt
|
||
|
* @arg CRS_INT_SYNCWARN: SYNC warning interrupt
|
||
|
* @arg CRS_INT_ERR : Synchronization or trimming error interrupt
|
||
|
* @arg CRS_INT_ESYNC : Expected SYNC interrupt
|
||
|
*
|
||
|
* @retval None
|
||
|
*/
|
||
|
void CRS_EnableInterrupt(CRS_INT_T interrupt)
|
||
|
{
|
||
|
CRS->CTRL |= interrupt;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Disables the specified CRS interrupts.
|
||
|
*
|
||
|
* @param interrupt: specifies the RCC interrupt sources to be enabled or disabled.
|
||
|
* This parameter can be any combination of the following values:
|
||
|
* @arg CRS_INT_SYNCOK : SYNC event OK interrupt
|
||
|
* @arg CRS_INT_SYNCWARN: SYNC warning interrupt
|
||
|
* @arg CRS_INT_ERR : Synchronization or trimming error interrupt
|
||
|
* @arg CRS_INT_ESYNC : Expected SYNC interrupt
|
||
|
*
|
||
|
* @retval None
|
||
|
*/
|
||
|
void CRS_DisableInterrupt(CRS_INT_T interrupt)
|
||
|
{
|
||
|
CRS->CTRL &= ~interrupt;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Checks whether the specified CRS flag is set or not.
|
||
|
*
|
||
|
* @param flag: specifies the flag to check.
|
||
|
* This parameter can be one of the following values:
|
||
|
* @arg CRS_FLAG_SYNCOK : SYNC event OK flag
|
||
|
* @arg CRS_FLAG_SYNCWARN: SYNC warning flag
|
||
|
* @arg CRS_FLAG_ERR : Synchronization or trimming error flag
|
||
|
* @arg CRS_FLAG_ESYNC : Expected SYNC flag
|
||
|
* @arg CRS_FLAG_SYNCERR : SYNC error flag
|
||
|
* @arg CRS_FLAG_SYNCMISS: SYNC missed flag
|
||
|
* @arg CRS_FLAG_TRIMOVF : Trimming overflow or underflow falg
|
||
|
*
|
||
|
* @retval The new state of CRS_FLAG (SET or RESET).
|
||
|
*/
|
||
|
uint8_t CRS_ReadStatusFlag(CRS_FLAG_T flag)
|
||
|
{
|
||
|
uint32_t status;
|
||
|
status = (uint32_t)(CRS->INTSTS & flag);
|
||
|
|
||
|
if (status == flag)
|
||
|
{
|
||
|
return SET;
|
||
|
}
|
||
|
|
||
|
return RESET;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Clears the CRS specified flag.
|
||
|
*
|
||
|
* @param flag: specifies the flag to check.
|
||
|
* This parameter can be one of the following values:
|
||
|
* @arg CRS_FLAG_SYNCOK : SYNC event OK flag
|
||
|
* @arg CRS_FLAG_SYNCWARN: SYNC warning flag
|
||
|
* @arg CRS_FLAG_ERR : Synchronization or trimming error flag
|
||
|
* @arg CRS_FLAG_ESYNC : Expected SYNC flag
|
||
|
* @arg CRS_FLAG_SYNCERR : SYNC error flag
|
||
|
* @arg CRS_FLAG_SYNCMISS: SYNC missed flag
|
||
|
* @arg CRS_FLAG_TRIMOVF : Trimming overflow or underflow falg
|
||
|
*
|
||
|
* @retval None
|
||
|
*/
|
||
|
void CRS_ClearStatusFlag(CRS_FLAG_T flag)
|
||
|
{
|
||
|
if ((flag & 0x00000700)!= 0)
|
||
|
{
|
||
|
CRS->INTCLR_B.ECLR = BIT_SET;
|
||
|
}
|
||
|
|
||
|
CRS->INTCLR |= (uint32_t)flag;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Checks CRS interrupt flag.
|
||
|
*
|
||
|
* @param flag: specifies the IT pending bit to check.
|
||
|
* This parameter can be one of the following values:
|
||
|
* @arg CRS_INT_SYNCOK : SYNC event OK interrupt
|
||
|
* @arg CRS_INT_SYNCWARN: SYNC warning interrupt
|
||
|
* @arg CRS_INT_ERR : Synchronization or trimming error interrupt
|
||
|
* @arg CRS_INT_ESYNC : Expected SYNC interrupt
|
||
|
* @arg CRS_INT_SYNCERR : SYNC error
|
||
|
* @arg CRS_INT_SYNCMISS: SYNC missed
|
||
|
* @arg CRS_INT_TRIMOVF : Trimming overflow or underflow
|
||
|
*
|
||
|
* @retval The new state of CRS_IT (SET or RESET).
|
||
|
*/
|
||
|
uint8_t CRS_ReadIntFlag(CRS_INT_T flag)
|
||
|
{
|
||
|
if((CRS->INTSTS & flag))
|
||
|
{
|
||
|
return SET;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return RESET;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Clears the CRS specified interrupt flag.
|
||
|
*
|
||
|
* @param intFlag: specifies the IT pending bi to clear.
|
||
|
* This parameter can be one of the following values:
|
||
|
* @arg CRS_INT_SYNCOK : SYNC event OK interrupt
|
||
|
* @arg CRS_INT_SYNCWARN: SYNC warning interrupt
|
||
|
* @arg CRS_INT_ERR : Synchronization or trimming error interrupt
|
||
|
* @arg CRS_INT_ESYNC : Expected SYNC interrupt
|
||
|
* @arg CRS_INT_SYNCERR : SYNC error
|
||
|
* @arg CRS_INT_SYNCMISS: SYNC missed
|
||
|
* @arg CRS_INT_TRIMOVF : Trimming overflow or underflow
|
||
|
*
|
||
|
* @retval None
|
||
|
*/
|
||
|
void CRS_ClearIntFlag(CRS_INT_T intFlag)
|
||
|
{
|
||
|
if((intFlag & (uint32_t)0x700) != 0)
|
||
|
{
|
||
|
CRS->INTCLR |= CRS_INT_ERR;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
CRS->INTCLR |= intFlag;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**@} end of group CRS_Fuctions*/
|
||
|
/**@} end of group CRS_Driver*/
|
||
|
/**@} end of group Peripherals_Library*/
|