Subversion Repositories DashDisplay

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /**
  2.   ******************************************************************************
  3.   * @file    stm32l1xx_ll_comp.c
  4.   * @author  MCD Application Team
  5.   * @brief   COMP LL module driver
  6.   ******************************************************************************
  7.   * @attention
  8.   *
  9.   * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.
  10.   * All rights reserved.</center></h2>
  11.   *
  12.   * This software component is licensed by ST under BSD 3-Clause license,
  13.   * the "License"; You may not use this file except in compliance with the
  14.   * License. You may obtain a copy of the License at:
  15.   *                        opensource.org/licenses/BSD-3-Clause
  16.   *
  17.   ******************************************************************************
  18.   */
  19. #if defined(USE_FULL_LL_DRIVER)
  20.  
  21. /* Includes ------------------------------------------------------------------*/
  22. #include "stm32l1xx_ll_comp.h"
  23.  
  24. #ifdef  USE_FULL_ASSERT
  25.   #include "stm32_assert.h"
  26. #else
  27.   #define assert_param(expr) ((void)0U)
  28. #endif
  29.  
  30. /** @addtogroup STM32L1xx_LL_Driver
  31.   * @{
  32.   */
  33.  
  34. #if defined (COMP1) || defined (COMP2)
  35.  
  36. /** @addtogroup COMP_LL COMP
  37.   * @{
  38.   */
  39.  
  40. /* Private types -------------------------------------------------------------*/
  41. /* Private variables ---------------------------------------------------------*/
  42. /* Private constants ---------------------------------------------------------*/
  43. /* Private macros ------------------------------------------------------------*/
  44.  
  45. /** @addtogroup COMP_LL_Private_Macros
  46.   * @{
  47.   */
  48.  
  49. /* Check of parameters for configuration of COMP hierarchical scope:          */
  50. /* COMP instance.                                                             */
  51.  
  52. #define IS_LL_COMP_POWER_MODE(__POWER_MODE__)                                  \
  53.   (   ((__POWER_MODE__) == LL_COMP_POWERMODE_MEDIUMSPEED)                      \
  54.    || ((__POWER_MODE__) == LL_COMP_POWERMODE_ULTRALOWPOWER)                    \
  55.   )
  56.  
  57. /* Note: On this STM32 serie, comparator input plus parameters are            */
  58. /*       the different depending on COMP instances.                           */
  59. #if defined(RI_ASCR1_CH_31)
  60. #define IS_LL_COMP_INPUT_PLUS(__COMP_INSTANCE__, __INPUT_PLUS__)               \
  61.   (((__COMP_INSTANCE__) == COMP1)                                              \
  62.     ? (                                                                        \
  63.           ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO5)                         \
  64.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO6)                         \
  65.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO7)                         \
  66.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO8)                         \
  67.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO9)                         \
  68.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO10)                        \
  69.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO11)                        \
  70.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO12)                        \
  71.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO13)                        \
  72.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO14)                        \
  73.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO15)                        \
  74.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO16)                        \
  75.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO17)                        \
  76.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO18)                        \
  77.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO19)                        \
  78.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO20)                        \
  79.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO21)                        \
  80.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO22)                        \
  81.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO23)                        \
  82.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO24)                        \
  83.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO25)                        \
  84.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO26)                        \
  85.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO27)                        \
  86.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO28)                        \
  87.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO29)                        \
  88.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO30)                        \
  89.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO31)                        \
  90.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO32)                        \
  91.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO33)                        \
  92.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_NONE)                        \
  93.       )                                                                        \
  94.       :                                                                        \
  95.       (                                                                        \
  96.           ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO1)                         \
  97.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO2)                         \
  98.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO3)                         \
  99.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO4)                         \
  100.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_NONE)                        \
  101.       )                                                                        \
  102.   )
  103. #else
  104. #define IS_LL_COMP_INPUT_PLUS(__COMP_INSTANCE__, __INPUT_PLUS__)               \
  105.   (((__COMP_INSTANCE__) == COMP1)                                              \
  106.     ? (                                                                        \
  107.           ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO5)                         \
  108.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO6)                         \
  109.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO7)                         \
  110.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO8)                         \
  111.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO9)                         \
  112.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO10)                        \
  113.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO11)                        \
  114.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO12)                        \
  115.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO13)                        \
  116.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO14)                        \
  117.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO15)                        \
  118.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO16)                        \
  119.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO17)                        \
  120.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO18)                        \
  121.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO19)                        \
  122.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO20)                        \
  123.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO21)                        \
  124.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO22)                        \
  125.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO23)                        \
  126.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO24)                        \
  127.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO25)                        \
  128.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO26)                        \
  129.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO27)                        \
  130.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO28)                        \
  131.       )                                                                        \
  132.       :                                                                        \
  133.       (                                                                        \
  134.           ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO1)                         \
  135.        || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO2)                         \
  136.       )                                                                        \
  137.   )
  138. #endif
  139.  
  140. /* Note: On this STM32 serie, comparator input minus parameters are           */
  141. /*       the different depending on COMP instances.                           */
  142. #define IS_LL_COMP_INPUT_MINUS(__COMP_INSTANCE__, __INPUT_MINUS__)             \
  143.   (((__COMP_INSTANCE__) == COMP1)                                              \
  144.     ? (                                                                        \
  145.           ((__INPUT_MINUS__) == LL_COMP_INPUT_MINUS_VREFINT)                   \
  146.       )                                                                        \
  147.       :                                                                        \
  148.       (                                                                        \
  149.           ((__INPUT_MINUS__) == LL_COMP_INPUT_MINUS_1_4VREFINT)                \
  150.        || ((__INPUT_MINUS__) == LL_COMP_INPUT_MINUS_1_2VREFINT)                \
  151.        || ((__INPUT_MINUS__) == LL_COMP_INPUT_MINUS_3_4VREFINT)                \
  152.        || ((__INPUT_MINUS__) == LL_COMP_INPUT_MINUS_VREFINT)                   \
  153.        || ((__INPUT_MINUS__) == LL_COMP_INPUT_MINUS_DAC1_CH1)                  \
  154.        || ((__INPUT_MINUS__) == LL_COMP_INPUT_MINUS_DAC1_CH2)                  \
  155.        || ((__INPUT_MINUS__) == LL_COMP_INPUT_MINUS_IO1)                       \
  156.       )                                                                        \
  157.   )
  158.  
  159. #define IS_LL_COMP_OUTPUT_SELECTION(__OUTPUT_SELECTION__)                      \
  160.   (   ((__OUTPUT_SELECTION__) == LL_COMP_OUTPUT_NONE)                          \
  161.    || ((__OUTPUT_SELECTION__) == LL_COMP_OUTPUT_TIM2_IC4)                      \
  162.    || ((__OUTPUT_SELECTION__) == LL_COMP_OUTPUT_TIM2_OCREFCLR)                 \
  163.    || ((__OUTPUT_SELECTION__) == LL_COMP_OUTPUT_TIM3_IC4)                      \
  164.    || ((__OUTPUT_SELECTION__) == LL_COMP_OUTPUT_TIM3_OCREFCLR)                 \
  165.    || ((__OUTPUT_SELECTION__) == LL_COMP_OUTPUT_TIM4_IC4)                      \
  166.    || ((__OUTPUT_SELECTION__) == LL_COMP_OUTPUT_TIM4_OCREFCLR)                 \
  167.    || ((__OUTPUT_SELECTION__) == LL_COMP_OUTPUT_TIM10_IC1)                     \
  168.   )
  169.  
  170. /**
  171.   * @}
  172.   */
  173.  
  174.  
  175. /* Private function prototypes -----------------------------------------------*/
  176.  
  177. /* Exported functions --------------------------------------------------------*/
  178. /** @addtogroup COMP_LL_Exported_Functions
  179.   * @{
  180.   */
  181.  
  182. /** @addtogroup COMP_LL_EF_Init
  183.   * @{
  184.   */
  185.  
  186. /**
  187.   * @brief  De-initialize registers of the selected COMP instance
  188.   *         to their default reset values.
  189.   * @note   If comparator is locked, de-initialization by software is
  190.   *         not possible.
  191.   *         The only way to unlock the comparator is a device hardware reset.
  192.   * @param  COMPx COMP instance
  193.   * @retval An ErrorStatus enumeration value:
  194.   *          - SUCCESS: COMP registers are de-initialized
  195.   *          - ERROR: COMP registers are not de-initialized
  196.   */
  197. ErrorStatus LL_COMP_DeInit(COMP_TypeDef *COMPx)
  198. {
  199.   ErrorStatus status = SUCCESS;
  200.  
  201.   /* Check the parameters */
  202.   assert_param(IS_COMP_ALL_INSTANCE(COMPx));
  203.  
  204.     /* Note: On this STM32 serie, only COMP instance COMP2 has                */
  205.     /*       features settables: power mode, input minus selection            */
  206.     /*       and output selection.                                            */
  207.     /* Note: On this STM32 serie, setting COMP instance COMP2 input minus     */
  208.     /*       is enabling the comparator.                                      */
  209.     /*       Reset COMP2 input minus also disable the comparator.             */
  210.     /* Note: In case of de-initialization of COMP instance COMP1:             */
  211.     /*       Switch COMP_CSR_SW1 is not modified because can be used          */
  212.     /*       to connect OPAMP3 to ADC.                                        */
  213.     /*       Switches RI_ASCR1_VCOMP, RI_ASCR1_SCM are reset: let routing     */
  214.     /*       interface under control of ADC.                                  */
  215.     if(COMPx == COMP1)
  216.     {
  217.       CLEAR_BIT(COMP->CSR,
  218.                 (  COMP_CSR_CMP1EN
  219.                  | COMP_CSR_10KPU
  220.                  | COMP_CSR_400KPU
  221.                  | COMP_CSR_10KPD
  222.                  | COMP_CSR_400KPD
  223.                 )
  224.                );
  225.     }
  226.     else
  227.     {
  228.       CLEAR_BIT(COMP->CSR,
  229.                 (  COMP_CSR_SPEED
  230.                  | COMP_CSR_INSEL
  231.                  | COMP_CSR_OUTSEL
  232.                 )
  233.                );
  234.     }
  235.    
  236.     /* Set comparator input plus */
  237.     LL_COMP_SetInputPlus(COMPx, LL_COMP_INPUT_PLUS_NONE);
  238.    
  239.   return status;
  240. }
  241.  
  242. /**
  243.   * @brief  Initialize some features of COMP instance.
  244.   * @note   This function configures features of the selected COMP instance.
  245.   *         Some features are also available at scope COMP common instance
  246.   *         (common to several COMP instances).
  247.   *         Refer to functions having argument "COMPxy_COMMON" as parameter.
  248.   * @param  COMPx COMP instance
  249.   * @param  COMP_InitStruct Pointer to a @ref LL_COMP_InitTypeDef structure
  250.   * @retval An ErrorStatus enumeration value:
  251.   *          - SUCCESS: COMP registers are initialized
  252.   *          - ERROR: COMP registers are not initialized
  253.   */
  254. ErrorStatus LL_COMP_Init(COMP_TypeDef *COMPx, LL_COMP_InitTypeDef *COMP_InitStruct)
  255. {
  256.   ErrorStatus status = SUCCESS;
  257.  
  258.   /* Check the parameters */
  259.   assert_param(IS_COMP_ALL_INSTANCE(COMPx));
  260.   if(COMPx == COMP2)
  261.   {
  262.     assert_param(IS_LL_COMP_POWER_MODE(COMP_InitStruct->PowerMode));
  263.     assert_param(IS_LL_COMP_INPUT_MINUS(COMPx, COMP_InitStruct->InputMinus));
  264.     assert_param(IS_LL_COMP_OUTPUT_SELECTION(COMP_InitStruct->OutputSelection));
  265.   }
  266.   assert_param(IS_LL_COMP_INPUT_PLUS(COMPx, COMP_InitStruct->InputPlus));
  267.  
  268.   /* Configuration of comparator instance :                                 */
  269.   /*  - PowerMode                                                           */
  270.   /*  - InputPlus                                                           */
  271.   /*  - InputMinus                                                          */
  272.   /*  - OutputSelection                                                     */
  273.   /* Note: On this STM32 serie, only COMP instance COMP2 has                */
  274.   /*       features settables: power mode, input minus selection            */
  275.   /*       and output selection.                                            */
  276.   /* Note: On this STM32 serie, setting COMP instance COMP2 input minus     */
  277.   /*       is enabling the comparator.                                      */
  278.   if(COMPx == COMP2)
  279.   {
  280.     MODIFY_REG(COMP->CSR,
  281.                  COMP_CSR_SPEED
  282.                | COMP_CSR_INSEL
  283.                | COMP_CSR_OUTSEL
  284.               ,
  285.                  COMP_InitStruct->PowerMode
  286.                | COMP_InitStruct->InputMinus
  287.                | COMP_InitStruct->OutputSelection
  288.               );
  289.    
  290.     /* Set comparator input plus */
  291.     LL_COMP_SetInputPlus(COMPx, COMP_InitStruct->InputPlus);
  292.   }
  293.   else /* COMPx == COMP1 */
  294.   {
  295.     /* If window mode is enabled, COMP1 input plus is not used and therefore
  296.        not modified */
  297.     if(READ_BIT(COMP12_COMMON->CSR, COMP_CSR_WNDWE) == COMP_CSR_WNDWE)
  298.     {
  299.       /* Set comparator input plus */
  300.       LL_COMP_SetInputPlus(COMPx, COMP_InitStruct->InputPlus);
  301.     }
  302.   }
  303.    
  304.   return status;
  305. }
  306.  
  307. /**
  308.   * @brief Set each @ref LL_COMP_InitTypeDef field to default value.
  309.   * @param COMP_InitStruct: pointer to a @ref LL_COMP_InitTypeDef structure
  310.   *                         whose fields will be set to default values.
  311.   * @retval None
  312.   */
  313. void LL_COMP_StructInit(LL_COMP_InitTypeDef *COMP_InitStruct)
  314. {
  315.   /* Set COMP_InitStruct fields to default values */
  316.   COMP_InitStruct->PowerMode            = LL_COMP_POWERMODE_ULTRALOWPOWER;
  317.   COMP_InitStruct->InputPlus            = LL_COMP_INPUT_PLUS_IO1;
  318.   COMP_InitStruct->InputMinus           = LL_COMP_INPUT_MINUS_VREFINT;
  319.   COMP_InitStruct->OutputSelection      = LL_COMP_OUTPUT_NONE;
  320. }
  321.  
  322. /**
  323.   * @}
  324.   */
  325.  
  326. /**
  327.   * @}
  328.   */
  329.  
  330. /**
  331.   * @}
  332.   */
  333.  
  334. #endif /* COMP1 || COMP2 */
  335.  
  336. /**
  337.   * @}
  338.   */
  339.  
  340. #endif /* USE_FULL_LL_DRIVER */
  341.  
  342. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
  343.