Subversion Repositories DashDisplay

Rev

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