Merge pull request #93 from zyp/master
[fw/stlink] / example / libs_stm / src / stm32l1xx / stm32l1xx_exti.c
1 /**\r
2   ******************************************************************************\r
3   * @file    stm32l1xx_exti.c\r
4   * @author  MCD Application Team\r
5   * @version V1.0.0\r
6   * @date    31-December-2010\r
7   * @brief   This file provides firmware functions to manage the following \r
8   *          functionalities of the EXTI peripheral:           \r
9   *           - Initialization and Configuration\r
10   *           - Interrupts and flags management\r
11   *\r
12   *  @verbatim  \r
13   *  \r
14   *          ===================================================================\r
15   *                                     EXTI features\r
16   *          ===================================================================\r
17   *    \r
18   *          External interrupt/event lines are mapped as following:\r
19   *            1- All available GPIO pins are connected to the 16 external \r
20   *               interrupt/event lines from EXTI0 to EXTI15.\r
21   *            2- EXTI line 16 is connected to the PVD output\r
22   *            3- EXTI line 17 is connected to the RTC Alarm event\r
23   *            4- EXTI line 18 is connected to the USB Device FS wakeup event\r
24   *            5- EXTI line 19 is connected to the RTC Tamper and TimeStamp events\r
25   *            6- EXTI line 20 is connected to the RTC Wakeup event\r
26   *            7- EXTI line 21 is connected to the Comparator 1 wakeup event \r
27   *            8- EXTI line 22 is connected to the Comparator 2 wakeup event\r
28   *\r
29   *          ===================================================================\r
30   *                                 How to use this driver\r
31   *          ===================================================================  \r
32   *              \r
33   *          In order to use an I/O pin as an external interrupt source, follow\r
34   *          steps below:\r
35   *            1- Configure the I/O in input mode using GPIO_Init()\r
36   *            2- Select the input source pin for the EXTI line using \r
37   *               SYSCFG_EXTILineConfig()\r
38   *            3- Select the mode(interrupt, event) and configure the trigger \r
39   *               selection (Rising, falling or both) using EXTI_Init()\r
40   *            4- Configure NVIC IRQ channel mapped to the EXTI line using NVIC_Init()\r
41   *   \r
42   *@note     SYSCFG APB clock must be enabled to get write access to SYSCFG_EXTICRx\r
43   *          registers using RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);\r
44   *          \r
45   *  @endverbatim                  \r
46   *\r
47   ******************************************************************************\r
48   * @attention\r
49   *\r
50   * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS\r
51   * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE\r
52   * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY\r
53   * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING\r
54   * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE\r
55   * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.\r
56   *\r
57   * <h2><center>&copy; COPYRIGHT 2010 STMicroelectronics</center></h2>\r
58   ******************************************************************************  \r
59   */ \r
60 \r
61 /* Includes ------------------------------------------------------------------*/\r
62 #include "stm32l1xx_exti.h"\r
63 \r
64 /** @addtogroup STM32L1xx_StdPeriph_Driver\r
65   * @{\r
66   */\r
67 \r
68 /** @defgroup EXTI \r
69   * @brief EXTI driver modules\r
70   * @{\r
71   */\r
72 \r
73 /* Private typedef -----------------------------------------------------------*/\r
74 /* Private define ------------------------------------------------------------*/\r
75 #define EXTI_LINENONE    ((uint32_t)0x00000)  /* No interrupt selected */\r
76 \r
77 /* Private macro -------------------------------------------------------------*/\r
78 /* Private variables ---------------------------------------------------------*/\r
79 /* Private function prototypes -----------------------------------------------*/\r
80 /* Private functions ---------------------------------------------------------*/\r
81 \r
82 /** @defgroup EXTI_Private_Functions\r
83   * @{\r
84   */\r
85 \r
86 /** @defgroup EXTI_Group1 Initialization and Configuration functions\r
87  *  @brief   Initialization and Configuration functions \r
88  *\r
89 @verbatim   \r
90  ===============================================================================\r
91                   Initialization and Configuration functions\r
92  ===============================================================================  \r
93 \r
94 @endverbatim\r
95   * @{\r
96   */\r
97 \r
98 /**\r
99   * @brief  Deinitializes the EXTI peripheral registers to their default reset values.\r
100   * @param  None\r
101   * @retval None\r
102   */\r
103 void EXTI_DeInit(void)\r
104 {\r
105   EXTI->IMR = 0x00000000;\r
106   EXTI->EMR = 0x00000000;\r
107   EXTI->RTSR = 0x00000000; \r
108   EXTI->FTSR = 0x00000000; \r
109   EXTI->PR = 0x007FFFFF;\r
110 }\r
111 \r
112 /**\r
113   * @brief  Initializes the EXTI peripheral according to the specified\r
114   *   parameters in the EXTI_InitStruct.\r
115   *    EXTI_Line specifies the EXTI line (EXTI0....EXTI22)  \r
116   *    EXTI_Mode specifies which EXTI line is used as interrupt or an event\r
117   *    EXTI_Trigger selects the trigger. When the trigger occurs, interrupt\r
118   *                 pending bit will be set\r
119   *    EXTI_LineCmd controls (Enable/Disable) the EXTI line\r
120   * @param  EXTI_InitStruct: pointer to a EXTI_InitTypeDef structure\r
121   *   that contains the configuration information for the EXTI peripheral.\r
122   * @retval None\r
123   */\r
124 void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)\r
125 {\r
126   uint32_t tmp = 0;\r
127 \r
128   /* Check the parameters */\r
129   assert_param(IS_EXTI_MODE(EXTI_InitStruct->EXTI_Mode));\r
130   assert_param(IS_EXTI_TRIGGER(EXTI_InitStruct->EXTI_Trigger));\r
131   assert_param(IS_EXTI_LINE(EXTI_InitStruct->EXTI_Line));  \r
132   assert_param(IS_FUNCTIONAL_STATE(EXTI_InitStruct->EXTI_LineCmd));\r
133 \r
134   tmp = (uint32_t)EXTI_BASE;\r
135      \r
136   if (EXTI_InitStruct->EXTI_LineCmd != DISABLE)\r
137   {\r
138     /* Clear EXTI line configuration */\r
139     EXTI->IMR &= ~EXTI_InitStruct->EXTI_Line;\r
140     EXTI->EMR &= ~EXTI_InitStruct->EXTI_Line;\r
141     \r
142     tmp += EXTI_InitStruct->EXTI_Mode;\r
143 \r
144     *(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line;\r
145 \r
146     /* Clear Rising Falling edge configuration */\r
147     EXTI->RTSR &= ~EXTI_InitStruct->EXTI_Line;\r
148     EXTI->FTSR &= ~EXTI_InitStruct->EXTI_Line;\r
149     \r
150     /* Select the trigger for the selected external interrupts */\r
151     if (EXTI_InitStruct->EXTI_Trigger == EXTI_Trigger_Rising_Falling)\r
152     {\r
153       /* Rising Falling edge */\r
154       EXTI->RTSR |= EXTI_InitStruct->EXTI_Line;\r
155       EXTI->FTSR |= EXTI_InitStruct->EXTI_Line;\r
156     }\r
157     else\r
158     {\r
159       tmp = (uint32_t)EXTI_BASE;\r
160       tmp += EXTI_InitStruct->EXTI_Trigger;\r
161 \r
162       *(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line;\r
163     }\r
164   }\r
165   else\r
166   {\r
167     tmp += EXTI_InitStruct->EXTI_Mode;\r
168 \r
169     /* Disable the selected external lines */\r
170     *(__IO uint32_t *) tmp &= ~EXTI_InitStruct->EXTI_Line;\r
171   }\r
172 }\r
173 \r
174 /**\r
175   * @brief  Fills each EXTI_InitStruct member with its reset value.\r
176   * @param  EXTI_InitStruct: pointer to a EXTI_InitTypeDef structure which will\r
177   *   be initialized.\r
178   * @retval None\r
179   */\r
180 void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct)\r
181 {\r
182   EXTI_InitStruct->EXTI_Line = EXTI_LINENONE;\r
183   EXTI_InitStruct->EXTI_Mode = EXTI_Mode_Interrupt;\r
184   EXTI_InitStruct->EXTI_Trigger = EXTI_Trigger_Falling;\r
185   EXTI_InitStruct->EXTI_LineCmd = DISABLE;\r
186 }\r
187 \r
188 /**\r
189   * @brief  Generates a Software interrupt on selected EXTI line.\r
190   * @param  EXTI_Line: specifies the EXTI line on which the software interrupt\r
191   *         will be generated.\r
192   *   This parameter can be any combination of EXTI_Linex where x can be (0..22).\r
193   * @retval None\r
194   */\r
195 void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line)\r
196 {\r
197   /* Check the parameters */\r
198   assert_param(IS_EXTI_LINE(EXTI_Line));\r
199   \r
200   EXTI->SWIER |= EXTI_Line;\r
201 }\r
202 \r
203 /**\r
204   * @}\r
205   */\r
206 \r
207 /** @defgroup EXTI_Group2 Interrupts and flags management functions\r
208  *  @brief   Interrupts and flags management functions \r
209  *\r
210 @verbatim   \r
211  ===============================================================================\r
212                   Interrupts and flags management functions\r
213  ===============================================================================  \r
214 \r
215 @endverbatim\r
216   * @{\r
217   */\r
218 \r
219 /**\r
220   * @brief  Checks whether the specified EXTI line flag is set or not.\r
221   * @param  EXTI_Line: specifies the EXTI line flag to check.\r
222   *   This parameter can be:\r
223   *     @arg EXTI_Linex: External interrupt line x where x(0..22)\r
224   * @retval The new state of EXTI_Line (SET or RESET).\r
225   */\r
226 FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line)\r
227 {\r
228   FlagStatus bitstatus = RESET;\r
229   /* Check the parameters */\r
230   assert_param(IS_GET_EXTI_LINE(EXTI_Line));\r
231   \r
232   if ((EXTI->PR & EXTI_Line) != (uint32_t)RESET)\r
233   {\r
234     bitstatus = SET;\r
235   }\r
236   else\r
237   {\r
238     bitstatus = RESET;\r
239   }\r
240   return bitstatus;\r
241 }\r
242 \r
243 /**\r
244   * @brief  Clears the EXTI\92s line pending flags.\r
245   * @param  EXTI_Line: specifies the EXTI lines flags to clear.\r
246   *   This parameter can be any combination of EXTI_Linex where x can be (0..22).\r
247   * @retval None\r
248   */\r
249 void EXTI_ClearFlag(uint32_t EXTI_Line)\r
250 {\r
251   /* Check the parameters */\r
252   assert_param(IS_EXTI_LINE(EXTI_Line));\r
253   \r
254   EXTI->PR = EXTI_Line;\r
255 }\r
256 \r
257 /**\r
258   * @brief  Checks whether the specified EXTI line is asserted or not.\r
259   * @param  EXTI_Line: specifies the EXTI line to check.\r
260   *   This parameter can be:\r
261   *     @arg EXTI_Linex: External interrupt line x where x(0..22)\r
262   * @retval The new state of EXTI_Line (SET or RESET).\r
263   */\r
264 ITStatus EXTI_GetITStatus(uint32_t EXTI_Line)\r
265 {\r
266   ITStatus bitstatus = RESET;\r
267   uint32_t enablestatus = 0;\r
268   /* Check the parameters */\r
269   assert_param(IS_GET_EXTI_LINE(EXTI_Line));\r
270   \r
271   enablestatus =  EXTI->IMR & EXTI_Line;\r
272   if (((EXTI->PR & EXTI_Line) != (uint32_t)RESET) && (enablestatus != (uint32_t)RESET))\r
273   {\r
274     bitstatus = SET;\r
275   }\r
276   else\r
277   {\r
278     bitstatus = RESET;\r
279   }\r
280   return bitstatus;\r
281 }\r
282 \r
283 /**\r
284   * @brief  Clears the EXTI\92s line pending bits.\r
285   * @param  EXTI_Line: specifies the EXTI lines to clear.\r
286   *   This parameter can be any combination of EXTI_Linex where x can be (0..22).\r
287   * @retval None\r
288   */\r
289 void EXTI_ClearITPendingBit(uint32_t EXTI_Line)\r
290 {\r
291   /* Check the parameters */\r
292   assert_param(IS_EXTI_LINE(EXTI_Line));\r
293   \r
294   EXTI->PR = EXTI_Line;\r
295 }\r
296 \r
297 /**\r
298   * @}\r
299   */\r
300 \r
301 /**\r
302   * @}\r
303   */\r
304 \r
305 /**\r
306   * @}\r
307   */\r
308 \r
309 /**\r
310   * @}\r
311   */\r
312 \r
313 /******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/\r