aboutsummaryrefslogtreecommitdiff
path: root/lib/chibios/os/hal/ports/STM32/LLD/EXTIv1/stm32_exti.c
diff options
context:
space:
mode:
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.c218
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 */
64void 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 */
119void 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 */
174void 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 */
199void 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/** @} */