1 /**
2   ****************************************************************************************************
3   * @file    fm33lc0xx_fl_exti.c
4   * @author  FMSH Application Team
5   * @brief   Src file of EXTI FL Module
6   ****************************************************************************************************
7   * @attention
8   *
9   * Copyright (c) [2021] [Fudan Microelectronics]
10   * THIS SOFTWARE is licensed under Mulan PSL v2.
11   * You can use this software according to the terms and conditions of the Mulan PSL v2.
12   * You may obtain a copy of Mulan PSL v2 at:
13   *          http://license.coscl.org.cn/MulanPSL2
14   * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
15   * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
16   * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
17   * See the Mulan PSL v2 for more details.
18   *
19   ****************************************************************************************************
20   */
21 
22 
23 /* Includes ------------------------------------------------------------------*/
24 #include "fm33lc0xx_fl.h"
25 
26 /** @addtogroup FM33LC0XX_FL_Driver
27   * @{
28   */
29 
30 /** @addtogroup EXTI
31   * @{
32   */
33 
34 #ifdef FL_EXTI_DRIVER_ENABLED
35 
36 /* Private macros ------------------------------------------------------------*/
37 /** @addtogroup EXTI_FL_Private_Macros
38   * @{
39   */
40 
41 #define IS_EXTI_ALL_INSTANCE(INSTANCE)             (((INSTANCE) == FL_GPIO_EXTI_LINE_0)||\
42                                                     ((INSTANCE) == FL_GPIO_EXTI_LINE_1)||\
43                                                     ((INSTANCE) == FL_GPIO_EXTI_LINE_2)||\
44                                                     ((INSTANCE) == FL_GPIO_EXTI_LINE_3)||\
45                                                     ((INSTANCE) == FL_GPIO_EXTI_LINE_4)||\
46                                                     ((INSTANCE) == FL_GPIO_EXTI_LINE_5)||\
47                                                     ((INSTANCE) == FL_GPIO_EXTI_LINE_6)||\
48                                                     ((INSTANCE) == FL_GPIO_EXTI_LINE_7)||\
49                                                     ((INSTANCE) == FL_GPIO_EXTI_LINE_8)||\
50                                                     ((INSTANCE) == FL_GPIO_EXTI_LINE_9)||\
51                                                     ((INSTANCE) == FL_GPIO_EXTI_LINE_10)||\
52                                                     ((INSTANCE) == FL_GPIO_EXTI_LINE_11)||\
53                                                     ((INSTANCE) == FL_GPIO_EXTI_LINE_12)||\
54                                                     ((INSTANCE) == FL_GPIO_EXTI_LINE_13)||\
55                                                     ((INSTANCE) == FL_GPIO_EXTI_LINE_14))
56 
57 #define IS_EXTI_CLK_SOURCE(__VALUE__)              (((__VALUE__) == FL_RCC_EXTI_CLK_SOURCE_HCLK)||\
58                                                     ((__VALUE__) == FL_RCC_EXTI_CLK_SOURCE_LSCLK))
59 
60 #define IS_EXTI_INPUT_GROUP(__VALUE__)             (((__VALUE__) == FL_GPIO_EXTI_INPUT_GROUP0)||\
61                                                     ((__VALUE__) == FL_GPIO_EXTI_INPUT_GROUP1)||\
62                                                     ((__VALUE__) == FL_GPIO_EXTI_INPUT_GROUP2)||\
63                                                     ((__VALUE__) == FL_GPIO_EXTI_INPUT_GROUP3))
64 
65 #define IS_EXTI_TRIG_EDGE(__VALUE__)               (((__VALUE__) == FL_GPIO_EXTI_TRIGGER_EDGE_RISING)||\
66                                                     ((__VALUE__) == FL_GPIO_EXTI_TRIGGER_EDGE_FALLING)||\
67                                                     ((__VALUE__) == FL_GPIO_EXTI_TRIGGER_EDGE_BOTH))
68 
69 #define IS_EXTI_FILTER(__VALUE__)                  (((__VALUE__) == FL_ENABLE)||\
70                                                     ((__VALUE__) == FL_DISABLE))
71 
72 /**
73   * @}
74   */
75 
76 /* Private consts ------------------------------------------------------------*/
77 /** @addtogroup EXTI_FL_Private_Consts
78   * @{
79   */
80 
81 typedef void (*pSetExtiLineFunc)(GPIO_COMMON_Type *, uint32_t);
82 static const pSetExtiLineFunc setExtiLineFuncs[] =
83 {
84     FL_GPIO_SetExtiLine0,
85     FL_GPIO_SetExtiLine1,
86     FL_GPIO_SetExtiLine2,
87     FL_GPIO_SetExtiLine3,
88     FL_GPIO_SetExtiLine4,
89     FL_GPIO_SetExtiLine5,
90     FL_GPIO_SetExtiLine6,
91     FL_GPIO_SetExtiLine7,
92     FL_GPIO_SetExtiLine8,
93     FL_GPIO_SetExtiLine9,
94     FL_GPIO_SetExtiLine10,
95     NULL,
96     FL_GPIO_SetExtiLine12,
97     FL_GPIO_SetExtiLine13,
98     FL_GPIO_SetExtiLine14,
99 };
100 
101 typedef void (*pSetTrigEdgeFunc)(GPIO_COMMON_Type *, uint32_t, uint32_t);
102 static const pSetTrigEdgeFunc setTrigEdgeFuncs[] =
103 {
104     FL_GPIO_SetTriggerEdge,
105 };
106 
107 /**
108   * @}
109   */
110 
111 /** @addtogroup EXTI_FL_EF_Init
112   * @{
113   */
114 
115 /**
116   * @brief  EXTI通用配置设置
117   *
118   * @param  EXTI_CommonInitStruct 指向 @ref FL_EXTI_CommonInitTypeDef 类型的结构体,它包含EXTI外设通用配置信息
119   *
120   * @retval ErrorStatus枚举值
121   *         -FL_FAIL 配置过程发生错误
122   *         -FL_PASS EXTI配置成功
123   */
FL_EXTI_CommonInit(FL_EXTI_CommonInitTypeDef * EXTI_CommonInitStruct)124 FL_ErrorStatus FL_EXTI_CommonInit(FL_EXTI_CommonInitTypeDef *EXTI_CommonInitStruct)
125 {
126     assert_param(IS_EXTI_CLK_SOURCE(EXTI_CommonInitStruct->clockSource));
127     /* 使能IO时钟寄存器总线时钟 */
128     FL_RCC_EnableGroup1BusClock(FL_RCC_GROUP1_BUSCLK_PAD);
129     /* 使能并配置外部中断时钟源 */
130     FL_RCC_EnableGroup1OperationClock(FL_RCC_GROUP1_OPCLK_EXTI);
131     FL_RCC_SetEXTIClockSource(EXTI_CommonInitStruct->clockSource);
132     return FL_PASS;
133 }
134 
135 /**
136   * @brief  复位EXTI通用配置设置
137   *
138   * @retval 执行结果
139   *         -FL_PASS 外设寄存器值恢复复位值
140   *         -FL_FAIL 未成功执行
141   */
FL_EXTI_CommonDeinit(void)142 FL_ErrorStatus FL_EXTI_CommonDeinit(void)
143 {
144     /* 关闭外部中断时钟源 */
145     FL_RCC_DisableGroup1OperationClock(FL_RCC_GROUP1_OPCLK_EXTI);
146     return FL_PASS;
147 }
148 
149 /**
150   * @brief  设置 EXTI_CommonInitStruct 为默认配置
151   * @param  EXTI_CommonInitStruct 指向需要将值设置为默认配置的结构体 @ref FL_EXTI_CommonInitTypeDef 结构体
152   *
153   * @retval None
154   */
FL_EXTI_CommonStructInit(FL_EXTI_CommonInitTypeDef * EXTI_CommonInitStruct)155 void FL_EXTI_CommonStructInit(FL_EXTI_CommonInitTypeDef *EXTI_CommonInitStruct)
156 {
157     EXTI_CommonInitStruct->clockSource = FL_RCC_EXTI_CLK_SOURCE_LSCLK;
158 }
159 
160 /**
161   * @brief  EXTI配置设置
162   *
163   * @param  extiLineX 外设入口地址
164   * @param  EXTI_InitStruct 指向 @ref FL_EXTI_InitTypeDef 类型的结构体,它包含EXTI外设配置信息
165   *
166   * @retval ErrorStatus枚举值
167   *         -FL_FAIL 配置过程发生错误
168   *         -FL_PASS EXTI配置成功
169   */
FL_EXTI_Init(uint32_t extiLineX,FL_EXTI_InitTypeDef * EXTI_InitStruct)170 FL_ErrorStatus FL_EXTI_Init(uint32_t extiLineX, FL_EXTI_InitTypeDef *EXTI_InitStruct)
171 {
172     uint8_t extiLineId;
173     uint32_t tmpExtiLineX;
174     /* 检查参数合法性 */
175     assert_param(IS_EXTI_ALL_INSTANCE(extiLineX));
176     assert_param(IS_EXTI_INPUT_GROUP(EXTI_InitStruct->input));
177     assert_param(IS_EXTI_TRIG_EDGE(EXTI_InitStruct->triggerEdge));
178     assert_param(IS_EXTI_FILTER(EXTI_InitStruct->filter));
179     /* 获取EXTI中断线对应id号 */
180     tmpExtiLineX = extiLineX;
181     for(extiLineId = 0; tmpExtiLineX != FL_GPIO_EXTI_LINE_0; tmpExtiLineX >>= 1, extiLineId++);
182     /* 设置中断线连接的IO */
183     setExtiLineFuncs[extiLineId](GPIO, EXTI_InitStruct->input << (2 * extiLineId));
184     /* 设置数字滤波 */
185     EXTI_InitStruct->filter == FL_ENABLE ? FL_GPIO_EnableDigitalFilter(GPIO, extiLineX) : FL_GPIO_DisableDigitalFilter(GPIO, extiLineX);
186     /* 设置中断线触发边沿 */
187     setTrigEdgeFuncs[extiLineId / 16](GPIO, extiLineX, EXTI_InitStruct->triggerEdge);
188     /* 延时需要大于3个32K的周期 */
189         for(uint16_t i=0; i<1000; ++i)
190         {
191             __NOP();
192         }
193     /* 清除外部中断标志 */
194     FL_GPIO_ClearFlag_EXTI(GPIO, extiLineX);
195     /* 清除中断挂起 */
196     NVIC_ClearPendingIRQ(GPIO_IRQn);
197     return FL_PASS;
198 }
199 
200 /**
201   * @brief  复位EXTI配置设置
202   *
203   * @retval ErrorStatus枚举值
204   *         -FL_FAIL 发生错误
205   *         -FL_PASS EXTI设置复位成功
206   */
FL_EXTI_DeInit(uint32_t extiLineX)207 FL_ErrorStatus FL_EXTI_DeInit(uint32_t extiLineX)
208 {
209     uint8_t extiLineId;
210     uint32_t tmpExtiLineX;
211     /* 检查参数合法性 */
212     assert_param(IS_EXTI_ALL_INSTANCE(extiLineX));
213     /* 获取EXTI中断线对应id号 */
214     tmpExtiLineX = extiLineX;
215     for(extiLineId = 0; tmpExtiLineX != FL_GPIO_EXTI_LINE_0; tmpExtiLineX >>= 1, extiLineId++);
216     /* 清除外部中断标志 */
217     FL_GPIO_ClearFlag_EXTI(GPIO, extiLineX);
218     /* 中断线触发边沿禁止 */
219     setTrigEdgeFuncs[extiLineId / 16](GPIO, extiLineX, FL_GPIO_EXTI_TRIGGER_EDGE_DISABLE);
220     /* 禁止数字滤波 */
221     FL_GPIO_DisableDigitalFilter(GPIO, extiLineX);
222     return FL_PASS;
223 }
224 
225 /**
226   * @brief  设置 EXTI_InitStruct 为默认配置
227   * @param  EXTI_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_EXTI_InitTypeDef 结构体
228   *
229   * @retval None
230   */
FL_EXTI_StructInit(FL_EXTI_InitTypeDef * EXTI_InitStruct)231 void FL_EXTI_StructInit(FL_EXTI_InitTypeDef *EXTI_InitStruct)
232 {
233     EXTI_InitStruct->filter = FL_DISABLE;
234     EXTI_InitStruct->input = FL_GPIO_EXTI_INPUT_GROUP0;
235     EXTI_InitStruct->triggerEdge = FL_GPIO_EXTI_TRIGGER_EDGE_RISING;
236 }
237 
238 /**
239   * @}
240   */
241 
242 #endif /* FL_EXTI_DRIVER_ENABLED */
243 
244 /**
245   * @}
246   */
247 
248 /**
249   * @}
250   */
251 
252 /********************** (C) COPYRIGHT Fudan Microelectronics **** END OF FILE ***********************/
253