1 /**
2 ******************************************************************************
3 * @file stm32n6xx_ll_exti.c
4 * @author GPM Application Team
5 * @brief EXTI LL module driver.
6 ******************************************************************************
7 * @attention
8 *
9 * Copyright (c) 2023 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 "stm32n6xx_ll_exti.h"
22 #ifdef USE_FULL_ASSERT
23 #include "stm32_assert.h"
24 #else
25 #define assert_param(expr) ((void)0U)
26 #endif /* USE_FULL_ASSERT */
27
28 /** @addtogroup STM32N6xx_LL_Driver
29 * @{
30 */
31
32 #if defined (EXTI)
33
34 /** @defgroup EXTI_LL EXTI
35 * @{
36 */
37
38 /* Private types -------------------------------------------------------------*/
39 /* Private variables ---------------------------------------------------------*/
40 /* Private constants ---------------------------------------------------------*/
41 /* Private macros ------------------------------------------------------------*/
42 /** @addtogroup EXTI_LL_Private_Macros
43 * @{
44 */
45
46 #define IS_LL_EXTI_LINE_0_31(__VALUE__) (((__VALUE__) & ~LL_EXTI_LINE_ALL_0_31) == 0x00000000U)
47
48 #define IS_LL_EXTI_LINE_32_63(__VALUE__) (((__VALUE__) & ~LL_EXTI_LINE_ALL_32_63) == 0x00000000U)
49
50 #define IS_LL_EXTI_LINE_64_95(__VALUE__) (((__VALUE__) & ~LL_EXTI_LINE_ALL_64_95) == 0x00000000U)
51
52 #define IS_LL_EXTI_MODE(__VALUE__) (((__VALUE__) == LL_EXTI_MODE_IT) \
53 || ((__VALUE__) == LL_EXTI_MODE_EVENT) \
54 || ((__VALUE__) == LL_EXTI_MODE_IT_EVENT))
55
56
57 #define IS_LL_EXTI_TRIGGER(__VALUE__) (((__VALUE__) == LL_EXTI_TRIGGER_NONE) \
58 || ((__VALUE__) == LL_EXTI_TRIGGER_RISING) \
59 || ((__VALUE__) == LL_EXTI_TRIGGER_FALLING) \
60 || ((__VALUE__) == LL_EXTI_TRIGGER_RISING_FALLING))
61
62 /**
63 * @}
64 */
65
66 /* Private function prototypes -----------------------------------------------*/
67
68 /* Exported functions --------------------------------------------------------*/
69 /** @addtogroup EXTI_LL_Exported_Functions
70 * @{
71 */
72
73 /** @addtogroup EXTI_LL_EF_Init
74 * @{
75 */
76
77 /**
78 * @brief De-initialize the EXTI registers to their default reset values.
79 * @retval An ErrorStatus enumeration value:
80 * - 0x00: EXTI registers are de-initialized
81 */
LL_EXTI_DeInit(void)82 uint32_t LL_EXTI_DeInit(void)
83 {
84 /* Interrupt mask register set to default reset values */
85 LL_EXTI_WriteReg(IMR1, 0x00000000U);
86 /* Event mask register set to default reset values */
87 LL_EXTI_WriteReg(EMR1, 0x00000000U);
88 /* Rising Trigger selection register set to default reset values */
89 LL_EXTI_WriteReg(RTSR1, 0x00000000U);
90 /* Falling Trigger selection register set to default reset values */
91 LL_EXTI_WriteReg(FTSR1, 0x00000000U);
92 /* Software interrupt event register set to default reset values */
93 LL_EXTI_WriteReg(SWIER1, 0x00000000U);
94 /* Pending register set to default reset values */
95 LL_EXTI_WriteReg(RPR1, 0xFFFFFFFFU);
96 LL_EXTI_WriteReg(FPR1, 0xFFFFFFFFU);
97 /* Privilege register set to default reset values */
98 LL_EXTI_WriteReg(PRIVCFGR1, 0x00000000U);
99 #if defined CPU_IN_SECURE_STATE
100 /* Secure register set to default reset values */
101 LL_EXTI_WriteReg(SECCFGR1, 0x00000000U);
102 #endif /* CPU_IN_SECURE_STATE */
103
104 /* Interrupt mask register set to default reset values */
105 LL_EXTI_WriteReg(IMR2, 0x00000000U);
106 /* Event mask register set to default reset values */
107 LL_EXTI_WriteReg(EMR2, 0x00000000U);
108 /* Rising Trigger selection register set to default reset values */
109 LL_EXTI_WriteReg(RTSR2, 0x00000000U);
110 /* Falling Trigger selection register set to default reset values */
111 LL_EXTI_WriteReg(FTSR2, 0x00000000U);
112 /* Software interrupt event register set to default reset values */
113 LL_EXTI_WriteReg(SWIER2, 0x00000000U);
114 /* Pending register set to default reset values */
115 LL_EXTI_WriteReg(RPR2, 0xFFFFFFFFU);
116 LL_EXTI_WriteReg(FPR2, 0xFFFFFFFFU);
117 /* Privilege register set to default reset values */
118 LL_EXTI_WriteReg(PRIVCFGR2, 0x00000000U);
119 #if defined CPU_IN_SECURE_STATE
120 /* Secure register set to default reset values */
121 LL_EXTI_WriteReg(SECCFGR2, 0x00000000U);
122 #endif /* CPU_IN_SECURE_STATE */
123
124 /* Interrupt mask register set to default reset values */
125 LL_EXTI_WriteReg(IMR3, 0x00000000U);
126 /* Event mask register set to default reset values */
127 LL_EXTI_WriteReg(EMR3, 0x00000000U);
128 /* Rising Trigger selection register set to default reset values */
129 LL_EXTI_WriteReg(RTSR3, 0x00000000U);
130 /* Falling Trigger selection register set to default reset values */
131 LL_EXTI_WriteReg(FTSR3, 0x00000000U);
132 /* Software interrupt event register set to default reset values */
133 LL_EXTI_WriteReg(SWIER3, 0x00000000U);
134 /* Pending register set to default reset values */
135 LL_EXTI_WriteReg(RPR3, 0xFFFFFFFFU);
136 LL_EXTI_WriteReg(FPR3, 0xFFFFFFFFU);
137 /* Privilege register set to default reset values */
138 LL_EXTI_WriteReg(PRIVCFGR3, 0x00000000U);
139 #if defined CPU_IN_SECURE_STATE
140 /* Secure register set to default reset values */
141 LL_EXTI_WriteReg(SECCFGR3, 0x00000000U);
142 #endif /* CPU_IN_SECURE_STATE */
143
144 return 0x00u;
145 }
146
147 /**
148 * @brief Initialize the EXTI registers according to the specified parameters in EXTI_InitStruct.
149 * @param EXTI_InitStruct pointer to a @ref LL_EXTI_InitTypeDef structure.
150 * @retval An ErrorStatus enumeration value:
151 * - 0x00: EXTI registers are initialized
152 * - any other value : wrong configuration
153 */
LL_EXTI_Init(LL_EXTI_InitTypeDef * EXTI_InitStruct)154 uint32_t LL_EXTI_Init(LL_EXTI_InitTypeDef *EXTI_InitStruct)
155 {
156 uint32_t status = 0x00u;
157
158 /* Check the parameters */
159 assert_param(IS_LL_EXTI_LINE_0_31(EXTI_InitStruct->Line_0_31));
160 assert_param(IS_LL_EXTI_LINE_32_63(EXTI_InitStruct->Line_32_63));
161 assert_param(IS_LL_EXTI_LINE_64_95(EXTI_InitStruct->Line_64_95));
162 assert_param(IS_FUNCTIONAL_STATE(EXTI_InitStruct->LineCommand));
163 assert_param(IS_LL_EXTI_MODE(EXTI_InitStruct->Mode));
164
165 /* ENABLE LineCommand */
166 if (EXTI_InitStruct->LineCommand != DISABLE)
167 {
168 assert_param(IS_LL_EXTI_TRIGGER(EXTI_InitStruct->Trigger));
169
170 /* Configure EXTI Lines in range from 0 to 31 */
171 if (EXTI_InitStruct->Line_0_31 != LL_EXTI_LINE_NONE)
172 {
173 switch (EXTI_InitStruct->Mode)
174 {
175 case LL_EXTI_MODE_IT:
176 /* First Disable Event on provided Lines */
177 LL_EXTI_DisableEvent_0_31(EXTI_InitStruct->Line_0_31);
178 /* Then Enable IT on provided Lines */
179 LL_EXTI_EnableIT_0_31(EXTI_InitStruct->Line_0_31);
180 break;
181 case LL_EXTI_MODE_EVENT:
182 /* First Disable IT on provided Lines */
183 LL_EXTI_DisableIT_0_31(EXTI_InitStruct->Line_0_31);
184 /* Then Enable Event on provided Lines */
185 LL_EXTI_EnableEvent_0_31(EXTI_InitStruct->Line_0_31);
186 break;
187 case LL_EXTI_MODE_IT_EVENT:
188 /* Directly Enable IT & Event on provided Lines */
189 LL_EXTI_EnableIT_0_31(EXTI_InitStruct->Line_0_31);
190 LL_EXTI_EnableEvent_0_31(EXTI_InitStruct->Line_0_31);
191 break;
192 default:
193 status = 0x01u;
194 break;
195 }
196 if (EXTI_InitStruct->Trigger != LL_EXTI_TRIGGER_NONE)
197 {
198 switch (EXTI_InitStruct->Trigger)
199 {
200 case LL_EXTI_TRIGGER_RISING:
201 /* First Disable Falling Trigger on provided Lines */
202 LL_EXTI_DisableFallingTrig_0_31(EXTI_InitStruct->Line_0_31);
203 /* Then Enable Rising Trigger on provided Lines */
204 LL_EXTI_EnableRisingTrig_0_31(EXTI_InitStruct->Line_0_31);
205 break;
206 case LL_EXTI_TRIGGER_FALLING:
207 /* First Disable Rising Trigger on provided Lines */
208 LL_EXTI_DisableRisingTrig_0_31(EXTI_InitStruct->Line_0_31);
209 /* Then Enable Falling Trigger on provided Lines */
210 LL_EXTI_EnableFallingTrig_0_31(EXTI_InitStruct->Line_0_31);
211 break;
212 case LL_EXTI_TRIGGER_RISING_FALLING:
213 LL_EXTI_EnableRisingTrig_0_31(EXTI_InitStruct->Line_0_31);
214 LL_EXTI_EnableFallingTrig_0_31(EXTI_InitStruct->Line_0_31);
215 break;
216 default:
217 status |= 0x02u;
218 break;
219 }
220 }
221 }
222 /* Configure EXTI Lines in range from 32 to 63 */
223 if (EXTI_InitStruct->Line_32_63 != LL_EXTI_LINE_NONE)
224 {
225 switch (EXTI_InitStruct->Mode)
226 {
227 case LL_EXTI_MODE_IT:
228 /* First Disable Event on provided Lines */
229 LL_EXTI_DisableEvent_32_63(EXTI_InitStruct->Line_32_63);
230 /* Then Enable IT on provided Lines */
231 LL_EXTI_EnableIT_32_63(EXTI_InitStruct->Line_32_63);
232 break;
233 case LL_EXTI_MODE_EVENT:
234 /* First Disable IT on provided Lines */
235 LL_EXTI_DisableIT_32_63(EXTI_InitStruct->Line_32_63);
236 /* Then Enable Event on provided Lines */
237 LL_EXTI_EnableEvent_32_63(EXTI_InitStruct->Line_32_63);
238 break;
239 case LL_EXTI_MODE_IT_EVENT:
240 /* Directly Enable IT & Event on provided Lines */
241 LL_EXTI_EnableIT_32_63(EXTI_InitStruct->Line_32_63);
242 LL_EXTI_EnableEvent_32_63(EXTI_InitStruct->Line_32_63);
243 break;
244 default:
245 status |= 0x04u;
246 break;
247 }
248 if (EXTI_InitStruct->Trigger != LL_EXTI_TRIGGER_NONE)
249 {
250 switch (EXTI_InitStruct->Trigger)
251 {
252 case LL_EXTI_TRIGGER_RISING:
253 /* First Disable Falling Trigger on provided Lines */
254 LL_EXTI_DisableFallingTrig_32_63(EXTI_InitStruct->Line_32_63);
255 /* Then Enable IT on provided Lines */
256 LL_EXTI_EnableRisingTrig_32_63(EXTI_InitStruct->Line_32_63);
257 break;
258 case LL_EXTI_TRIGGER_FALLING:
259 /* First Disable Rising Trigger on provided Lines */
260 LL_EXTI_DisableRisingTrig_32_63(EXTI_InitStruct->Line_32_63);
261 /* Then Enable Falling Trigger on provided Lines */
262 LL_EXTI_EnableFallingTrig_32_63(EXTI_InitStruct->Line_32_63);
263 break;
264 case LL_EXTI_TRIGGER_RISING_FALLING:
265 LL_EXTI_EnableRisingTrig_32_63(EXTI_InitStruct->Line_32_63);
266 LL_EXTI_EnableFallingTrig_32_63(EXTI_InitStruct->Line_32_63);
267 break;
268 default:
269 status |= 0x08u;
270 break;
271 }
272 }
273 }
274 /* Configure EXTI Lines in range from 64 to 95 */
275 if (EXTI_InitStruct->Line_64_95 != LL_EXTI_LINE_NONE)
276 {
277 switch (EXTI_InitStruct->Mode)
278 {
279 case LL_EXTI_MODE_IT:
280 /* First Disable Event on provided Lines */
281 LL_EXTI_DisableEvent_64_95(EXTI_InitStruct->Line_64_95);
282 /* Then Enable IT on provided Lines */
283 LL_EXTI_EnableIT_64_95(EXTI_InitStruct->Line_64_95);
284 break;
285 case LL_EXTI_MODE_EVENT:
286 /* First Disable IT on provided Lines */
287 LL_EXTI_DisableIT_64_95(EXTI_InitStruct->Line_64_95);
288 /* Then Enable Event on provided Lines */
289 LL_EXTI_EnableEvent_64_95(EXTI_InitStruct->Line_64_95);
290 break;
291 case LL_EXTI_MODE_IT_EVENT:
292 /* Directly Enable IT & Event on provided Lines */
293 LL_EXTI_EnableIT_64_95(EXTI_InitStruct->Line_64_95);
294 LL_EXTI_EnableEvent_64_95(EXTI_InitStruct->Line_64_95);
295 break;
296 default:
297 status |= 0x10u;
298 break;
299 }
300 if (EXTI_InitStruct->Trigger != LL_EXTI_TRIGGER_NONE)
301 {
302 switch (EXTI_InitStruct->Trigger)
303 {
304 case LL_EXTI_TRIGGER_RISING:
305 /* First Disable Falling Trigger on provided Lines */
306 LL_EXTI_DisableFallingTrig_64_95(EXTI_InitStruct->Line_64_95);
307 /* Then Enable IT on provided Lines */
308 LL_EXTI_EnableRisingTrig_64_95(EXTI_InitStruct->Line_64_95);
309 break;
310 case LL_EXTI_TRIGGER_FALLING:
311 /* First Disable Rising Trigger on provided Lines */
312 LL_EXTI_DisableRisingTrig_64_95(EXTI_InitStruct->Line_64_95);
313 /* Then Enable Falling Trigger on provided Lines */
314 LL_EXTI_EnableFallingTrig_64_95(EXTI_InitStruct->Line_64_95);
315 break;
316 case LL_EXTI_TRIGGER_RISING_FALLING:
317 LL_EXTI_EnableRisingTrig_64_95(EXTI_InitStruct->Line_64_95);
318 LL_EXTI_EnableFallingTrig_64_95(EXTI_InitStruct->Line_64_95);
319 break;
320 default:
321 status |= 0x20u;
322 break;
323 }
324 }
325 }
326 }
327 /* DISABLE LineCommand */
328 else
329 {
330 /* De-configure EXTI Lines in range from 0 to 31 */
331 LL_EXTI_DisableIT_0_31(EXTI_InitStruct->Line_0_31);
332 LL_EXTI_DisableEvent_0_31(EXTI_InitStruct->Line_0_31);
333 /* De-configure EXTI Lines in range from 32 to 63 */
334 LL_EXTI_DisableIT_32_63(EXTI_InitStruct->Line_32_63);
335 LL_EXTI_DisableEvent_32_63(EXTI_InitStruct->Line_32_63);
336 /* De-configure EXTI Lines in range from 64 to 95 */
337 LL_EXTI_DisableIT_64_95(EXTI_InitStruct->Line_64_95);
338 LL_EXTI_DisableEvent_64_95(EXTI_InitStruct->Line_64_95);
339 }
340 return status;
341 }
342
343 /**
344 * @brief Set each @ref LL_EXTI_InitTypeDef field to default value.
345 * @param EXTI_InitStruct Pointer to a @ref LL_EXTI_InitTypeDef structure.
346 * @retval None
347 */
LL_EXTI_StructInit(LL_EXTI_InitTypeDef * EXTI_InitStruct)348 void LL_EXTI_StructInit(LL_EXTI_InitTypeDef *EXTI_InitStruct)
349 {
350 EXTI_InitStruct->Line_0_31 = LL_EXTI_LINE_NONE;
351 EXTI_InitStruct->Line_32_63 = LL_EXTI_LINE_NONE;
352 EXTI_InitStruct->Line_64_95 = LL_EXTI_LINE_NONE;
353 EXTI_InitStruct->LineCommand = DISABLE;
354 EXTI_InitStruct->Mode = LL_EXTI_MODE_IT;
355 EXTI_InitStruct->Trigger = LL_EXTI_TRIGGER_FALLING;
356 }
357
358 /**
359 * @}
360 */
361
362 /**
363 * @}
364 */
365
366 /**
367 * @}
368 */
369
370 #endif /* defined (EXTI) */
371
372 /**
373 * @}
374 */
375
376 #endif /* USE_FULL_LL_DRIVER */
377
378