/** * @brief Initialize the COMP peripheral according to the specified * parameters in the COMP_InitTypeDef and initialize the associated handle. * @note If the selected comparator is locked, initialization cannot be performed. * To unlock the configuration, perform a system reset. * @param hcomp COMP handle * @retval HAL status */ HAL_StatusTypeDef HAL_COMP_Init(COMP_HandleTypeDef *hcomp) { HAL_StatusTypeDef status = HAL_OK; /* Check the COMP handle allocation and lock status */ if((hcomp == NULL) || ((hcomp->State & COMP_STATE_BIT_LOCK) != RESET)) { status = HAL_ERROR; } else { /* Check the parameters */ assert_param(IS_COMP_ALL_INSTANCE(hcomp->Instance)); assert_param(IS_COMP_INVERTINGINPUT(hcomp->Init.InvertingInput)); assert_param(IS_COMP_NONINVERTINGINPUT(hcomp->Init.NonInvertingInput)); assert_param(IS_COMP_NONINVERTINGINPUT_INSTANCE(hcomp->Instance, hcomp->Init.NonInvertingInput)); assert_param(IS_COMP_OUTPUT(hcomp->Init.Output)); assert_param(IS_COMP_OUTPUT_INSTANCE(hcomp->Instance, hcomp->Init.Output)); assert_param(IS_COMP_OUTPUTPOL(hcomp->Init.OutputPol)); assert_param(IS_COMP_HYSTERESIS(hcomp->Init.Hysteresis)); assert_param(IS_COMP_MODE(hcomp->Init.Mode)); assert_param(IS_COMP_BLANKINGSRCE(hcomp->Init.BlankingSrce)); assert_param(IS_COMP_BLANKINGSRCE_INSTANCE(hcomp->Instance, hcomp->Init.BlankingSrce)); assert_param(IS_COMP_TRIGGERMODE(hcomp->Init.TriggerMode)); if(hcomp->Init.WindowMode != COMP_WINDOWMODE_DISABLE) { assert_param(IS_COMP_WINDOWMODE_INSTANCE(hcomp->Instance)); assert_param(IS_COMP_WINDOWMODE(hcomp->Init.WindowMode)); } /* Init SYSCFG and the low level hardware to access comparators */ __HAL_RCC_SYSCFG_CLK_ENABLE(); /* Init the low level hardware : SYSCFG to access comparators */ HAL_COMP_MspInit(hcomp); if(hcomp->State == HAL_COMP_STATE_RESET) { /* Allocate lock resource and initialize it */ hcomp->Lock = HAL_UNLOCKED; } /* Set COMP parameters */ /* Set COMPxINSEL bits according to hcomp->Init.InvertingInput value */ /* Set COMPxNONINSEL bits according to hcomp->Init.NonInvertingInput value */ /* Set COMPxBLANKING bits according to hcomp->Init.BlankingSrce value */ /* Set COMPxOUTSEL bits according to hcomp->Init.Output value */ /* Set COMPxPOL bit according to hcomp->Init.OutputPol value */ /* Set COMPxHYST bits according to hcomp->Init.Hysteresis value */ /* Set COMPxMODE bits according to hcomp->Init.Mode value */ COMP_INIT(hcomp); /* Initialize the COMP state*/ hcomp->State = HAL_COMP_STATE_READY; } return status; }
/** * @brief Initialize the COMP according to the specified * parameters in the COMP_InitTypeDef and initialize the associated handle. * @note If the selected comparator is locked, initialization can't be performed. * To unlock the configuration, perform a system reset. * @param hcomp COMP handle * @retval HAL status */ HAL_StatusTypeDef HAL_COMP_Init(COMP_HandleTypeDef *hcomp) { uint32_t tmpcsr = 0; HAL_StatusTypeDef status = HAL_OK; /* Check the COMP handle allocation and lock status */ if((hcomp == NULL) || ((hcomp->State & COMP_STATE_BIT_LOCK) != RESET)) { status = HAL_ERROR; } else { /* Check the parameters */ assert_param(IS_COMP_ALL_INSTANCE(hcomp->Instance)); assert_param(IS_COMP_INVERTINGINPUT(hcomp->Init.InvertingInput)); assert_param(IS_COMP_NONINVERTINGINPUT(hcomp->Init.NonInvertingInput)); assert_param(IS_COMP_OUTPUTPOL(hcomp->Init.OutputPol)); assert_param(IS_COMP_MODE(hcomp->Init.Mode)); assert_param(IS_COMP_HYSTERESIS(hcomp->Init.Hysteresis)); assert_param(IS_COMP_BLANKINGSRCE(hcomp->Init.BlankingSrce)); assert_param(IS_COMP_BLANKINGSRCE_INSTANCE(hcomp->Instance, hcomp->Init.BlankingSrce)); assert_param(IS_COMP_TRIGGERMODE(hcomp->Init.TriggerMode)); if(hcomp->Init.WindowMode != COMP_WINDOWMODE_DISABLE) { assert_param(IS_COMP_WINDOWMODE_INSTANCE(hcomp->Instance)); assert_param(IS_COMP_WINDOWMODE(hcomp->Init.WindowMode)); } /* Init SYSCFG and the low level hardware to access comparators */ __HAL_RCC_SYSCFG_CLK_ENABLE(); /* Init the low level hardware : SYSCFG to access comparators */ HAL_COMP_MspInit(hcomp); if(hcomp->State == HAL_COMP_STATE_RESET) { /* Allocate lock resource and initialize it */ hcomp->Lock = HAL_UNLOCKED; } /* Change COMP peripheral state */ hcomp->State = HAL_COMP_STATE_BUSY; /* Set COMP parameters */ /* Set INMSEL bits according to hcomp->Init.InvertingInput value */ /* Set INPSEL bits according to hcomp->Init.NonInvertingInput value */ /* Set BLANKING bits according to hcomp->Init.BlankingSrce value */ /* Set HYST bits according to hcomp->Init.Hysteresis value */ /* Set POLARITY bit according to hcomp->Init.OutputPol value */ /* Set POWERMODE bits according to hcomp->Init.Mode value */ /* Set WINMODE bit according to hcomp->Init.WindowMode value */ tmpcsr = hcomp->Init.InvertingInput | \ hcomp->Init.NonInvertingInput | \ hcomp->Init.BlankingSrce | \ hcomp->Init.Hysteresis | \ hcomp->Init.OutputPol | \ hcomp->Init.Mode | \ hcomp->Init.WindowMode; /* Check VREFINT use for NonInvertingInput */ if(hcomp->Init.InvertingInput == COMP_INVERTINGINPUT_VREFINT) { /* Enable voltage scaler to output VREFINT */ tmpcsr |= COMP_CSR_SCALEN; } else { if((hcomp->Init.InvertingInput == COMP_INVERTINGINPUT_1_4VREFINT) || (hcomp->Init.InvertingInput == COMP_INVERTINGINPUT_1_2VREFINT) || (hcomp->Init.InvertingInput == COMP_INVERTINGINPUT_3_4VREFINT)) { /* Enable voltage & bandgap scaler to output VREFINT */ tmpcsr |= (COMP_CSR_BRGEN | COMP_CSR_SCALEN); } } MODIFY_REG(hcomp->Instance->CSR, COMP_CSR_UPDATE_PARAMETERS_MASK, tmpcsr); /* Initialize the COMP state*/ hcomp->State = HAL_COMP_STATE_READY; } return status; }
/** * @brief Initializes the COMP according to the specified * parameters in the COMP_InitTypeDef and create the associated handle. * @note If the selected comparator is locked, initialization can't be performed. * To unlock the configuration, perform a system reset. * @note When the LPTIM connection is enabled, the following pins LPTIM_IN1(PB5, PC0) and LPTIM_IN2(PB7, PC2) should not be configured in AF. * @param hcomp: COMP handle * @retval HAL status */ HAL_StatusTypeDef HAL_COMP_Init(COMP_HandleTypeDef *hcomp) { HAL_StatusTypeDef status = HAL_OK; /* Check the COMP handle allocation and lock status */ if((hcomp == NULL) || ((hcomp->State & COMP_STATE_BIT_LOCK) != 0x00)) { status = HAL_ERROR; } else { /* Check the parameter */ assert_param(IS_COMP_ALL_INSTANCE(hcomp->Instance)); assert_param(IS_COMP_INVERTINGINPUT(hcomp->Init.InvertingInput)); assert_param(IS_COMP_NONINVERTINGINPUT(hcomp->Init.NonInvertingInput)); assert_param(IS_COMP_OUTPUTPOL(hcomp->Init.OutputPol)); assert_param(IS_COMP_MODE(hcomp->Init.Mode)); if(hcomp->Init.WindowMode != COMP_WINDOWMODE_DISABLE) { assert_param(IS_COMP_WINDOWMODE_INSTANCE(hcomp->Instance)); assert_param(IS_COMP_WINDOWMODE(hcomp->Init.WindowMode)); } if(hcomp->State == HAL_COMP_STATE_RESET) { /* Allocate lock resource and initialize it */ hcomp->Lock = HAL_UNLOCKED; /* Init SYSCFG and the low level hardware to access comparators */ __HAL_RCC_SYSCFG_CLK_ENABLE(); /* Init the low level hardware : SYSCFG to access comparators */ HAL_COMP_MspInit(hcomp); } /* Change COMP peripheral state */ hcomp->State = HAL_COMP_STATE_BUSY; /* Set COMP parameters */ /* Set COMPxINSEL bits according to hcomp->Init.InvertingInput value */ /* Set COMPxNONINSEL bits according to hcomp->Init.NonInvertingInput value */ /* Set COMPxLPTIMCONNECTION bits according to hcomp->Init.LPTIMConnection value */ /* Set COMPxPOL bit according to hcomp->Init.OutputPol value */ /* Set COMPxMODE bits according to hcomp->Init.Mode value */ /* Set COMP1WM bit according to hcomp->Init.WindowMode value */ /* No LPTIM connexion requested */ if (hcomp->Init.LPTIMConnection == COMP_LPTIMCONNECTION_DISABLED) { MODIFY_REG(hcomp->Instance->CSR, COMP_CSR_UPDATE_PARAMETERS_MASK, \ hcomp->Init.InvertingInput | \ hcomp->Init.NonInvertingInput | \ hcomp->Init.OutputPol | \ hcomp->Init.Mode | \ hcomp->Init.WindowMode); } else { /* LPTIM connexion requested on COMP2*/ if ((hcomp->Instance) == COMP2) { /* Check the MCU_ID in order to allow or not the COMP2 connection to LPTIM-input2 */ if (((HAL_GetDEVID() == C_DEV_ID_L073) && (HAL_GetREVID() == C_REV_ID_A)) || ((HAL_GetDEVID() == C_DEV_ID_L053) && (HAL_GetREVID() == C_REV_ID_A)) || ((HAL_GetDEVID() == C_DEV_ID_L053) && (HAL_GetREVID() == C_REV_ID_Z))) { /* Note : COMP2 can be connected only to input 1 of LPTIM if requested */ assert_param(IS_COMP2_LPTIMCONNECTION_RESTRICTED(hcomp->Init.LPTIMConnection)); MODIFY_REG(hcomp->Instance->CSR, COMP_CSR_UPDATE_PARAMETERS_MASK, \ hcomp->Init.InvertingInput | \ hcomp->Init.NonInvertingInput | \ COMP_CSR_COMP2LPTIM1IN1 | \ hcomp->Init.OutputPol | \ hcomp->Init.Mode | \ hcomp->Init.WindowMode); } else { /* Note : COMP2 can be connected to input 1 or input2 of LPTIM if requested */ assert_param(IS_COMP2_LPTIMCONNECTION(hcomp->Init.LPTIMConnection)); switch (hcomp->Init.LPTIMConnection) { case COMP_LPTIMCONNECTION_IN1_ENABLED : MODIFY_REG(hcomp->Instance->CSR, COMP_CSR_UPDATE_PARAMETERS_MASK, \ hcomp->Init.InvertingInput | \ hcomp->Init.NonInvertingInput | \ COMP_CSR_COMP2LPTIM1IN1 | \ hcomp->Init.OutputPol | \ hcomp->Init.Mode | \ hcomp->Init.WindowMode); break; case COMP_LPTIMCONNECTION_IN2_ENABLED : MODIFY_REG(hcomp->Instance->CSR, COMP_CSR_UPDATE_PARAMETERS_MASK, \ hcomp->Init.InvertingInput | \ hcomp->Init.NonInvertingInput | \ COMP_CSR_COMP2LPTIM1IN2 | \ hcomp->Init.OutputPol | \ hcomp->Init.Mode | \ hcomp->Init.WindowMode); break; default : MODIFY_REG(hcomp->Instance->CSR, COMP_CSR_UPDATE_PARAMETERS_MASK, \ hcomp->Init.InvertingInput | \ hcomp->Init.NonInvertingInput | \ hcomp->Init.OutputPol | \ hcomp->Init.Mode | \ hcomp->Init.WindowMode); break; } } } else /* LPTIM connexion requested on COMP1 */ { /* Note : COMP1 can be connected to the input 1 of LPTIM if requested */ assert_param(IS_COMP1_LPTIMCONNECTION(hcomp->Init.LPTIMConnection)); if (hcomp->Init.LPTIMConnection == COMP_LPTIMCONNECTION_IN1_ENABLED) MODIFY_REG(hcomp->Instance->CSR, COMP_CSR_UPDATE_PARAMETERS_MASK, \ hcomp->Init.InvertingInput | \ hcomp->Init.NonInvertingInput | \ COMP_CSR_COMP1LPTIM1IN1 | \ hcomp->Init.OutputPol | \ hcomp->Init.Mode | \ hcomp->Init.WindowMode); else MODIFY_REG(hcomp->Instance->CSR, COMP_CSR_UPDATE_PARAMETERS_MASK, \ hcomp->Init.InvertingInput | \ hcomp->Init.NonInvertingInput | \ hcomp->Init.OutputPol | \ hcomp->Init.Mode | \ hcomp->Init.WindowMode); } } /* Initialize the COMP state*/ hcomp->State = HAL_COMP_STATE_READY; } return status; }
/** * @brief Initializes the COMP according to the specified * parameters in the COMP_InitTypeDef and create the associated handle. * @note If the selected comparator is locked, initialization can't be performed. * To unlock the configuration, perform a system reset. * @param hcomp: COMP handle * @retval HAL status */ HAL_StatusTypeDef HAL_COMP_Init(COMP_HandleTypeDef *hcomp) { HAL_StatusTypeDef status = HAL_OK; uint32_t regshift = COMP_CSR_COMP1_SHIFT; /* Check the COMP handle allocation and lock status */ if((hcomp == NULL) || ((hcomp->State & COMP_STATE_BIT_LOCK) != RESET)) { status = HAL_ERROR; } else { /* Check the parameter */ assert_param(IS_COMP_ALL_INSTANCE(hcomp->Instance)); assert_param(IS_COMP_INVERTINGINPUT(hcomp->Init.InvertingInput)); assert_param(IS_COMP_NONINVERTINGINPUT(hcomp->Init.NonInvertingInput)); assert_param(IS_COMP_OUTPUT(hcomp->Init.Output)); assert_param(IS_COMP_OUTPUTPOL(hcomp->Init.OutputPol)); assert_param(IS_COMP_HYSTERESIS(hcomp->Init.Hysteresis)); assert_param(IS_COMP_MODE(hcomp->Init.Mode)); if(hcomp->Init.NonInvertingInput == COMP_NONINVERTINGINPUT_DAC1SWITCHCLOSED) { assert_param(IS_COMP_DAC1SWITCH_INSTANCE(hcomp->Instance)); } if(hcomp->Init.WindowMode != COMP_WINDOWMODE_DISABLED) { assert_param(IS_COMP_WINDOWMODE_INSTANCE(hcomp->Instance)); } if(hcomp->State == HAL_COMP_STATE_RESET) { /* Init SYSCFG and the low level hardware to access comparators */ __SYSCFG_CLK_ENABLE(); HAL_COMP_MspInit(hcomp); } /* Set COMP parameters */ /* Set COMPxINSEL bits according to hcomp->Init.InvertingInput value */ /* Set COMPxOUTSEL bits according to hcomp->Init.Output value */ /* Set COMPxPOL bit according to hcomp->Init.OutputPol value */ /* Set COMPxHYST bits according to hcomp->Init.Hysteresis value */ /* Set COMPxMODE bits according to hcomp->Init.Mode value */ if(hcomp->Instance == COMP2) { regshift = COMP_CSR_COMP2_SHIFT; } MODIFY_REG(COMP->CSR, (uint32_t)(COMP_CSR_COMPxINSEL | COMP_CSR_COMPxNONINSEL_MASK | \ COMP_CSR_COMPxOUTSEL | COMP_CSR_COMPxPOL | \ COMP_CSR_COMPxHYST | COMP_CSR_COMPxMODE) << regshift, (hcomp->Init.InvertingInput | \ hcomp->Init.NonInvertingInput | \ hcomp->Init.Output | \ hcomp->Init.OutputPol | \ hcomp->Init.Hysteresis | \ hcomp->Init.Mode) << regshift); if(hcomp->Init.WindowMode != COMP_WINDOWMODE_DISABLED) { COMP->CSR |= COMP_CSR_WNDWEN; } /* Initialize the COMP state*/ if(hcomp->State == HAL_COMP_STATE_RESET) { hcomp->State = HAL_COMP_STATE_READY; } } return status; }