]> git.leonardobizzoni.com Git - pioneer-stm32/blob
07e535363428b49d512e9512aba89f32f2e0d3a1
[pioneer-stm32] /
1 /**\r
2   ******************************************************************************\r
3   * @file    stm32F7xx_hal_exti.c\r
4   * @author  MCD Application Team\r
5   * @brief   EXTI HAL module driver.\r
6   *          This file provides firmware functions to manage the following\r
7   *          functionalities of the Extended Interrupts and events controller (EXTI) peripheral:\r
8   *           + Initialization and de-initialization functions\r
9   *           + IO operation functions\r
10   *\r
11   @verbatim\r
12   ==============================================================================\r
13                     ##### EXTI Peripheral features #####\r
14   ==============================================================================\r
15   [..]\r
16     (+) Each Exti line can be configured within this driver.\r
17 \r
18     (+) Exti line can be configured in 3 different modes\r
19         (++) Interrupt\r
20         (++) Event\r
21         (++) Both of them\r
22 \r
23     (+) Configurable Exti lines can be configured with 3 different triggers\r
24         (++) Rising\r
25         (++) Falling\r
26         (++) Both of them\r
27 \r
28     (+) When set in interrupt mode, configurable Exti lines have two different\r
29         interrupts pending registers which allow to distinguish which transition\r
30         occurs:\r
31         (++) Rising edge pending interrupt\r
32         (++) Falling\r
33 \r
34     (+) Exti lines 0 to 15 are linked to gpio pin number 0 to 15. Gpio port can\r
35         be selected through multiplexer.\r
36 \r
37                      ##### How to use this driver #####\r
38   ==============================================================================\r
39   [..]\r
40 \r
41     (#) Configure the EXTI line using HAL_EXTI_SetConfigLine().\r
42         (++) Choose the interrupt line number by setting "Line" member from\r
43              EXTI_ConfigTypeDef structure.\r
44         (++) Configure the interrupt and/or event mode using "Mode" member from\r
45              EXTI_ConfigTypeDef structure.\r
46         (++) For configurable lines, configure rising and/or falling trigger\r
47              "Trigger" member from EXTI_ConfigTypeDef structure.\r
48         (++) For Exti lines linked to gpio, choose gpio port using "GPIOSel"\r
49              member from GPIO_InitTypeDef structure.\r
50 \r
51     (#) Get current Exti configuration of a dedicated line using\r
52         HAL_EXTI_GetConfigLine().\r
53         (++) Provide exiting handle as parameter.\r
54         (++) Provide pointer on EXTI_ConfigTypeDef structure as second parameter.\r
55 \r
56     (#) Clear Exti configuration of a dedicated line using HAL_EXTI_GetConfigLine().\r
57         (++) Provide exiting handle as parameter.\r
58 \r
59     (#) Register callback to treat Exti interrupts using HAL_EXTI_RegisterCallback().\r
60         (++) Provide exiting handle as first parameter.\r
61         (++) Provide which callback will be registered using one value from\r
62              EXTI_CallbackIDTypeDef.\r
63         (++) Provide callback function pointer.\r
64 \r
65     (#) Get interrupt pending bit using HAL_EXTI_GetPending().\r
66 \r
67     (#) Clear interrupt pending bit using HAL_EXTI_GetPending().\r
68 \r
69     (#) Generate software interrupt using HAL_EXTI_GenerateSWI().\r
70 \r
71   @endverbatim\r
72   ******************************************************************************\r
73   * @attention\r
74   *\r
75   * <h2><center>&copy; Copyright (c) 2018 STMicroelectronics.\r
76   * All rights reserved.</center></h2>\r
77   *\r
78   * This software component is licensed by ST under BSD 3-Clause license,\r
79   * the "License"; You may not use this file except in compliance with the\r
80   * License. You may obtain a copy of the License at:\r
81   *                        opensource.org/licenses/BSD-3-Clause\r
82   *\r
83   ******************************************************************************\r
84   */\r
85 \r
86 /* Includes ------------------------------------------------------------------*/\r
87 #include "stm32f7xx_hal.h"\r
88 #include "stm32f7xx_hal_exti.h"\r
89 \r
90 /** @addtogroup STM32F7xx_HAL_Driver\r
91   * @{\r
92   */\r
93 \r
94 /** @addtogroup EXTI\r
95   * @{\r
96   */\r
97 /** MISRA C:2012 deviation rule has been granted for following rule:\r
98   * Rule-18.1_b - Medium: Array `EXTICR' 1st subscript interval [0,7] may be out\r
99   * of bounds [0,3] in following API :\r
100   * HAL_EXTI_SetConfigLine\r
101   * HAL_EXTI_GetConfigLine\r
102   * HAL_EXTI_ClearConfigLine\r
103   */\r
104 \r
105 #ifdef HAL_EXTI_MODULE_ENABLED\r
106 \r
107 /* Private typedef -----------------------------------------------------------*/\r
108 /* Private defines ------------------------------------------------------------*/\r
109 /** @defgroup EXTI_Private_Constants EXTI Private Constants\r
110   * @{\r
111   */\r
112 \r
113 /**\r
114   * @}\r
115   */\r
116 \r
117 /* Private macros ------------------------------------------------------------*/\r
118 /* Private variables ---------------------------------------------------------*/\r
119 /* Private function prototypes -----------------------------------------------*/\r
120 /* Exported functions --------------------------------------------------------*/\r
121 \r
122 /** @addtogroup EXTI_Exported_Functions\r
123   * @{\r
124   */\r
125 \r
126 /** @addtogroup EXTI_Exported_Functions_Group1\r
127   *  @brief    Configuration functions\r
128   *\r
129 @verbatim\r
130  ===============================================================================\r
131               ##### Configuration functions #####\r
132  ===============================================================================\r
133 \r
134 @endverbatim\r
135   * @{\r
136   */\r
137 \r
138 /**\r
139   * @brief  Set configuration of a dedicated Exti line.\r
140   * @param  hexti Exti handle.\r
141   * @param  pExtiConfig Pointer on EXTI configuration to be set.\r
142   * @retval HAL Status.\r
143   */\r
144 HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig)\r
145 {\r
146   uint32_t regval;\r
147 \r
148   /* Check null pointer */\r
149   if ((hexti == NULL) || (pExtiConfig == NULL))\r
150   {\r
151     return HAL_ERROR;\r
152   }\r
153 \r
154   /* Check parameters */\r
155   assert_param(IS_EXTI_LINE(pExtiConfig->Line));\r
156   assert_param(IS_EXTI_MODE(pExtiConfig->Mode));\r
157   assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger));  \r
158   \r
159   /* Assign line number to handle */\r
160   hexti->Line = pExtiConfig->Line;\r
161   \r
162   /* Clear EXTI line configuration */\r
163   EXTI->IMR &= ~pExtiConfig->Line;\r
164   EXTI->EMR &= ~pExtiConfig->Line;\r
165   \r
166   /* Select the Mode for the selected external interrupts */\r
167   regval = (uint32_t)EXTI_BASE;\r
168   regval += pExtiConfig->Mode;\r
169   *(__IO uint32_t *) regval |= pExtiConfig->Line;\r
170   \r
171   /* Clear Rising Falling edge configuration */\r
172   EXTI->RTSR &= ~pExtiConfig->Line;\r
173   EXTI->FTSR &= ~pExtiConfig->Line;\r
174   \r
175   /* Select the trigger for the selected external interrupts */\r
176   if (pExtiConfig->Trigger == EXTI_TRIGGER_RISING_FALLING)\r
177   {\r
178     /* Rising Falling edge */\r
179     EXTI->RTSR |= pExtiConfig->Line;\r
180     EXTI->FTSR |= pExtiConfig->Line;\r
181   }\r
182   else\r
183   {\r
184     regval = (uint32_t)EXTI_BASE;\r
185     regval += pExtiConfig->Trigger;\r
186     *(__IO uint32_t *) regval |= pExtiConfig->Line;\r
187   }\r
188   return HAL_OK;\r
189 }\r
190 \r
191 /**\r
192   * @brief  Get configuration of a dedicated Exti line.\r
193   * @param  hexti Exti handle.\r
194   * @param  pExtiConfig Pointer on structure to store Exti configuration.\r
195   * @retval HAL Status.\r
196   */\r
197 HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig)\r
198 {\r
199   /* Check null pointer */\r
200   if ((hexti == NULL) || (pExtiConfig == NULL))\r
201   {\r
202     return HAL_ERROR;\r
203   }\r
204 \r
205   /* Check the parameter */\r
206   assert_param(IS_EXTI_LINE(hexti->Line));\r
207 \r
208   /* Store handle line number to configuration structure */\r
209   pExtiConfig->Line = hexti->Line;\r
210 \r
211   /* Get EXTI mode to configiguration structure */\r
212   if ((EXTI->IMR & hexti->Line) == hexti->Line)\r
213   {\r
214     pExtiConfig->Mode = EXTI_MODE_INTERRUPT;\r
215   }\r
216   else if ((EXTI->EMR & hexti->Line) == hexti->Line)\r
217   {\r
218     pExtiConfig->Mode = EXTI_MODE_EVENT;\r
219   }\r
220   else\r
221   {\r
222     /* No MODE selected */\r
223     pExtiConfig->Mode = 0x0Bu;\r
224   }\r
225 \r
226   /* Get EXTI Trigger to configiguration structure */\r
227   if ((EXTI->RTSR & hexti->Line) == hexti->Line)\r
228   {\r
229     if ((EXTI->FTSR & hexti->Line) == hexti->Line)\r
230     {\r
231       pExtiConfig->Trigger = EXTI_TRIGGER_RISING_FALLING;\r
232     }\r
233     else\r
234     {\r
235       pExtiConfig->Trigger = EXTI_TRIGGER_RISING;\r
236     }\r
237   }\r
238   else if ((EXTI->FTSR & hexti->Line) == hexti->Line)\r
239   {\r
240     pExtiConfig->Trigger = EXTI_TRIGGER_FALLING;\r
241   }\r
242   else\r
243   {\r
244     /* No Trigger selected */\r
245     pExtiConfig->Trigger = 0x00u;\r
246   }\r
247 \r
248   return HAL_OK;\r
249 }\r
250 \r
251 /**\r
252   * @brief  Clear whole configuration of a dedicated Exti line.\r
253   * @param  hexti Exti handle.\r
254   * @retval HAL Status.\r
255   */\r
256 HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti)\r
257 {\r
258   /* Check null pointer */\r
259   if (hexti == NULL)\r
260   {\r
261     return HAL_ERROR;\r
262   }\r
263 \r
264   /* Check the parameter */\r
265   assert_param(IS_EXTI_LINE(hexti->Line));\r
266 \r
267   /* 1] Clear interrupt mode */\r
268   EXTI->IMR = (EXTI->IMR & ~hexti->Line);\r
269 \r
270   /* 2] Clear event mode */\r
271   EXTI->EMR = (EXTI->EMR & ~hexti->Line);\r
272 \r
273   /* 3] Clear triggers */\r
274   EXTI->RTSR = (EXTI->RTSR & ~hexti->Line);\r
275   EXTI->FTSR = (EXTI->FTSR & ~hexti->Line);\r
276 \r
277   return HAL_OK;\r
278 }\r
279 \r
280 /**\r
281   * @brief  Register callback for a dedicated Exti line.\r
282   * @param  hexti Exti handle.\r
283   * @param  CallbackID User callback identifier.\r
284   *         This parameter can be one of @arg @ref EXTI_CallbackIDTypeDef values.\r
285   * @param  pPendingCbfn function pointer to be stored as callback.\r
286   * @retval HAL Status.\r
287   */\r
288 HAL_StatusTypeDef HAL_EXTI_RegisterCallback(EXTI_HandleTypeDef *hexti, EXTI_CallbackIDTypeDef CallbackID, void (*pPendingCbfn)(void))\r
289 {\r
290   HAL_StatusTypeDef status = HAL_OK;\r
291 \r
292   switch (CallbackID)\r
293   {\r
294     case  HAL_EXTI_COMMON_CB_ID:\r
295       hexti->PendingCallback = pPendingCbfn;\r
296       break;\r
297 \r
298     default:\r
299       status = HAL_ERROR;\r
300       break;\r
301   }\r
302 \r
303   return status;\r
304 }\r
305 \r
306 /**\r
307   * @brief  Store line number as handle private field.\r
308   * @param  hexti Exti handle.\r
309   * @param  ExtiLine Exti line number.\r
310   *         This parameter can be from 0 to @ref EXTI_LINE_NB.\r
311   * @retval HAL Status.\r
312   */\r
313 HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLine)\r
314 {\r
315   /* Check the parameters */\r
316   assert_param(IS_EXTI_LINE(ExtiLine));\r
317 \r
318   /* Check null pointer */\r
319   if (hexti == NULL)\r
320   {\r
321     return HAL_ERROR;\r
322   }\r
323   else\r
324   {\r
325     /* Store line number as handle private field */\r
326     hexti->Line = ExtiLine;\r
327 \r
328     return HAL_OK;\r
329   }\r
330 }\r
331 \r
332 /**\r
333   * @}\r
334   */\r
335 \r
336 /** @addtogroup EXTI_Exported_Functions_Group2\r
337   *  @brief EXTI IO functions.\r
338   *\r
339 @verbatim\r
340  ===============================================================================\r
341                        ##### IO operation functions #####\r
342  ===============================================================================\r
343 \r
344 @endverbatim\r
345   * @{\r
346   */\r
347 \r
348 /**\r
349   * @brief  Handle EXTI interrupt request.\r
350   * @param  hexti Exti handle.\r
351   * @retval none.\r
352   */\r
353 void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti)\r
354 {\r
355   __IO uint32_t *regaddr;\r
356   uint32_t regval;\r
357 \r
358   /* Get pending bit  */\r
359   regaddr = (&EXTI->PR);\r
360   regval = (*regaddr & hexti->Line);\r
361 \r
362   if (regval != 0x00u)\r
363   {\r
364     /* Clear pending bit */\r
365     *regaddr = hexti->Line;\r
366 \r
367     /* Call callback */\r
368     if (hexti->PendingCallback != NULL)\r
369     {\r
370       hexti->PendingCallback();\r
371     }\r
372   }\r
373 }\r
374 \r
375 /**\r
376   * @brief  Get interrupt pending bit of a dedicated line.\r
377   * @param  hexti Exti handle.\r
378   * @param  Edge Specify which pending edge as to be checked.\r
379   *         This parameter can be one of the following values:\r
380   *           @arg @ref EXTI_TRIGGER_RISING_FALLING\r
381   *         This parameter is kept for compatibility with other series.\r
382   * @retval 1 if interrupt is pending else 0.\r
383   */\r
384 uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge)\r
385 {\r
386   __IO uint32_t *regaddr;\r
387   uint32_t regval;\r
388 \r
389   /* Check parameters */\r
390   assert_param(IS_EXTI_LINE(hexti->Line));\r
391   assert_param(IS_EXTI_PENDING_EDGE(Edge));\r
392 \r
393   /* Get pending bit */\r
394   regaddr = &EXTI->PR;\r
395 \r
396   /* return 1 if bit is set else 0 */\r
397   regval = ((*regaddr & hexti->Line) >> POSITION_VAL(hexti->Line));\r
398 \r
399   return regval;\r
400 }\r
401 \r
402 /**\r
403   * @brief  Clear interrupt pending bit of a dedicated line.\r
404   * @param  hexti Exti handle.\r
405   * @param  Edge Specify which pending edge as to be clear.\r
406   *         This parameter can be one of the following values:\r
407   *           @arg @ref EXTI_TRIGGER_RISING_FALLING\r
408   *         This parameter is kept for compatibility with other series.\r
409   * @retval None.\r
410   */\r
411 void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge)\r
412 {\r
413   /* Check parameters */\r
414   assert_param(IS_EXTI_LINE(hexti->Line));\r
415   assert_param(IS_EXTI_PENDING_EDGE(Edge));\r
416   \r
417   /* Clear Pending bit */\r
418   EXTI->PR =  hexti->Line;\r
419 }\r
420 \r
421 /**\r
422   * @brief  Generate a software interrupt for a dedicated line.\r
423   * @param  hexti Exti handle.\r
424   * @retval None.\r
425   */\r
426 void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti)\r
427 {\r
428   /* Check parameters */\r
429   assert_param(IS_EXTI_LINE(hexti->Line));\r
430 \r
431   EXTI->SWIER = hexti->Line;\r
432 }\r
433 \r
434 /**\r
435   * @}\r
436   */\r
437 \r
438 /**\r
439   * @}\r
440   */\r
441 \r
442 #endif /* HAL_EXTI_MODULE_ENABLED */\r
443 /**\r
444   * @}\r
445   */\r
446 \r
447 /**\r
448   * @}\r
449   */\r
450 \r
451 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\r