diff options
Diffstat (limited to 'lib/chibios/os/hal/ports/STM32/LLD/EXTIv1/stm32_exti.c')
-rw-r--r-- | lib/chibios/os/hal/ports/STM32/LLD/EXTIv1/stm32_exti.c | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/lib/chibios/os/hal/ports/STM32/LLD/EXTIv1/stm32_exti.c b/lib/chibios/os/hal/ports/STM32/LLD/EXTIv1/stm32_exti.c new file mode 100644 index 000000000..79a01ebef --- /dev/null +++ b/lib/chibios/os/hal/ports/STM32/LLD/EXTIv1/stm32_exti.c | |||
@@ -0,0 +1,218 @@ | |||
1 | /* | ||
2 | ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio | ||
3 | |||
4 | Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | you may not use this file except in compliance with the License. | ||
6 | You may obtain a copy of the License at | ||
7 | |||
8 | http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | |||
10 | Unless required by applicable law or agreed to in writing, software | ||
11 | distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | See the License for the specific language governing permissions and | ||
14 | limitations under the License. | ||
15 | */ | ||
16 | |||
17 | /** | ||
18 | * @file EXTIv1/stm32_exti.c | ||
19 | * @brief EXTI helper driver code. | ||
20 | * | ||
21 | * @addtogroup STM32_EXTI | ||
22 | * @details EXTI sharing helper driver. | ||
23 | * @{ | ||
24 | */ | ||
25 | |||
26 | #include "hal.h" | ||
27 | |||
28 | /* The following macro is only defined if some driver requiring EXTI services | ||
29 | has been enabled.*/ | ||
30 | #if defined(STM32_EXTI_REQUIRED) || defined(__DOXYGEN__) | ||
31 | |||
32 | /*===========================================================================*/ | ||
33 | /* Driver local definitions. */ | ||
34 | /*===========================================================================*/ | ||
35 | |||
36 | /*===========================================================================*/ | ||
37 | /* Driver exported variables. */ | ||
38 | /*===========================================================================*/ | ||
39 | |||
40 | /*===========================================================================*/ | ||
41 | /* Driver local variables and types. */ | ||
42 | /*===========================================================================*/ | ||
43 | |||
44 | /*===========================================================================*/ | ||
45 | /* Driver local functions. */ | ||
46 | /*===========================================================================*/ | ||
47 | |||
48 | /*===========================================================================*/ | ||
49 | /* Driver interrupt handlers. */ | ||
50 | /*===========================================================================*/ | ||
51 | |||
52 | /*===========================================================================*/ | ||
53 | /* Driver exported functions. */ | ||
54 | /*===========================================================================*/ | ||
55 | |||
56 | /** | ||
57 | * @brief STM32 EXTI group 1 lines initialization. | ||
58 | * | ||
59 | * @param[in] mask mask of group 1 lines to be initialized | ||
60 | * @param[in] mode initialization mode | ||
61 | * | ||
62 | * @api | ||
63 | */ | ||
64 | void extiEnableGroup1(uint32_t mask, extimode_t mode) { | ||
65 | uint32_t cmask; | ||
66 | |||
67 | /* Mask including only configurable lines.*/ | ||
68 | cmask = mask & ~STM32_EXTI_IMR1_MASK; | ||
69 | |||
70 | if ((mode & EXTI_MODE_EDGES_MASK) == 0U) { | ||
71 | /* Disabling channels.*/ | ||
72 | EXTI->IMR1 &= ~mask; | ||
73 | EXTI->EMR1 &= ~mask; | ||
74 | EXTI->RTSR1 &= ~cmask; | ||
75 | EXTI->FTSR1 &= ~cmask; | ||
76 | #if STM32_EXTI_SEPARATE_RF == FALSE | ||
77 | EXTI->PR1 = cmask; | ||
78 | #else | ||
79 | EXTI->RPR1 = cmask; | ||
80 | EXTI->FPR1 = cmask; | ||
81 | #endif | ||
82 | } | ||
83 | else { | ||
84 | /* Programming edge registers.*/ | ||
85 | if (mode & EXTI_MODE_RISING_EDGE) { | ||
86 | EXTI->RTSR1 |= cmask; | ||
87 | } | ||
88 | else { | ||
89 | EXTI->RTSR1 &= ~cmask; | ||
90 | } | ||
91 | if (mode & EXTI_MODE_FALLING_EDGE) { | ||
92 | EXTI->FTSR1 |= cmask; | ||
93 | } | ||
94 | else { | ||
95 | EXTI->FTSR1 &= ~cmask; | ||
96 | } | ||
97 | |||
98 | /* Programming interrupt and event registers.*/ | ||
99 | if ((mode & EXTI_MODE_ACTION_MASK) == EXTI_MODE_ACTION_INTERRUPT) { | ||
100 | EXTI->IMR1 |= mask; | ||
101 | EXTI->EMR1 &= ~mask; | ||
102 | } | ||
103 | else { | ||
104 | EXTI->EMR1 |= mask; | ||
105 | EXTI->IMR1 &= ~mask; | ||
106 | } | ||
107 | } | ||
108 | } | ||
109 | |||
110 | #if (STM32_EXTI_HAS_GROUP2 == TRUE) || defined(__DOXYGEN__) | ||
111 | /** | ||
112 | * @brief STM32 EXTI group 2 lines initialization. | ||
113 | * | ||
114 | * @param[in] mask mask of group 2 lines to be initialized | ||
115 | * @param[in] mode initialization mode | ||
116 | * | ||
117 | * @api | ||
118 | */ | ||
119 | void extiEnableGroup2(uint32_t mask, extimode_t mode) { | ||
120 | uint32_t cmask; | ||
121 | |||
122 | /* Mask including only configurable lines.*/ | ||
123 | cmask = mask & ~STM32_EXTI_IMR2_MASK; | ||
124 | |||
125 | if ((mode & EXTI_MODE_EDGES_MASK) == 0U) { | ||
126 | /* Disabling channels.*/ | ||
127 | EXTI->IMR2 &= ~mask; | ||
128 | EXTI->EMR2 &= ~mask; | ||
129 | EXTI->RTSR2 &= ~cmask; | ||
130 | EXTI->FTSR2 &= ~cmask; | ||
131 | #if STM32_EXTI_SEPARATE_RF == FALSE | ||
132 | EXTI->PR2 = cmask; | ||
133 | #else | ||
134 | EXTI->RPR2 = cmask; | ||
135 | EXTI->FPR2 = cmask; | ||
136 | #endif | ||
137 | } | ||
138 | else { | ||
139 | /* Programming edge registers.*/ | ||
140 | if (mode & EXTI_MODE_RISING_EDGE) { | ||
141 | EXTI->RTSR2 |= cmask; | ||
142 | } | ||
143 | else { | ||
144 | EXTI->RTSR2 &= ~cmask; | ||
145 | } | ||
146 | if (mode & EXTI_MODE_FALLING_EDGE) { | ||
147 | EXTI->FTSR2 |= cmask; | ||
148 | } | ||
149 | else { | ||
150 | EXTI->FTSR2 &= ~cmask; | ||
151 | } | ||
152 | |||
153 | /* Programming interrupt and event registers.*/ | ||
154 | if ((mode & EXTI_MODE_ACTION_MASK) == EXTI_MODE_ACTION_INTERRUPT) { | ||
155 | EXTI->IMR2 |= mask; | ||
156 | EXTI->EMR2 &= ~mask; | ||
157 | } | ||
158 | else { | ||
159 | EXTI->EMR2 |= mask; | ||
160 | EXTI->IMR2 &= ~mask; | ||
161 | } | ||
162 | } | ||
163 | } | ||
164 | #endif /* STM32_EXTI_HAS_GROUP2 == TRUE */ | ||
165 | |||
166 | /** | ||
167 | * @brief STM32 EXTI line initialization. | ||
168 | * | ||
169 | * @param[in] line line to be initialized | ||
170 | * @param[in] mode initialization mode | ||
171 | * | ||
172 | * @api | ||
173 | */ | ||
174 | void extiEnableLine(extiline_t line, extimode_t mode) { | ||
175 | uint32_t mask = (1U << (line & 0x1FU)); | ||
176 | |||
177 | osalDbgCheck(line < STM32_EXTI_NUM_LINES); | ||
178 | osalDbgCheck((mode & ~EXTI_MODE_MASK) == 0U); | ||
179 | |||
180 | #if STM32_EXTI_HAS_GROUP2 == TRUE | ||
181 | if (line < 32) { | ||
182 | #endif | ||
183 | extiEnableGroup1(mask, mode); | ||
184 | #if STM32_EXTI_HAS_GROUP2 == TRUE | ||
185 | } | ||
186 | else { | ||
187 | extiEnableGroup2(mask, mode); | ||
188 | } | ||
189 | #endif | ||
190 | } | ||
191 | |||
192 | /** | ||
193 | * @brief STM32 EXTI line IRQ status clearing. | ||
194 | * | ||
195 | * @param[in] line line to be initialized | ||
196 | * | ||
197 | * @api | ||
198 | */ | ||
199 | void extiClearLine(extiline_t line) { | ||
200 | uint32_t mask = (1U << (line & 0x1FU)); | ||
201 | |||
202 | osalDbgCheck(line < STM32_EXTI_NUM_LINES); | ||
203 | |||
204 | #if STM32_EXTI_HAS_GROUP2 == TRUE | ||
205 | if (line < 32) { | ||
206 | #endif | ||
207 | extiClearGroup1(mask); | ||
208 | #if STM32_EXTI_HAS_GROUP2 == TRUE | ||
209 | } | ||
210 | else { | ||
211 | extiClearGroup2(mask); | ||
212 | } | ||
213 | #endif | ||
214 | } | ||
215 | |||
216 | #endif /* STM32_EXTI_REQUIRED */ | ||
217 | |||
218 | /** @} */ | ||