xref: /btstack/port/stm32-f4discovery-usb/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_exti.c (revision a8f7f3fcbcd51f8d2e92aca076b6a9f812db358c)
1 /**
2   ******************************************************************************
3   * @file    stm32f4xx_ll_exti.c
4   * @author  MCD Application Team
5   * @brief   EXTI LL module driver.
6   ******************************************************************************
7   * @attention
8   *
9   * <h2><center>&copy; Copyright (c) 2016 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 "stm32f4xx_ll_exti.h"
23 #ifdef  USE_FULL_ASSERT
24 #include "stm32_assert.h"
25 #else
26 #define assert_param(expr) ((void)0U)
27 #endif
28 
29 /** @addtogroup STM32F4xx_LL_Driver
30   * @{
31   */
32 
33 #if defined (EXTI)
34 
35 /** @defgroup EXTI_LL EXTI
36   * @{
37   */
38 
39 /* Private types -------------------------------------------------------------*/
40 /* Private variables ---------------------------------------------------------*/
41 /* Private constants ---------------------------------------------------------*/
42 /* Private macros ------------------------------------------------------------*/
43 /** @addtogroup EXTI_LL_Private_Macros
44   * @{
45   */
46 
47 #define IS_LL_EXTI_LINE_0_31(__VALUE__)              (((__VALUE__) & ~LL_EXTI_LINE_ALL_0_31) == 0x00000000U)
48 
49 #define IS_LL_EXTI_MODE(__VALUE__)                   (((__VALUE__) == LL_EXTI_MODE_IT)            \
50                                                    || ((__VALUE__) == LL_EXTI_MODE_EVENT)         \
51                                                    || ((__VALUE__) == LL_EXTI_MODE_IT_EVENT))
52 
53 
54 #define IS_LL_EXTI_TRIGGER(__VALUE__)                (((__VALUE__) == LL_EXTI_TRIGGER_NONE)       \
55                                                    || ((__VALUE__) == LL_EXTI_TRIGGER_RISING)     \
56                                                    || ((__VALUE__) == LL_EXTI_TRIGGER_FALLING)    \
57                                                    || ((__VALUE__) == LL_EXTI_TRIGGER_RISING_FALLING))
58 
59 /**
60   * @}
61   */
62 
63 /* Private function prototypes -----------------------------------------------*/
64 
65 /* Exported functions --------------------------------------------------------*/
66 /** @addtogroup EXTI_LL_Exported_Functions
67   * @{
68   */
69 
70 /** @addtogroup EXTI_LL_EF_Init
71   * @{
72   */
73 
74 /**
75   * @brief  De-initialize the EXTI registers to their default reset values.
76   * @retval An ErrorStatus enumeration value:
77   *          - SUCCESS: EXTI registers are de-initialized
78   *          - ERROR: not applicable
79   */
LL_EXTI_DeInit(void)80 uint32_t LL_EXTI_DeInit(void)
81 {
82   /* Interrupt mask register set to default reset values */
83   LL_EXTI_WriteReg(IMR,   0x00000000U);
84   /* Event mask register set to default reset values */
85   LL_EXTI_WriteReg(EMR,   0x00000000U);
86   /* Rising Trigger selection register set to default reset values */
87   LL_EXTI_WriteReg(RTSR,  0x00000000U);
88   /* Falling Trigger selection register set to default reset values */
89   LL_EXTI_WriteReg(FTSR,  0x00000000U);
90   /* Software interrupt event register set to default reset values */
91   LL_EXTI_WriteReg(SWIER, 0x00000000U);
92   /* Pending register set to default reset values */
93   LL_EXTI_WriteReg(PR,    0x00FFFFFFU);
94 
95   return SUCCESS;
96 }
97 
98 /**
99   * @brief  Initialize the EXTI registers according to the specified parameters in EXTI_InitStruct.
100   * @param  EXTI_InitStruct pointer to a @ref LL_EXTI_InitTypeDef structure.
101   * @retval An ErrorStatus enumeration value:
102   *          - SUCCESS: EXTI registers are initialized
103   *          - ERROR: not applicable
104   */
LL_EXTI_Init(LL_EXTI_InitTypeDef * EXTI_InitStruct)105 uint32_t LL_EXTI_Init(LL_EXTI_InitTypeDef *EXTI_InitStruct)
106 {
107   ErrorStatus status = SUCCESS;
108   /* Check the parameters */
109   assert_param(IS_LL_EXTI_LINE_0_31(EXTI_InitStruct->Line_0_31));
110   assert_param(IS_FUNCTIONAL_STATE(EXTI_InitStruct->LineCommand));
111   assert_param(IS_LL_EXTI_MODE(EXTI_InitStruct->Mode));
112 
113   /* ENABLE LineCommand */
114   if (EXTI_InitStruct->LineCommand != DISABLE)
115   {
116     assert_param(IS_LL_EXTI_TRIGGER(EXTI_InitStruct->Trigger));
117 
118     /* Configure EXTI Lines in range from 0 to 31 */
119     if (EXTI_InitStruct->Line_0_31 != LL_EXTI_LINE_NONE)
120     {
121       switch (EXTI_InitStruct->Mode)
122       {
123         case LL_EXTI_MODE_IT:
124           /* First Disable Event on provided Lines */
125           LL_EXTI_DisableEvent_0_31(EXTI_InitStruct->Line_0_31);
126           /* Then Enable IT on provided Lines */
127           LL_EXTI_EnableIT_0_31(EXTI_InitStruct->Line_0_31);
128           break;
129         case LL_EXTI_MODE_EVENT:
130           /* First Disable IT on provided Lines */
131           LL_EXTI_DisableIT_0_31(EXTI_InitStruct->Line_0_31);
132           /* Then Enable Event on provided Lines */
133           LL_EXTI_EnableEvent_0_31(EXTI_InitStruct->Line_0_31);
134           break;
135         case LL_EXTI_MODE_IT_EVENT:
136           /* Directly Enable IT & Event on provided Lines */
137           LL_EXTI_EnableIT_0_31(EXTI_InitStruct->Line_0_31);
138           LL_EXTI_EnableEvent_0_31(EXTI_InitStruct->Line_0_31);
139           break;
140         default:
141           status = ERROR;
142           break;
143       }
144       if (EXTI_InitStruct->Trigger != LL_EXTI_TRIGGER_NONE)
145       {
146         switch (EXTI_InitStruct->Trigger)
147         {
148           case LL_EXTI_TRIGGER_RISING:
149             /* First Disable Falling Trigger on provided Lines */
150             LL_EXTI_DisableFallingTrig_0_31(EXTI_InitStruct->Line_0_31);
151             /* Then Enable Rising Trigger on provided Lines */
152             LL_EXTI_EnableRisingTrig_0_31(EXTI_InitStruct->Line_0_31);
153             break;
154           case LL_EXTI_TRIGGER_FALLING:
155             /* First Disable Rising Trigger on provided Lines */
156             LL_EXTI_DisableRisingTrig_0_31(EXTI_InitStruct->Line_0_31);
157             /* Then Enable Falling Trigger on provided Lines */
158             LL_EXTI_EnableFallingTrig_0_31(EXTI_InitStruct->Line_0_31);
159             break;
160           case LL_EXTI_TRIGGER_RISING_FALLING:
161             LL_EXTI_EnableRisingTrig_0_31(EXTI_InitStruct->Line_0_31);
162             LL_EXTI_EnableFallingTrig_0_31(EXTI_InitStruct->Line_0_31);
163             break;
164           default:
165             status = ERROR;
166             break;
167         }
168       }
169     }
170   }
171   /* DISABLE LineCommand */
172   else
173   {
174     /* De-configure EXTI Lines in range from 0 to 31 */
175     LL_EXTI_DisableIT_0_31(EXTI_InitStruct->Line_0_31);
176     LL_EXTI_DisableEvent_0_31(EXTI_InitStruct->Line_0_31);
177   }
178   return status;
179 }
180 
181 /**
182   * @brief  Set each @ref LL_EXTI_InitTypeDef field to default value.
183   * @param  EXTI_InitStruct Pointer to a @ref LL_EXTI_InitTypeDef structure.
184   * @retval None
185   */
LL_EXTI_StructInit(LL_EXTI_InitTypeDef * EXTI_InitStruct)186 void LL_EXTI_StructInit(LL_EXTI_InitTypeDef *EXTI_InitStruct)
187 {
188   EXTI_InitStruct->Line_0_31      = LL_EXTI_LINE_NONE;
189   EXTI_InitStruct->LineCommand    = DISABLE;
190   EXTI_InitStruct->Mode           = LL_EXTI_MODE_IT;
191   EXTI_InitStruct->Trigger        = LL_EXTI_TRIGGER_FALLING;
192 }
193 
194 /**
195   * @}
196   */
197 
198 /**
199   * @}
200   */
201 
202 /**
203   * @}
204   */
205 
206 #endif /* defined (EXTI) */
207 
208 /**
209   * @}
210   */
211 
212 #endif /* USE_FULL_LL_DRIVER */
213 
214 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
215