1 /*!
2 * @file apm32f4xx_eint.c
3 *
4 * @brief This file provides all the EINT firmware functions
5 *
6 * @version V1.0.2
7 *
8 * @date 2022-06-23
9 *
10 * @attention
11 *
12 * Copyright (C) 2021-2022 Geehy Semiconductor
13 *
14 * You may not use this file except in compliance with the
15 * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE).
16 *
17 * The program is only for reference, which is distributed in the hope
18 * that it will be usefull and instructional for customers to develop
19 * their software. Unless required by applicable law or agreed to in
20 * writing, the program is distributed on an "AS IS" BASIS, WITHOUT
21 * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied.
22 * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions
23 * and limitations under the License.
24 */
25
26 #include "apm32f4xx_eint.h"
27
28 /** @addtogroup APM32F4xx_StdPeriphDriver
29 @{
30 */
31
32 /** @defgroup EINT_Driver
33 * @brief EINT driver modules
34 @{
35 */
36
37 /** @defgroup EINT_Functions
38 @{
39 */
40
41 /*!
42 * @brief Reset the EINT peripheral registers to their default reset values.
43 *
44 * @param None
45 *
46 * @retval None
47 */
EINT_Reset(void)48 void EINT_Reset(void)
49 {
50 EINT->IMASK = 0x00000000;
51 EINT->EMASK = 0x00000000;
52 EINT->RTEN = 0x00000000;
53 EINT->FTEN = 0x00000000;
54 EINT->IPEND = 0x007FFFFF;
55 }
56
57 /*!
58 * @brief Configure the EINT
59 *
60 * @param eintConfig: pointer to a EINT_Config_T structure.
61 *
62 * @retval None
63 */
EINT_Config(EINT_Config_T * eintConfig)64 void EINT_Config(EINT_Config_T *eintConfig)
65 {
66 uint32_t temp = 0;
67 temp = (uint32_t)EINT_BASE;
68
69 if (eintConfig->lineCmd != DISABLE)
70 {
71 EINT->IMASK &= ~eintConfig->line;
72 EINT->EMASK &= ~eintConfig->line;
73
74 temp += eintConfig->mode;
75 *(__IOM uint32_t *) temp |= eintConfig->line;
76
77 EINT->RTEN &= ~eintConfig->line;
78 EINT->FTEN &= ~eintConfig->line;
79
80 if (eintConfig->trigger == EINT_TRIGGER_RISING_FALLING)
81 {
82 EINT->RTEN |= eintConfig->line;
83 EINT->FTEN |= eintConfig->line;
84 }
85 else
86 {
87 temp = (uint32_t)EINT_BASE;
88 temp += eintConfig->trigger;
89 *(__IOM uint32_t *) temp |= eintConfig->line;
90 }
91 }
92 else
93 {
94 temp += eintConfig->mode;
95 *(__IOM uint32_t *) temp &= ~eintConfig->line;
96 }
97 }
98
99 /*!
100 * @brief Fills each EINT_Config_T member with its reset value.
101 *
102 * @param eintConfig: pointer to a EINT_Config_T structure
103 *
104 * @retval None
105 */
EINT_ConfigStructInit(EINT_Config_T * eintConfig)106 void EINT_ConfigStructInit(EINT_Config_T *eintConfig)
107 {
108 eintConfig->line = EINT_LINENONE;
109 eintConfig->mode = EINT_MODE_INTERRUPT;
110 eintConfig->trigger = EINT_TRIGGER_FALLING;
111 eintConfig->lineCmd = DISABLE;
112 }
113
114 /*!
115 * @brief Select Software interrupt on EINT line
116 *
117 * @param line: specifies the EINT lines.
118 * This parameter can be any combination of EINT_LINE_T(can be from 0 to 22)
119 * @arg EINT_LINENONE : No interrupt selected
120 * @arg EINT_LINE_0 : External interrupt line 0
121 * @arg EINT_LINE_1 : External interrupt line 1
122 * @arg EINT_LINE_2 : External interrupt line 2
123 * @arg EINT_LINE_3 : External interrupt line 3
124 * @arg EINT_LINE_4 : External interrupt line 4
125 * @arg EINT_LINE_5 : External interrupt line 5
126 * @arg EINT_LINE_6 : External interrupt line 6
127 * @arg EINT_LINE_7 : External interrupt line 7
128 * @arg EINT_LINE_8 : External interrupt line 8
129 * @arg EINT_LINE_9 : External interrupt line 9
130 * @arg EINT_LINE_10 : External interrupt line 10
131 * @arg EINT_LINE_11 : External interrupt line 11
132 * @arg EINT_LINE_12 : External interrupt line 12
133 * @arg EINT_LINE_13 : External interrupt line 13
134 * @arg EINT_LINE_14 : External interrupt line 14
135 * @arg EINT_LINE_15 : External interrupt line 15
136 * @arg EINT_LINE_16 : External interrupt line 16
137 * @arg EINT_LINE_17 : External interrupt line 17
138 * @arg EINT_LINE_18 : External interrupt line 18
139 * @arg EINT_LINE_19 : External interrupt line 19
140 * @arg EINT_LINE_20 : External interrupt line 20
141 * @arg EINT_LINE_21 : External interrupt line 21
142 * @arg EINT_LINE_22 : External interrupt line 22
143 *
144 * @retval None
145 */
EINT_SelectSWInterrupt(uint32_t line)146 void EINT_SelectSWInterrupt(uint32_t line)
147 {
148 EINT->SWINTE |= line;
149 }
150
151 /*!
152 * @brief Read the specified EINT_Line flag
153 *
154 * @param line: Select the EINT_Line.
155 * This parameter can be one of EINT_LINE_T(can be from 0 to 22)
156 * @arg EINT_LINENONE : No interrupt selected
157 * @arg EINT_LINE_0 : External interrupt line 0
158 * @arg EINT_LINE_1 : External interrupt line 1
159 * @arg EINT_LINE_2 : External interrupt line 2
160 * @arg EINT_LINE_3 : External interrupt line 3
161 * @arg EINT_LINE_4 : External interrupt line 4
162 * @arg EINT_LINE_5 : External interrupt line 5
163 * @arg EINT_LINE_6 : External interrupt line 6
164 * @arg EINT_LINE_7 : External interrupt line 7
165 * @arg EINT_LINE_8 : External interrupt line 8
166 * @arg EINT_LINE_9 : External interrupt line 9
167 * @arg EINT_LINE_10 : External interrupt line 10
168 * @arg EINT_LINE_11 : External interrupt line 11
169 * @arg EINT_LINE_12 : External interrupt line 12
170 * @arg EINT_LINE_13 : External interrupt line 13
171 * @arg EINT_LINE_14 : External interrupt line 14
172 * @arg EINT_LINE_15 : External interrupt line 15
173 * @arg EINT_LINE_16 : External interrupt line 16
174 * @arg EINT_LINE_17 : External interrupt line 17
175 * @arg EINT_LINE_18 : External interrupt line 18
176 * @arg EINT_LINE_19 : External interrupt line 19
177 * @arg EINT_LINE_20 : External interrupt line 20
178 * @arg EINT_LINE_21 : External interrupt line 21
179 * @arg EINT_LINE_22 : External interrupt line 22
180 *
181 * @retval status: SET or RESET
182 */
EINT_ReadStatusFlag(EINT_LINE_T line)183 uint8_t EINT_ReadStatusFlag(EINT_LINE_T line)
184 {
185 uint8_t status = RESET;
186
187 if ((EINT->IPEND & line) != (uint32_t)RESET)
188 {
189 status = SET;
190 }
191 else
192 {
193 status = RESET;
194 }
195 return status;
196 }
197
198 /*!
199 * @brief Clears the EINT_Line pending bits
200 *
201 * @param line: Select the EINT_Line.
202 * This parameter can be any combination of EINT_LINE_T(can be from 0 to 22)
203 * @arg EINT_LINENONE : No interrupt selected
204 * @arg EINT_LINE_0 : External interrupt line 0
205 * @arg EINT_LINE_1 : External interrupt line 1
206 * @arg EINT_LINE_2 : External interrupt line 2
207 * @arg EINT_LINE_3 : External interrupt line 3
208 * @arg EINT_LINE_4 : External interrupt line 4
209 * @arg EINT_LINE_5 : External interrupt line 5
210 * @arg EINT_LINE_6 : External interrupt line 6
211 * @arg EINT_LINE_7 : External interrupt line 7
212 * @arg EINT_LINE_8 : External interrupt line 8
213 * @arg EINT_LINE_9 : External interrupt line 9
214 * @arg EINT_LINE_10 : External interrupt line 10
215 * @arg EINT_LINE_11 : External interrupt line 11
216 * @arg EINT_LINE_12 : External interrupt line 12
217 * @arg EINT_LINE_13 : External interrupt line 13
218 * @arg EINT_LINE_14 : External interrupt line 14
219 * @arg EINT_LINE_15 : External interrupt line 15
220 * @arg EINT_LINE_16 : External interrupt line 16
221 * @arg EINT_LINE_17 : External interrupt line 17
222 * @arg EINT_LINE_18 : External interrupt line 18
223 * @arg EINT_LINE_19 : External interrupt line 19
224 * @arg EINT_LINE_20 : External interrupt line 20
225 * @arg EINT_LINE_21 : External interrupt line 21
226 * @arg EINT_LINE_22 : External interrupt line 22
227 *
228 * @retval None
229 */
EINT_ClearStatusFlag(uint32_t line)230 void EINT_ClearStatusFlag(uint32_t line)
231 {
232 EINT->IPEND = line;
233 }
234
235 /*!
236 * @brief Read the specified EINT_Line Interrupt Flag.
237 *
238 * @param line: Select the EINT_Line.
239 * This parameter can be one of EINT_LINE_T(can be from 0 to 22)
240 * @arg EINT_LINENONE : No interrupt selected
241 * @arg EINT_LINE_0 : External interrupt line 0
242 * @arg EINT_LINE_1 : External interrupt line 1
243 * @arg EINT_LINE_2 : External interrupt line 2
244 * @arg EINT_LINE_3 : External interrupt line 3
245 * @arg EINT_LINE_4 : External interrupt line 4
246 * @arg EINT_LINE_5 : External interrupt line 5
247 * @arg EINT_LINE_6 : External interrupt line 6
248 * @arg EINT_LINE_7 : External interrupt line 7
249 * @arg EINT_LINE_8 : External interrupt line 8
250 * @arg EINT_LINE_9 : External interrupt line 9
251 * @arg EINT_LINE_10 : External interrupt line 10
252 * @arg EINT_LINE_11 : External interrupt line 11
253 * @arg EINT_LINE_12 : External interrupt line 12
254 * @arg EINT_LINE_13 : External interrupt line 13
255 * @arg EINT_LINE_14 : External interrupt line 14
256 * @arg EINT_LINE_15 : External interrupt line 15
257 * @arg EINT_LINE_16 : External interrupt line 16
258 * @arg EINT_LINE_17 : External interrupt line 17
259 * @arg EINT_LINE_18 : External interrupt line 18
260 * @arg EINT_LINE_19 : External interrupt line 19
261 * @arg EINT_LINE_20 : External interrupt line 20
262 * @arg EINT_LINE_21 : External interrupt line 21
263 * @arg EINT_LINE_22 : External interrupt line 22
264 *
265 * @retval status: SET or RESET
266 */
EINT_ReadIntFlag(EINT_LINE_T line)267 uint8_t EINT_ReadIntFlag(EINT_LINE_T line)
268 {
269 uint8_t status = RESET;
270 uint32_t enablestatus = 0;
271
272 enablestatus = EINT->IMASK & line;
273
274 if ((EINT->IPEND & line) != ((uint32_t)RESET) && (enablestatus != (uint32_t)RESET))
275 {
276 status = SET;
277 }
278 else
279 {
280 status = RESET;
281 }
282 return status;
283 }
284
285 /*!
286 * @brief Clears the EINT_Line pending bits
287 *
288 * @param line: Select the EINT_Line
289 * This parameter can be any combination of EINT_LINE_T(can be from 0 to 22)
290 * @arg EINT_LINENONE : No interrupt selected
291 * @arg EINT_LINE_0 : External interrupt line 0
292 * @arg EINT_LINE_1 : External interrupt line 1
293 * @arg EINT_LINE_2 : External interrupt line 2
294 * @arg EINT_LINE_3 : External interrupt line 3
295 * @arg EINT_LINE_4 : External interrupt line 4
296 * @arg EINT_LINE_5 : External interrupt line 5
297 * @arg EINT_LINE_6 : External interrupt line 6
298 * @arg EINT_LINE_7 : External interrupt line 7
299 * @arg EINT_LINE_8 : External interrupt line 8
300 * @arg EINT_LINE_9 : External interrupt line 9
301 * @arg EINT_LINE_10 : External interrupt line 10
302 * @arg EINT_LINE_11 : External interrupt line 11
303 * @arg EINT_LINE_12 : External interrupt line 12
304 * @arg EINT_LINE_13 : External interrupt line 13
305 * @arg EINT_LINE_14 : External interrupt line 14
306 * @arg EINT_LINE_15 : External interrupt line 15
307 * @arg EINT_LINE_16 : External interrupt line 16
308 * @arg EINT_LINE_17 : External interrupt line 17
309 * @arg EINT_LINE_18 : External interrupt line 18
310 * @arg EINT_LINE_19 : External interrupt line 19
311 * @arg EINT_LINE_20 : External interrupt line 20
312 * @arg EINT_LINE_21 : External interrupt line 21
313 * @arg EINT_LINE_22 : External interrupt line 22
314 *
315 * @retval None
316 */
EINT_ClearIntFlag(uint32_t line)317 void EINT_ClearIntFlag(uint32_t line)
318 {
319 EINT->IPEND = line;
320 }
321
322 /**@} end of group EINT_Functions */
323 /**@} end of group EINT_Driver */
324 /**@} end of group APM32F4xx_StdPeriphDriver */
325