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