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