1 /**
2 ******************************************************************************
3 * @file stm32mp1xx_ll_cortex.h
4 * @author MCD Application Team
5 * @brief Header file of CORTEX LL module.
6 ******************************************************************************
7 * @attention
8 *
9 * Copyright (c) 2019 STMicroelectronics.
10 * All rights reserved.
11 *
12 * This software is licensed under terms that can be found in the LICENSE file
13 * in the root directory of this software component.
14 * If no LICENSE file comes with this software, it is provided AS-IS.
15 *
16 ******************************************************************************
17 @verbatim
18 ==============================================================================
19 ##### How to use this driver #####
20 ==============================================================================
21 [..]
22 The LL CORTEX driver contains a set of generic APIs that can be
23 used by user:
24 (+) SYSTICK configuration used by @ref LL_mDelay and @ref LL_Init1msTick
25 functions
26 (+) Low power mode configuration (SCB register of Cortex-MCU)
27 (+) API to access to MCU info (CPUID register)
28
29 @endverbatim
30 ******************************************************************************
31 */
32
33 /* Define to prevent recursive inclusion -------------------------------------*/
34 #ifndef __STM32MP1xx_LL_CORTEX_H
35 #define __STM32MP1xx_LL_CORTEX_H
36
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40
41 /* Includes ------------------------------------------------------------------*/
42 #include "stm32mp1xx.h"
43
44 /** @addtogroup STM32MP1xx_LL_Driver
45 * @{
46 */
47
48 /** @defgroup CORTEX_LL CORTEX
49 * @{
50 */
51
52 /* Private types -------------------------------------------------------------*/
53 /* Private variables ---------------------------------------------------------*/
54
55 /* Private constants ---------------------------------------------------------*/
56
57 /* Private macros ------------------------------------------------------------*/
58
59 /* Exported types ------------------------------------------------------------*/
60 /* Exported constants --------------------------------------------------------*/
61 /** @defgroup CORTEX_LL_Exported_Constants CORTEX Exported Constants
62 * @{
63 */
64
65 /** @defgroup CORTEX_LL_EC_CLKSOURCE_HCLK SYSTICK Clock Source
66 * @{
67 */
68 #define LL_SYSTICK_CLKSOURCE_HCLK_DIV8 0x00000000U /*!< AHB clock divided by 8 selected as SysTick clock source.*/
69 #define LL_SYSTICK_CLKSOURCE_HCLK SysTick_CTRL_CLKSOURCE_Msk /*!< AHB clock selected as SysTick clock source. */
70 /**
71 * @}
72 */
73
74 /**
75 * @}
76 */
77
78 /* Exported macro ------------------------------------------------------------*/
79
80 /* Exported functions --------------------------------------------------------*/
81 /** @defgroup CORTEX_LL_Exported_Functions CORTEX Exported Functions
82 * @{
83 */
84
85 /** @defgroup CORTEX_LL_EF_SYSTICK SYSTICK
86 * @{
87 */
88
89 /**
90 * @brief This function checks if the Systick counter flag is active or not.
91 * @note It can be used in timeout function on application side.
92 * @rmtoll STK_CTRL COUNTFLAG LL_SYSTICK_IsActiveCounterFlag
93 * @retval State of bit (1 or 0).
94 */
LL_SYSTICK_IsActiveCounterFlag(void)95 __STATIC_INLINE uint32_t LL_SYSTICK_IsActiveCounterFlag(void)
96 {
97 return ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == (SysTick_CTRL_COUNTFLAG_Msk));
98 }
99
100 /**
101 * @brief Configures the SysTick clock source
102 * @rmtoll STK_CTRL CLKSOURCE LL_SYSTICK_SetClkSource
103 * @param Source This parameter can be one of the following values:
104 * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK_DIV8
105 * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK
106 * @retval None
107 */
LL_SYSTICK_SetClkSource(uint32_t Source)108 __STATIC_INLINE void LL_SYSTICK_SetClkSource(uint32_t Source)
109 {
110 if (Source == LL_SYSTICK_CLKSOURCE_HCLK)
111 {
112 SET_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK);
113 }
114 else
115 {
116 CLEAR_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK);
117 }
118 }
119
120 /**
121 * @brief Get the SysTick clock source
122 * @rmtoll STK_CTRL CLKSOURCE LL_SYSTICK_GetClkSource
123 * @retval Returned value can be one of the following values:
124 * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK_DIV8
125 * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK
126 */
LL_SYSTICK_GetClkSource(void)127 __STATIC_INLINE uint32_t LL_SYSTICK_GetClkSource(void)
128 {
129 return READ_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK);
130 }
131
132 /**
133 * @brief Enable SysTick exception request
134 * @rmtoll STK_CTRL TICKINT LL_SYSTICK_EnableIT
135 * @retval None
136 */
LL_SYSTICK_EnableIT(void)137 __STATIC_INLINE void LL_SYSTICK_EnableIT(void)
138 {
139 SET_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk);
140 }
141
142 /**
143 * @brief Disable SysTick exception request
144 * @rmtoll STK_CTRL TICKINT LL_SYSTICK_DisableIT
145 * @retval None
146 */
LL_SYSTICK_DisableIT(void)147 __STATIC_INLINE void LL_SYSTICK_DisableIT(void)
148 {
149 CLEAR_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk);
150 }
151
152 /**
153 * @brief Checks if the SYSTICK interrupt is enabled or disabled.
154 * @rmtoll STK_CTRL TICKINT LL_SYSTICK_IsEnabledIT
155 * @retval State of bit (1 or 0).
156 */
LL_SYSTICK_IsEnabledIT(void)157 __STATIC_INLINE uint32_t LL_SYSTICK_IsEnabledIT(void)
158 {
159 return (READ_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk) == (SysTick_CTRL_TICKINT_Msk));
160 }
161
162 /**
163 * @}
164 */
165
166 /** @defgroup CORTEX_LL_EF_LOW_POWER_MODE LOW POWER MODE
167 * @{
168 */
169
170 /**
171 * @brief Processor uses sleep as its low power mode
172 * @rmtoll SCB_SCR SLEEPDEEP LL_LPM_EnableSleep
173 * @retval None
174 */
LL_LPM_EnableSleep(void)175 __STATIC_INLINE void LL_LPM_EnableSleep(void)
176 {
177 /* Clear SLEEPDEEP bit of Cortex System Control Register */
178 CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk));
179 }
180
181 /**
182 * @brief Processor uses deep sleep as its low power mode
183 * @rmtoll SCB_SCR SLEEPDEEP LL_LPM_EnableDeepSleep
184 * @retval None
185 */
LL_LPM_EnableDeepSleep(void)186 __STATIC_INLINE void LL_LPM_EnableDeepSleep(void)
187 {
188 /* Set SLEEPDEEP bit of Cortex System Control Register */
189 SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk));
190 }
191
192 /**
193 * @brief Configures sleep-on-exit when returning from Handler mode to Thread mode.
194 * @note Setting this bit to 1 enables an interrupt-driven application to avoid returning to an
195 * empty main application.
196 * @rmtoll SCB_SCR SLEEPONEXIT LL_LPM_EnableSleepOnExit
197 * @retval None
198 */
LL_LPM_EnableSleepOnExit(void)199 __STATIC_INLINE void LL_LPM_EnableSleepOnExit(void)
200 {
201 /* Set SLEEPONEXIT bit of Cortex System Control Register */
202 SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk));
203 }
204
205 /**
206 * @brief Do not sleep when returning to Thread mode.
207 * @rmtoll SCB_SCR SLEEPONEXIT LL_LPM_DisableSleepOnExit
208 * @retval None
209 */
LL_LPM_DisableSleepOnExit(void)210 __STATIC_INLINE void LL_LPM_DisableSleepOnExit(void)
211 {
212 /* Clear SLEEPONEXIT bit of Cortex System Control Register */
213 CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk));
214 }
215
216 /**
217 * @brief Enabled events and all interrupts, including disabled interrupts, can wakeup the
218 * processor.
219 * @rmtoll SCB_SCR SEVEONPEND LL_LPM_EnableEventOnPend
220 * @retval None
221 */
LL_LPM_EnableEventOnPend(void)222 __STATIC_INLINE void LL_LPM_EnableEventOnPend(void)
223 {
224 /* Set SEVEONPEND bit of Cortex System Control Register */
225 SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk));
226 }
227
228 /**
229 * @brief Only enabled interrupts or events can wakeup the processor, disabled interrupts are
230 * excluded
231 * @rmtoll SCB_SCR SEVEONPEND LL_LPM_DisableEventOnPend
232 * @retval None
233 */
LL_LPM_DisableEventOnPend(void)234 __STATIC_INLINE void LL_LPM_DisableEventOnPend(void)
235 {
236 /* Clear SEVEONPEND bit of Cortex System Control Register */
237 CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk));
238 }
239
240 /**
241 * @}
242 */
243
244 /** @defgroup CORTEX_LL_EF_MCU_INFO MCU INFO
245 * @{
246 */
247
248 /**
249 * @brief Get Implementer code
250 * @rmtoll SCB_CPUID IMPLEMENTER LL_CPUID_GetImplementer
251 * @retval Value should be equal to 0x41 for ARM
252 */
LL_CPUID_GetImplementer(void)253 __STATIC_INLINE uint32_t LL_CPUID_GetImplementer(void)
254 {
255 return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_IMPLEMENTER_Msk) >> SCB_CPUID_IMPLEMENTER_Pos);
256 }
257
258 /**
259 * @brief Get Variant number (The r value in the rnpn product revision identifier)
260 * @rmtoll SCB_CPUID VARIANT LL_CPUID_GetVariant
261 * @retval Value between 0 and 255 (0x0: revision 0)
262 */
LL_CPUID_GetVariant(void)263 __STATIC_INLINE uint32_t LL_CPUID_GetVariant(void)
264 {
265 return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_VARIANT_Msk) >> SCB_CPUID_VARIANT_Pos);
266 }
267
268 /**
269 * @brief Get Architecture number
270 * @rmtoll SCB_CPUID ARCHITECTURE LL_CPUID_GetArchitecture
271 * @retval Value should be equal to 0xC for Cortex-M0 devices
272 */
LL_CPUID_GetArchitecture(void)273 __STATIC_INLINE uint32_t LL_CPUID_GetArchitecture(void)
274 {
275 return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_ARCHITECTURE_Msk) >> SCB_CPUID_ARCHITECTURE_Pos);
276 }
277
278 /**
279 * @brief Get Part number
280 * @rmtoll SCB_CPUID PARTNO LL_CPUID_GetParNo
281 * @retval Value should be equal to 0xC20 for Cortex-M0
282 */
LL_CPUID_GetParNo(void)283 __STATIC_INLINE uint32_t LL_CPUID_GetParNo(void)
284 {
285 return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_PARTNO_Msk) >> SCB_CPUID_PARTNO_Pos);
286 }
287
288 /**
289 * @brief Get Revision number (The p value in the rnpn product revision identifier, indicates patch release)
290 * @rmtoll SCB_CPUID REVISION LL_CPUID_GetRevision
291 * @retval Value between 0 and 255 (0x1: patch 1)
292 */
LL_CPUID_GetRevision(void)293 __STATIC_INLINE uint32_t LL_CPUID_GetRevision(void)
294 {
295 return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_REVISION_Msk) >> SCB_CPUID_REVISION_Pos);
296 }
297
298 /**
299 * @}
300 */
301
302 /**
303 * @}
304 */
305
306 /**
307 * @}
308 */
309
310 /**
311 * @}
312 */
313
314 #ifdef __cplusplus
315 }
316 #endif
317
318 #endif /* __STM32MP1xx_LL_CORTEX_H */
319