1 /**
2 ******************************************************************************
3 * @file stm32wbaxx_ll_cortex.h
4 * @author MCD Application Team
5 * @brief Header file of CORTEX LL module.
6 ******************************************************************************
7 * @attention
8 *
9 * Copyright (c) 2022 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 LL_mDelay and LL_Init1msTick
25 functions
26 (+) Low power mode configuration (SCB register of Cortex-MCU)
27 (+) API to access to MCU info (CPUID register)
28 (+) API to enable fault handler (SHCSR accesses)
29 (+) API to enable and disable the MPU secure and non-secure
30 (+) API to configure the region of MPU secure and non-secure
31 (+) API to configure the attributes region of MPU secure and non-secure
32
33 @endverbatim
34 */
35
36 /* Define to prevent recursive inclusion -------------------------------------*/
37 #ifndef STM32WBAxx_LL_CORTEX_H
38 #define STM32WBAxx_LL_CORTEX_H
39
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
43
44 /* Includes ------------------------------------------------------------------*/
45 #include "stm32wbaxx.h"
46
47 /** @addtogroup STM32WBAxx_LL_Driver
48 * @{
49 */
50
51 /** @defgroup CORTEX_LL CORTEX
52 * @{
53 */
54
55 /* Private types -------------------------------------------------------------*/
56 /* Private variables ---------------------------------------------------------*/
57 /* Private constants ---------------------------------------------------------*/
58 /** @defgroup CORTEX_LL_EC_REGION_ACCESS CORTEX LL MPU Region Access Attributes
59 * @{
60 */
61 /* Register MPU_RBAR (Cortex-M33) : bits [4:0] */
62 #define MPU_ACCESS_MSK (MPU_RBAR_SH_Msk|MPU_RBAR_AP_Msk|MPU_RBAR_XN_Msk)
63 /**
64 * @}
65 */
66
67 /* Private macros ------------------------------------------------------------*/
68 /* Exported types ------------------------------------------------------------*/
69 /* Exported constants --------------------------------------------------------*/
70 /** @defgroup CORTEX_LL_Exported_Constants CORTEX LL Exported Constants
71 * @{
72 */
73
74 /** @defgroup CORTEX_LL_EC_CLKSOURCE_HCLK SYSTICK Clock Source
75 * @{
76 */
77 #define LL_SYSTICK_CLKSOURCE_HCLK_DIV8 0x00000000U /*!< AHB clock divided by 8 selected as SysTick
78 clock source */
79 #define LL_SYSTICK_CLKSOURCE_HCLK SysTick_CTRL_CLKSOURCE_Msk /*!< AHB clock selected as SysTick
80 clock source */
81 /**
82 * @}
83 */
84
85 /** @defgroup CORTEX_LL_EC_FAULT Handler Fault type
86 * @{
87 */
88 #define LL_HANDLER_FAULT_USG SCB_SHCSR_USGFAULTENA_Msk /*!< Usage fault */
89 #define LL_HANDLER_FAULT_BUS SCB_SHCSR_BUSFAULTENA_Msk /*!< Bus fault */
90 #define LL_HANDLER_FAULT_MEM SCB_SHCSR_MEMFAULTENA_Msk /*!< Memory management fault */
91 #define LL_HANDLER_FAULT_SECURE SCB_SHCSR_SECUREFAULTENA_Msk /*!< Secure fault */
92 /**
93 * @}
94 */
95
96 /** @defgroup CORTEX_LL_MPU_HFNMI_PRIVDEF_Control CORTEX LL MPU HFNMI and PRIVILEGED Access control
97 * @{
98 */
99 #define LL_MPU_CTRL_HFNMI_PRIVDEF_NONE 0U
100 #define LL_MPU_CTRL_HARDFAULT_NMI 2U
101 #define LL_MPU_CTRL_PRIVILEGED_DEFAULT 4U
102 #define LL_MPU_CTRL_HFNMI_PRIVDEF 6U
103 /**
104 * @}
105 */
106
107 /** @defgroup CORTEX_LL_MPU_Attributes CORTEX LL MPU Attributes
108 * @{
109 */
110 #define LL_MPU_DEVICE_nGnRnE 0x0U /* Device, noGather, noReorder, noEarly acknowledge. */
111 #define LL_MPU_DEVICE_nGnRE 0x4U /* Device, noGather, noReorder, Early acknowledge. */
112 #define LL_MPU_DEVICE_nGRE 0x8U /* Device, noGather, Reorder, Early acknowledge. */
113 #define LL_MPU_DEVICE_GRE 0xCU /* Device, Gather, Reorder, Early acknowledge. */
114
115 #define LL_MPU_WRITE_THROUGH 0x0U /* Normal memory, write-through. */
116 #define LL_MPU_NOT_CACHEABLE 0x4U /* Normal memory, non-cacheable. */
117 #define LL_MPU_WRITE_BACK 0x4U /* Normal memory, write-back. */
118
119 #define LL_MPU_TRANSIENT 0x0U /* Normal memory, transient. */
120 #define LL_MPU_NON_TRANSIENT 0x8U /* Normal memory, non-transient. */
121
122 #define LL_MPU_NO_ALLOCATE 0x0U /* Normal memory, no allocate. */
123 #define LL_MPU_W_ALLOCATE 0x1U /* Normal memory, write allocate. */
124 #define LL_MPU_R_ALLOCATE 0x2U /* Normal memory, read allocate. */
125 #define LL_MPU_RW_ALLOCATE 0x3U /* Normal memory, read/write allocate. */
126 /**
127 * @}
128 */
129
130 /** @defgroup CORTEX_LL_MPU_Region_Enable CORTEX LL MPU Region Enable
131 * @{
132 */
133 #define LL_MPU_REGION_ENABLE 1U
134 #define LL_MPU_REGION_DISABLE 0U
135 /**
136 * @}
137 */
138
139 /** @defgroup CORTEX_LL_MPU_Instruction_Access CORTEX LL MPU Instruction Access
140 * @{
141 */
142 #define LL_MPU_INSTRUCTION_ACCESS_ENABLE (0U << MPU_RBAR_XN_Pos)
143 #define LL_MPU_INSTRUCTION_ACCESS_DISABLE (1U << MPU_RBAR_XN_Pos)
144 /**
145 * @}
146 */
147
148 /** @defgroup CORTEX_LL_MPU_Access_Shareable CORTEX LL MPU Instruction Access Shareable
149 * @{
150 */
151 #define LL_MPU_ACCESS_NOT_SHAREABLE (0U << MPU_RBAR_SH_Pos)
152 #define LL_MPU_ACCESS_OUTER_SHAREABLE (2U << MPU_RBAR_SH_Pos)
153 #define LL_MPU_ACCESS_INNER_SHAREABLE (3U << MPU_RBAR_SH_Pos)
154 /**
155 * @}
156 */
157
158 /** @defgroup CORTEX_LL_MPU_Region_Permission_Attributes CORTEX LL MPU Region Permission Attributes
159 * @{
160 */
161 #define LL_MPU_REGION_PRIV_RW (0U << MPU_RBAR_AP_Pos)
162 #define LL_MPU_REGION_ALL_RW (1U << MPU_RBAR_AP_Pos)
163 #define LL_MPU_REGION_PRIV_RO (2U << MPU_RBAR_AP_Pos)
164 #define LL_MPU_REGION_ALL_RO (3U << MPU_RBAR_AP_Pos)
165 /**
166 * @}
167 */
168
169 /** @defgroup CORTEX_LL_MPU_Region_Index CORTEX LL MPU Region Index
170 * @{
171 */
172 #define LL_MPU_REGION_NUMBER0 0U
173 #define LL_MPU_REGION_NUMBER1 1U
174 #define LL_MPU_REGION_NUMBER2 2U
175 #define LL_MPU_REGION_NUMBER3 3U
176 #define LL_MPU_REGION_NUMBER4 4U
177 #define LL_MPU_REGION_NUMBER5 5U
178 #define LL_MPU_REGION_NUMBER6 6U
179 #define LL_MPU_REGION_NUMBER7 7U
180 /**
181 * @}
182 */
183
184 /** @defgroup CORTEX_LL_MPU_Attributes_Index CORTEX LL MPU Memory Attributes Index
185 * @{
186 */
187 #define LL_MPU_ATTRIBUTES_NUMBER0 0U
188 #define LL_MPU_ATTRIBUTES_NUMBER1 1U
189 #define LL_MPU_ATTRIBUTES_NUMBER2 2U
190 #define LL_MPU_ATTRIBUTES_NUMBER3 3U
191 #define LL_MPU_ATTRIBUTES_NUMBER4 4U
192 #define LL_MPU_ATTRIBUTES_NUMBER5 5U
193 #define LL_MPU_ATTRIBUTES_NUMBER6 6U
194 #define LL_MPU_ATTRIBUTES_NUMBER7 7U
195 /**
196 * @}
197 */
198
199 /**
200 * @}
201 */
202
203 /* Exported macro ------------------------------------------------------------*/
204
205 /* Exported functions --------------------------------------------------------*/
206 /** @defgroup CORTEX_LL_Exported_Functions CORTEX LL Exported Functions
207 * @{
208 */
209
210 /** @defgroup CORTEX_LL_EF_SYSTICK SYSTICK
211 * @brief CORTEX SYSTICK LL module driver
212 * @{
213 */
214
215 /**
216 * @brief This function checks if the Systick counter flag is active or not.
217 * @note It can be used in timeout function on application side.
218 * @rmtoll STK_CTRL COUNTFLAG LL_SYSTICK_IsActiveCounterFlag
219 * @retval State of bit (1 or 0).
220 */
LL_SYSTICK_IsActiveCounterFlag(void)221 __STATIC_INLINE uint32_t LL_SYSTICK_IsActiveCounterFlag(void)
222 {
223 return (((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == (SysTick_CTRL_COUNTFLAG_Msk)) ? 1UL : 0UL);
224 }
225
226 /**
227 * @brief Configures the SysTick clock source
228 * @rmtoll STK_CTRL CLKSOURCE LL_SYSTICK_SetClkSource
229 * @param Source This parameter can be one of the following values:
230 * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK_DIV8
231 * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK
232 * @retval None
233 */
LL_SYSTICK_SetClkSource(uint32_t Source)234 __STATIC_INLINE void LL_SYSTICK_SetClkSource(uint32_t Source)
235 {
236 if (Source == LL_SYSTICK_CLKSOURCE_HCLK)
237 {
238 SET_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK);
239 }
240 else
241 {
242 CLEAR_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK);
243 }
244 }
245
246 /**
247 * @brief Get the SysTick clock source
248 * @rmtoll STK_CTRL CLKSOURCE LL_SYSTICK_GetClkSource
249 * @retval Returned value can be one of the following values:
250 * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK_DIV8
251 * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK
252 */
LL_SYSTICK_GetClkSource(void)253 __STATIC_INLINE uint32_t LL_SYSTICK_GetClkSource(void)
254 {
255 return READ_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK);
256 }
257
258 /**
259 * @brief Enable SysTick exception request
260 * @rmtoll STK_CTRL TICKINT LL_SYSTICK_EnableIT
261 * @retval None
262 */
LL_SYSTICK_EnableIT(void)263 __STATIC_INLINE void LL_SYSTICK_EnableIT(void)
264 {
265 SET_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk);
266 }
267
268 /**
269 * @brief Disable SysTick exception request
270 * @rmtoll STK_CTRL TICKINT LL_SYSTICK_DisableIT
271 * @retval None
272 */
LL_SYSTICK_DisableIT(void)273 __STATIC_INLINE void LL_SYSTICK_DisableIT(void)
274 {
275 CLEAR_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk);
276 }
277
278 /**
279 * @brief Checks if the SYSTICK interrupt is enabled or disabled.
280 * @rmtoll STK_CTRL TICKINT LL_SYSTICK_IsEnabledIT
281 * @retval State of bit (1 or 0).
282 */
LL_SYSTICK_IsEnabledIT(void)283 __STATIC_INLINE uint32_t LL_SYSTICK_IsEnabledIT(void)
284 {
285 return ((READ_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk) == (SysTick_CTRL_TICKINT_Msk)) ? 1UL : 0UL);
286 }
287
288 /**
289 * @}
290 */
291
292 /** @defgroup CORTEX_LL_EF_LOW_POWER_MODE CORTEX LL LOW POWER MODE
293 * @{
294 */
295
296 /**
297 * @brief Processor uses sleep as its low power mode
298 * @rmtoll SCB_SCR SLEEPDEEP LL_LPM_EnableSleep
299 * @retval None
300 */
LL_LPM_EnableSleep(void)301 __STATIC_INLINE void LL_LPM_EnableSleep(void)
302 {
303 /* Clear SLEEPDEEP bit of Cortex System Control Register */
304 CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk));
305 }
306
307 /**
308 * @brief Processor uses deep sleep as its low power mode
309 * @rmtoll SCB_SCR SLEEPDEEP LL_LPM_EnableDeepSleep
310 * @retval None
311 */
LL_LPM_EnableDeepSleep(void)312 __STATIC_INLINE void LL_LPM_EnableDeepSleep(void)
313 {
314 /* Set SLEEPDEEP bit of Cortex System Control Register */
315 SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk));
316 }
317
318 /**
319 * @brief Configures sleep-on-exit when returning from Handler mode to Thread mode.
320 * @note Setting this bit to 1 enables an interrupt-driven application to avoid returning to an
321 * empty main application.
322 * @rmtoll SCB_SCR SLEEPONEXIT LL_LPM_EnableSleepOnExit
323 * @retval None
324 */
LL_LPM_EnableSleepOnExit(void)325 __STATIC_INLINE void LL_LPM_EnableSleepOnExit(void)
326 {
327 /* Set SLEEPONEXIT bit of Cortex System Control Register */
328 SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk));
329 }
330
331 /**
332 * @brief Do not sleep when returning to Thread mode.
333 * @rmtoll SCB_SCR SLEEPONEXIT LL_LPM_DisableSleepOnExit
334 * @retval None
335 */
LL_LPM_DisableSleepOnExit(void)336 __STATIC_INLINE void LL_LPM_DisableSleepOnExit(void)
337 {
338 /* Clear SLEEPONEXIT bit of Cortex System Control Register */
339 CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk));
340 }
341
342 /**
343 * @brief Enabled events and all interrupts, including disabled interrupts, can wakeup the
344 * processor.
345 * @rmtoll SCB_SCR SEVEONPEND LL_LPM_EnableEventOnPend
346 * @retval None
347 */
LL_LPM_EnableEventOnPend(void)348 __STATIC_INLINE void LL_LPM_EnableEventOnPend(void)
349 {
350 /* Set SEVEONPEND bit of Cortex System Control Register */
351 SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk));
352 }
353
354 /**
355 * @brief Only enabled interrupts or events can wakeup the processor, disabled interrupts are
356 * excluded
357 * @rmtoll SCB_SCR SEVEONPEND LL_LPM_DisableEventOnPend
358 * @retval None
359 */
LL_LPM_DisableEventOnPend(void)360 __STATIC_INLINE void LL_LPM_DisableEventOnPend(void)
361 {
362 /* Clear SEVEONPEND bit of Cortex System Control Register */
363 CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk));
364 }
365
366 /**
367 * @}
368 */
369
370 /** @defgroup CORTEX_LL_EF_HANDLER CORTEX LL HANDLER
371 * @{
372 */
373
374 /**
375 * @brief Enable a fault in System handler control register (SHCSR)
376 * @rmtoll SCB_SHCSR USGFAULTENA LL_HANDLER_EnableFault\n
377 * SCB_SHCSR BUSFAULTENA LL_HANDLER_EnableFault\n
378 * SCB_SHCSR MEMFAULTENA LL_HANDLER_EnableFault\n
379 * SCB_SHCSR SECUREFAULTENA LL_HANDLER_EnableFault
380 * @param Fault This parameter can be a combination of the following values:
381 * @arg @ref LL_HANDLER_FAULT_USG
382 * @arg @ref LL_HANDLER_FAULT_BUS
383 * @arg @ref LL_HANDLER_FAULT_MEM
384 * @arg @ref LL_HANDLER_FAULT_SECURE (*)
385 *
386 * (*) value applicable in secure when the system implements the security.
387 * @retval None
388 */
LL_HANDLER_EnableFault(uint32_t Fault)389 __STATIC_INLINE void LL_HANDLER_EnableFault(uint32_t Fault)
390 {
391 /* Enable the system handler fault */
392 SET_BIT(SCB->SHCSR, Fault);
393 }
394
395 /**
396 * @brief Disable a fault in System handler control register (SHCSR)
397 * @rmtoll SCB_SHCSR USGFAULTENA LL_HANDLER_DisableFault\n
398 * SCB_SHCSR BUSFAULTENA LL_HANDLER_DisableFault\n
399 * SCB_SHCSR MEMFAULTENA LL_HANDLER_DisableFault\n
400 * SCB_SHCSR SECUREFAULTENA LL_HANDLER_DisableFault
401 * @param Fault This parameter can be a combination of the following values:
402 * @arg @ref LL_HANDLER_FAULT_USG
403 * @arg @ref LL_HANDLER_FAULT_BUS
404 * @arg @ref LL_HANDLER_FAULT_MEM
405 * @arg @ref LL_HANDLER_FAULT_SECURE (*)
406 *
407 * (*) value applicable in secure when the system implements the security.
408 * @retval None
409 */
LL_HANDLER_DisableFault(uint32_t Fault)410 __STATIC_INLINE void LL_HANDLER_DisableFault(uint32_t Fault)
411 {
412 /* Disable the system handler fault */
413 CLEAR_BIT(SCB->SHCSR, Fault);
414 }
415
416 /**
417 * @}
418 */
419
420 /** @defgroup CORTEX_LL_EF_MCU_INFO CORTEX LL MCU INFO
421 * @{
422 */
423
424 /**
425 * @brief Get Implementer code
426 * @rmtoll SCB_CPUID IMPLEMENTER LL_CPUID_GetImplementer
427 * @retval Value should be equal to 0x41 for ARM
428 */
LL_CPUID_GetImplementer(void)429 __STATIC_INLINE uint32_t LL_CPUID_GetImplementer(void)
430 {
431 return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_IMPLEMENTER_Msk) >> SCB_CPUID_IMPLEMENTER_Pos);
432 }
433
434 /**
435 * @brief Get Variant number (The r value in the rnpn product revision identifier)
436 * @rmtoll SCB_CPUID VARIANT LL_CPUID_GetVariant
437 * @retval Value between 0 and 255 (0x0: revision 0)
438 */
LL_CPUID_GetVariant(void)439 __STATIC_INLINE uint32_t LL_CPUID_GetVariant(void)
440 {
441 return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_VARIANT_Msk) >> SCB_CPUID_VARIANT_Pos);
442 }
443
444 /**
445 * @brief Get Architecture version
446 * @rmtoll SCB_CPUID ARCHITECTURE LL_CPUID_GetArchitecture
447 * @retval Value should be equal to 0xF for Cortex-M33 ("ARMv8-M with Main Extension")
448 */
LL_CPUID_GetArchitecture(void)449 __STATIC_INLINE uint32_t LL_CPUID_GetArchitecture(void)
450 {
451 return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_ARCHITECTURE_Msk) >> SCB_CPUID_ARCHITECTURE_Pos);
452 }
453
454 /**
455 * @brief Get Part number
456 * @rmtoll SCB_CPUID PARTNO LL_CPUID_GetParNo
457 * @retval Value should be equal to 0xD21 for Cortex-M33
458 */
LL_CPUID_GetParNo(void)459 __STATIC_INLINE uint32_t LL_CPUID_GetParNo(void)
460 {
461 return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_PARTNO_Msk) >> SCB_CPUID_PARTNO_Pos);
462 }
463
464 /**
465 * @brief Get Revision number (The p value in the rnpn product revision identifier, indicates patch release)
466 * @rmtoll SCB_CPUID REVISION LL_CPUID_GetRevision
467 * @retval Value between 0 and 255 (0x1: patch 1)
468 */
LL_CPUID_GetRevision(void)469 __STATIC_INLINE uint32_t LL_CPUID_GetRevision(void)
470 {
471 return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_REVISION_Msk) >> SCB_CPUID_REVISION_Pos);
472 }
473
474 /**
475 * @}
476 */
477
478 /** @defgroup CORTEX_LL_EF_MPU CORTEX LL MPU
479 * @{
480 */
481
482 /**
483 * @brief Enable MPU with input options
484 * @rmtoll MPU_CTRL ENABLE LL_MPU_Enable
485 * @param MPU_Control This parameter can be one of the following values:
486 * @arg @ref LL_MPU_CTRL_HFNMI_PRIVDEF_NONE
487 * @arg @ref LL_MPU_CTRL_HARDFAULT_NMI
488 * @arg @ref LL_MPU_CTRL_PRIVILEGED_DEFAULT
489 * @arg @ref LL_MPU_CTRL_HFNMI_PRIVDEF
490 * @retval None
491 */
LL_MPU_Enable(uint32_t MPU_Control)492 __STATIC_INLINE void LL_MPU_Enable(uint32_t MPU_Control)
493 {
494 __DMB(); /* Data Memory Barrier operation to force any outstanding writes to memory before enabling the MPU */
495
496 /* Enable the MPU*/
497 MPU->CTRL = MPU_CTRL_ENABLE_Msk | MPU_Control;
498
499 /* Follow ARM recommendation with */
500 /* Data Synchronization and Instruction Synchronization Barriers to ensure MPU configuration */
501 __DSB(); /* Ensure that the subsequent instruction is executed only after the write to memory */
502 __ISB(); /* Flush and refill pipeline with updated MPU configuration settings */
503 }
504
505 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
506 /**
507 * @brief Enable non-secure MPU with input options
508 * @rmtoll MPU_CTRL ENABLE LL_MPU_Enable
509 * @param MPU_Control This parameter can be one of the following values:
510 * @arg @ref LL_MPU_CTRL_HFNMI_PRIVDEF_NONE
511 * @arg @ref LL_MPU_CTRL_HARDFAULT_NMI
512 * @arg @ref LL_MPU_CTRL_PRIVILEGED_DEFAULT
513 * @arg @ref LL_MPU_CTRL_HFNMI_PRIVDEF
514 * @retval None
515 */
LL_MPU_Enable_NS(uint32_t MPU_Control)516 __STATIC_INLINE void LL_MPU_Enable_NS(uint32_t MPU_Control)
517 {
518 __DMB(); /* Data Memory Barrier operation to force any outstanding writes to memory before enabling the MPU */
519
520 /* Enable the MPU*/
521 MPU_NS->CTRL = MPU_CTRL_ENABLE_Msk | MPU_Control;
522
523 /* Follow ARM recommendation with */
524 /* Data Synchronization and Instruction Synchronization Barriers to ensure MPU configuration */
525 __DSB(); /* Ensure that the subsequent instruction is executed only after the write to memory */
526 __ISB(); /* Flush and refill pipeline with updated MPU configuration settings */
527 }
528 #endif /* __ARM_FEATURE_CMSE */
529
530 /**
531 * @brief Disable MPU
532 * @rmtoll MPU_CTRL ENABLE LL_MPU_Disable
533 * @retval None
534 */
LL_MPU_Disable(void)535 __STATIC_INLINE void LL_MPU_Disable(void)
536 {
537 __DMB(); /* Data Memory Barrier operation to force any outstanding writes to memory before disabling the MPU */
538
539 /* Disable MPU*/
540 WRITE_REG(MPU->CTRL, 0U);
541
542 /* Follow ARM recommendation with */
543 /* Data Synchronization and Instruction Synchronization Barriers to ensure MPU configuration */
544 __DSB(); /* Ensure that the subsequent instruction is executed only after the write to memory */
545 __ISB(); /* Flush and refill pipeline with updated MPU configuration settings */
546 }
547
548 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
549 /**
550 * @brief Disable the non-secure MPU
551 * @rmtoll MPU_CTRL ENABLE LL_MPU_Disable_NS
552 * @retval None
553 */
LL_MPU_Disable_NS(void)554 __STATIC_INLINE void LL_MPU_Disable_NS(void)
555 {
556 __DMB(); /* Data Memory Barrier operation to force any outstanding writes to memory before disabling the MPU */
557
558 /* Disable MPU*/
559 WRITE_REG(MPU_NS->CTRL, 0U);
560
561 /* Follow ARM recommendation with */
562 /* Data Synchronization and Instruction Synchronization Barriers to ensure MPU configuration */
563 __DSB(); /* Ensure that the subsequent instruction is executed only after the write to memory */
564 __ISB(); /* Flush and refill pipeline with updated MPU configuration settings */
565 }
566 #endif /* __ARM_FEATURE_CMSE */
567
568
569 /**
570 * @brief Check if MPU is enabled or not
571 * @rmtoll MPU_CTRL ENABLE LL_MPU_IsEnabled
572 * @retval State of bit (1 or 0).
573 */
LL_MPU_IsEnabled(void)574 __STATIC_INLINE uint32_t LL_MPU_IsEnabled(void)
575 {
576 return ((READ_BIT(MPU->CTRL, MPU_CTRL_ENABLE_Msk) == (MPU_CTRL_ENABLE_Msk)) ? 1UL : 0UL);
577 }
578
579 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
580 /**
581 * @brief Check if non-secure MPU is enabled or not
582 * @rmtoll MPU_CTRL ENABLE LL_MPU_IsEnabled_NS
583 * @retval State of bit (1 or 0).
584 */
LL_MPU_IsEnabled_NS(void)585 __STATIC_INLINE uint32_t LL_MPU_IsEnabled_NS(void)
586 {
587 return ((READ_BIT(MPU_NS->CTRL, MPU_CTRL_ENABLE_Msk) == (MPU_CTRL_ENABLE_Msk)) ? 1UL : 0UL);
588 }
589 #endif /* __ARM_FEATURE_CMSE */
590
591 /**
592 * @brief Enable a MPU region
593 * @rmtoll MPU_RLAR ENABLE LL_MPU_EnableRegion
594 * @param Region This parameter can be one of the following values:
595 * @arg @ref LL_MPU_REGION_NUMBER0
596 * @arg @ref LL_MPU_REGION_NUMBER1
597 * @arg @ref LL_MPU_REGION_NUMBER2
598 * @arg @ref LL_MPU_REGION_NUMBER3
599 * @arg @ref LL_MPU_REGION_NUMBER4
600 * @arg @ref LL_MPU_REGION_NUMBER5
601 * @arg @ref LL_MPU_REGION_NUMBER6
602 * @arg @ref LL_MPU_REGION_NUMBER7
603 * @note cortex-M33 supports 8 secure and 8 non secure regions.
604 * @retval None
605 */
LL_MPU_EnableRegion(uint32_t Region)606 __STATIC_INLINE void LL_MPU_EnableRegion(uint32_t Region)
607 {
608 /* Set Region number */
609 WRITE_REG(MPU->RNR, Region);
610
611 /* Enable the MPU region */
612 SET_BIT(MPU->RLAR, MPU_RLAR_EN_Msk);
613 }
614
615 /**
616 * @brief Check if MPU region is enabled or not
617 * @rmtoll MPU_RNR ENABLE LL_MPU_IsEnabled_Region
618 * @param Region This parameter can be one of the following values:
619 * @arg @ref LL_MPU_REGION_NUMBER0
620 * @arg @ref LL_MPU_REGION_NUMBER1
621 * @arg @ref LL_MPU_REGION_NUMBER2
622 * @arg @ref LL_MPU_REGION_NUMBER3
623 * @arg @ref LL_MPU_REGION_NUMBER4
624 * @arg @ref LL_MPU_REGION_NUMBER5
625 * @arg @ref LL_MPU_REGION_NUMBER6
626 * @arg @ref LL_MPU_REGION_NUMBER7
627 * @note cortex-M33 supports 8 secure and 8 non secure regions.
628 * @retval State of bit (1 or 0).
629 */
LL_MPU_IsEnabled_Region(uint32_t Region)630 __STATIC_INLINE uint32_t LL_MPU_IsEnabled_Region(uint32_t Region)
631 {
632 /* Set region index */
633 WRITE_REG(MPU->RNR, Region);
634
635 /* Return MPU region status */
636 return ((READ_BIT(MPU->RLAR, MPU_RLAR_EN_Msk) == (MPU_RLAR_EN_Msk)) ? 1UL : 0UL);
637 }
638
639 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
640 /**
641 * @brief Enable a non-secure MPU region
642 * @rmtoll MPU_RLAR ENABLE LL_MPU_EnableRegion_NS
643 * @param Region This parameter can be one of the following values:
644 * @arg @ref LL_MPU_REGION_NUMBER0
645 * @arg @ref LL_MPU_REGION_NUMBER1
646 * @arg @ref LL_MPU_REGION_NUMBER2
647 * @arg @ref LL_MPU_REGION_NUMBER3
648 * @arg @ref LL_MPU_REGION_NUMBER4
649 * @arg @ref LL_MPU_REGION_NUMBER5
650 * @arg @ref LL_MPU_REGION_NUMBER6
651 * @arg @ref LL_MPU_REGION_NUMBER7
652 * @note cortex-M33 supports 8 secure and 8 non secure regions.
653 * @retval None
654 */
LL_MPU_EnableRegion_NS(uint32_t Region)655 __STATIC_INLINE void LL_MPU_EnableRegion_NS(uint32_t Region)
656 {
657 /* Set Region number */
658 WRITE_REG(MPU_NS->RNR, Region);
659
660 /* Enable the MPU region */
661 SET_BIT(MPU_NS->RLAR, MPU_RLAR_EN_Msk);
662 }
663
664 /**
665 * @brief Check if non-secure MPU region is enabled or not
666 * @rmtoll MPU_RNR ENABLE LL_MPU_IsEnabled_Region_NS
667 * @param Region This parameter can be one of the following values:
668 * @arg @ref LL_MPU_REGION_NUMBER0
669 * @arg @ref LL_MPU_REGION_NUMBER1
670 * @arg @ref LL_MPU_REGION_NUMBER2
671 * @arg @ref LL_MPU_REGION_NUMBER3
672 * @arg @ref LL_MPU_REGION_NUMBER4
673 * @arg @ref LL_MPU_REGION_NUMBER5
674 * @arg @ref LL_MPU_REGION_NUMBER6
675 * @arg @ref LL_MPU_REGION_NUMBER7
676 * @note cortex-M33 supports 8 secure and 8 non secure regions.
677 * @retval State of bit (1 or 0).
678 */
LL_MPU_IsEnabled_Region_NS(uint32_t Region)679 __STATIC_INLINE uint32_t LL_MPU_IsEnabled_Region_NS(uint32_t Region)
680 {
681 /* Set region index */
682 WRITE_REG(MPU_NS->RNR, Region);
683
684 /* Return non-secure MPU region status */
685 return ((READ_BIT(MPU_NS->RLAR, MPU_RLAR_EN_Msk) == (MPU_RLAR_EN_Msk)) ? 1UL : 0UL);
686 }
687 #endif /* __ARM_FEATURE_CMSE */
688
689 /**
690 * @brief Disable a MPU region
691 * @rmtoll MPU_RNR REGION LL_MPU_DisableRegion\n
692 * MPU_RLAR ENABLE LL_MPU_DisableRegion
693 * @param Region This parameter can be one of the following values:
694 * @arg @ref LL_MPU_REGION_NUMBER0
695 * @arg @ref LL_MPU_REGION_NUMBER1
696 * @arg @ref LL_MPU_REGION_NUMBER2
697 * @arg @ref LL_MPU_REGION_NUMBER3
698 * @arg @ref LL_MPU_REGION_NUMBER4
699 * @arg @ref LL_MPU_REGION_NUMBER5
700 * @arg @ref LL_MPU_REGION_NUMBER6
701 * @arg @ref LL_MPU_REGION_NUMBER7
702 * @note cortex-M33 supports 8 secure and 8 non secure regions.
703 * @retval None
704 */
LL_MPU_DisableRegion(uint32_t Region)705 __STATIC_INLINE void LL_MPU_DisableRegion(uint32_t Region)
706 {
707 /* Set Region number */
708 WRITE_REG(MPU->RNR, Region);
709
710 /* Disable the MPU region */
711 CLEAR_BIT(MPU->RLAR, MPU_RLAR_EN_Msk);
712 }
713
714 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
715 /**
716 * @brief Disable a non-secure MPU region
717 * @rmtoll MPU_RNR REGION LL_MPU_DisableRegion_NS\n
718 * MPU_RLAR ENABLE LL_MPU_DisableRegion_NS\n
719 * @param Region This parameter can be one of the following values:
720 * @arg @ref LL_MPU_REGION_NUMBER0
721 * @arg @ref LL_MPU_REGION_NUMBER1
722 * @arg @ref LL_MPU_REGION_NUMBER2
723 * @arg @ref LL_MPU_REGION_NUMBER3
724 * @arg @ref LL_MPU_REGION_NUMBER4
725 * @arg @ref LL_MPU_REGION_NUMBER5
726 * @arg @ref LL_MPU_REGION_NUMBER6
727 * @arg @ref LL_MPU_REGION_NUMBER7
728 * @note cortex-M33 supports 8 secure and 8 non secure regions.
729 * @retval None
730 */
LL_MPU_DisableRegion_NS(uint32_t Region)731 __STATIC_INLINE void LL_MPU_DisableRegion_NS(uint32_t Region)
732 {
733 /* Set Region number */
734 WRITE_REG(MPU_NS->RNR, Region);
735
736 /* Disable the MPU region */
737 CLEAR_BIT(MPU_NS->RLAR, MPU_RLAR_EN_Msk);
738 }
739 #endif /* __ARM_FEATURE_CMSE */
740
741 /**
742 * @brief Configure and enable a MPU region
743 * @rmtoll MPU_RNR REGION LL_MPU_ConfigRegion\n
744 * MPU_RBAR ADDR LL_MPU_ConfigRegion\n
745 * MPU_RLAR ADDR LL_MPU_ConfigRegion\n
746 * MPU_RBAR XN LL_MPU_ConfigRegion\n
747 * MPU_RBAR AP LL_MPU_ConfigRegion\n
748 * MPU_RBAR SH LL_MPU_ConfigRegion\n
749 * MPU_RLAR EN LL_MPU_ConfigRegion\n
750 * MPU_RLAR AttrIndx LL_MPU_ConfigRegion\n
751 * @param Region This parameter can be one of the following values:
752 * @arg @ref LL_MPU_REGION_NUMBER0
753 * @arg @ref LL_MPU_REGION_NUMBER1
754 * @arg @ref LL_MPU_REGION_NUMBER2
755 * @arg @ref LL_MPU_REGION_NUMBER3
756 * @arg @ref LL_MPU_REGION_NUMBER4
757 * @arg @ref LL_MPU_REGION_NUMBER5
758 * @arg @ref LL_MPU_REGION_NUMBER6
759 * @arg @ref LL_MPU_REGION_NUMBER7
760 * @param Attributes This parameter can be a combination of the following values:
761 * @arg @ref LL_MPU_INSTRUCTION_ACCESS_ENABLE or @ref LL_MPU_INSTRUCTION_ACCESS_DISABLE
762 * @arg @ref LL_MPU_ACCESS_NOT_SHAREABLE or @ref LL_MPU_ACCESS_OUTER_SHAREABLE
763 * or @ref LL_MPU_ACCESS_INNER_SHAREABLE
764 * @arg @ref LL_MPU_REGION_PRIV_RW or @ref LL_MPU_REGION_ALL_RW or @ref LL_MPU_REGION_PRIV_RO
765 * or @ref LL_MPU_REGION_ALL_RO
766 * @param AttrIndx This parameter can be one of the following values:
767 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER0
768 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER1
769 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER2
770 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER3
771 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER4
772 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER5
773 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER6
774 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER7
775 * @param BaseAddress Value of region base address
776 * @param LimitAddress Value of region limit address
777 * @note cortex-M33 supports 8 secure and 8 non secure regions.
778 * @retval None
779 */
LL_MPU_ConfigRegion(uint32_t Region,uint32_t Attributes,uint32_t AttrIndx,uint32_t BaseAddress,uint32_t LimitAddress)780 __STATIC_INLINE void LL_MPU_ConfigRegion(uint32_t Region, uint32_t Attributes, uint32_t AttrIndx, uint32_t BaseAddress,
781 uint32_t LimitAddress)
782 {
783 /* Set region index */
784 WRITE_REG(MPU->RNR, Region);
785
786 /* Set base address */
787 MPU->RBAR |= Attributes;
788
789 /* Set region base address and region access attributes */
790 WRITE_REG(MPU->RBAR, ((BaseAddress & MPU_RBAR_BASE_Msk) | Attributes));
791
792 /* Set region limit address, memory attributes index and enable region */
793 WRITE_REG(MPU->RLAR, ((LimitAddress & MPU_RLAR_LIMIT_Msk) | AttrIndx | MPU_RLAR_EN_Msk));
794 }
795
796 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
797 /**
798 * @brief Configure and enable a non-secure MPU region
799 * @rmtoll MPU_RNR REGION LL_MPU_ConfigRegion_NS\n
800 * MPU_RBAR ADDR LL_MPU_ConfigRegion_NS\n
801 * MPU_RLAR ADDR LL_MPU_ConfigRegion_NS\n
802 * MPU_RBAR XN LL_MPU_ConfigRegion_NS\n
803 * MPU_RBAR AP LL_MPU_ConfigRegion_NS\n
804 * MPU_RBAR SH LL_MPU_ConfigRegion_NS\n
805 * MPU_RLAR EN LL_MPU_ConfigRegion_NS\n
806 * MPU_RLAR AttrIndx LL_MPU_ConfigRegion_NS\n
807 * @param Region This parameter can be one of the following values:
808 * @arg @ref LL_MPU_REGION_NUMBER0
809 * @arg @ref LL_MPU_REGION_NUMBER1
810 * @arg @ref LL_MPU_REGION_NUMBER2
811 * @arg @ref LL_MPU_REGION_NUMBER3
812 * @arg @ref LL_MPU_REGION_NUMBER4
813 * @arg @ref LL_MPU_REGION_NUMBER5
814 * @arg @ref LL_MPU_REGION_NUMBER6
815 * @arg @ref LL_MPU_REGION_NUMBER7
816 * @param Attributes This parameter can be a combination of the following values:
817 * @arg @ref LL_MPU_INSTRUCTION_ACCESS_ENABLE or @ref LL_MPU_INSTRUCTION_ACCESS_DISABLE
818 * @arg @ref LL_MPU_ACCESS_NOT_SHAREABLE or @ref LL_MPU_ACCESS_OUTER_SHAREABLE
819 * or @ref LL_MPU_ACCESS_INNER_SHAREABLE
820 * @arg @ref LL_MPU_REGION_PRIV_RW or @ref LL_MPU_REGION_ALL_RW or @ref LL_MPU_REGION_PRIV_RO
821 * or @ref LL_MPU_REGION_ALL_RO
822 * @param AttrIndx This parameter can be one of the following values:
823 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER0
824 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER1
825 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER2
826 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER3
827 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER4
828 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER5
829 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER6
830 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER7
831 * @param BaseAddress Value of region base address
832 * @param LimitAddress Value of region limit address
833 * @note cortex-M33 supports 8 secure and 8 non secure regions.
834 * @retval None
835 */
LL_MPU_ConfigRegion_NS(uint32_t Region,uint32_t Attributes,uint32_t AttrIndx,uint32_t BaseAddress,uint32_t LimitAddress)836 __STATIC_INLINE void LL_MPU_ConfigRegion_NS(uint32_t Region, uint32_t Attributes, uint32_t AttrIndx,
837 uint32_t BaseAddress, uint32_t LimitAddress)
838 {
839 /* Set Region number */
840 WRITE_REG(MPU_NS->RNR, Region);
841
842 /* Set region base address and region access attributes */
843 WRITE_REG(MPU_NS->RBAR, ((BaseAddress & MPU_RBAR_BASE_Msk) | Attributes));
844
845 /* Set region limit address, memory attributes index and enable region */
846 WRITE_REG(MPU_NS->RLAR, ((LimitAddress & MPU_RLAR_LIMIT_Msk) | AttrIndx | MPU_RLAR_EN_Msk));
847 }
848 #endif /* __ARM_FEATURE_CMSE */
849
850 /**
851 * @brief Configure a MPU region address range
852 * @rmtoll MPU_RNR REGION LL_MPU_ConfigRegionAddress\n
853 * MPU_RBAR ADDR LL_MPU_ConfigRegionAddress\n
854 * MPU_RLAR ADDR LL_MPU_ConfigRegionAddress\n
855 * @param Region This parameter can be one of the following values:
856 * @arg @ref LL_MPU_REGION_NUMBER0
857 * @arg @ref LL_MPU_REGION_NUMBER1
858 * @arg @ref LL_MPU_REGION_NUMBER2
859 * @arg @ref LL_MPU_REGION_NUMBER3
860 * @arg @ref LL_MPU_REGION_NUMBER4
861 * @arg @ref LL_MPU_REGION_NUMBER5
862 * @arg @ref LL_MPU_REGION_NUMBER6
863 * @arg @ref LL_MPU_REGION_NUMBER7
864 * @param BaseAddress Value of region base address
865 * @param LimitAddress Value of region limit address
866 * @note cortex-M33 supports 8 secure and 8 non secure regions.
867 * @retval None
868 */
LL_MPU_ConfigRegionAddress(uint32_t Region,uint32_t BaseAddress,uint32_t LimitAddress)869 __STATIC_INLINE void LL_MPU_ConfigRegionAddress(uint32_t Region, uint32_t BaseAddress, uint32_t LimitAddress)
870 {
871 /* Set Region number */
872 WRITE_REG(MPU->RNR, Region);
873
874 /* Modify region base address */
875 MODIFY_REG(MPU->RBAR, MPU_RBAR_BASE_Msk, (BaseAddress & MPU_RBAR_BASE_Msk));
876
877 /* Modify region limit address */
878 MODIFY_REG(MPU->RLAR, MPU_RLAR_LIMIT_Msk, (LimitAddress & MPU_RLAR_LIMIT_Msk));
879 }
880
881 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
882 /**
883 * @brief Configure a non-secure MPU region address range
884 * @rmtoll MPU_RNR REGION LL_MPU_ConfigRegionAddress_NS\n
885 * MPU_RBAR ADDR LL_MPU_ConfigRegionAddress_NS\n
886 * MPU_RLAR ADDR LL_MPU_ConfigRegionAddress_NS\n
887 * @param Region This parameter can be one of the following values:
888 * @arg @ref LL_MPU_REGION_NUMBER0
889 * @arg @ref LL_MPU_REGION_NUMBER1
890 * @arg @ref LL_MPU_REGION_NUMBER2
891 * @arg @ref LL_MPU_REGION_NUMBER3
892 * @arg @ref LL_MPU_REGION_NUMBER4
893 * @arg @ref LL_MPU_REGION_NUMBER5
894 * @arg @ref LL_MPU_REGION_NUMBER6
895 * @arg @ref LL_MPU_REGION_NUMBER7
896 * @param BaseAddress Value of region base address
897 * @param LimitAddress Value of region limit address
898 * @note cortex-M33 supports 8 secure and 8 non secure regions.
899 * @retval None
900 */
LL_MPU_ConfigRegionAddress_NS(uint32_t Region,uint32_t BaseAddress,uint32_t LimitAddress)901 __STATIC_INLINE void LL_MPU_ConfigRegionAddress_NS(uint32_t Region, uint32_t BaseAddress, uint32_t LimitAddress)
902 {
903 /* Set Region number */
904 WRITE_REG(MPU_NS->RNR, Region);
905
906 /* Set base address */
907 MODIFY_REG(MPU_NS->RBAR, MPU_RBAR_BASE_Msk, (BaseAddress & MPU_RBAR_BASE_Msk));
908
909 /* Set limit address */
910 MODIFY_REG(MPU_NS->RLAR, MPU_RLAR_LIMIT_Msk, (LimitAddress & MPU_RLAR_LIMIT_Msk));
911 }
912 #endif /* __ARM_FEATURE_CMSE */
913
914 /**
915 * @brief Configure a MPU attributes index
916 * @rmtoll MPU_MAIR0 Attribute LL_MPU_ConfigAttributes\n
917 * MPU_MAIR1 Attribute LL_MPU_ConfigAttributes\n
918 * @param AttIndex This parameter can be one of the following values:
919 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER0
920 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER1
921 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER2
922 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER3
923 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER4
924 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER5
925 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER6
926 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER7
927 * @param Attributes This parameter can be a combination of @ref CORTEX_LL_MPU_Attributes
928 * @retval None
929 */
LL_MPU_ConfigAttributes(uint32_t AttIndex,uint32_t Attributes)930 __STATIC_INLINE void LL_MPU_ConfigAttributes(uint32_t AttIndex, uint32_t Attributes)
931 {
932 /* When selected index is in range [0;3] */
933 if (AttIndex < LL_MPU_ATTRIBUTES_NUMBER4)
934 {
935 /* Modify Attr<i> field of MPU_MAIR0 accordingly */
936 MODIFY_REG(MPU->MAIR0, (0xFFU << (AttIndex * 8U)), (Attributes << (AttIndex * 8U)));
937 }
938 /* When selected index is in range [4;7] */
939 else
940 {
941 /* Modify Attr<i> field of MPU_MAIR1 accordingly */
942 MODIFY_REG(MPU->MAIR1, (0xFFU << ((AttIndex - 4U) * 8U)), (Attributes << ((AttIndex - 4U) * 8U)));
943 }
944 }
945
946 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
947 /**
948 * @brief Configure a non-secure MPU attributes index
949 * @rmtoll MPU_MAIR0 Attribute LL_MPU_ConfigAttributes_NS\n
950 * MPU_MAIR1 Attribute LL_MPU_ConfigAttributes_NS\n
951 * @param AttIndex This parameter can be one of the following values:
952 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER0
953 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER1
954 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER2
955 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER3
956 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER4
957 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER5
958 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER6
959 * @arg @ref LL_MPU_ATTRIBUTES_NUMBER7
960 * @param Attributes This parameter can be a combination of @ref CORTEX_LL_MPU_Attributes
961 * @retval None
962 */
LL_MPU_ConfigAttributes_NS(uint32_t AttIndex,uint32_t Attributes)963 __STATIC_INLINE void LL_MPU_ConfigAttributes_NS(uint32_t AttIndex, uint32_t Attributes)
964 {
965 /* When selected index is in range [0;3] */
966 if (AttIndex < LL_MPU_ATTRIBUTES_NUMBER4)
967 {
968 /* Modify Attr<i> field of MPU_MAIR0_NS accordingly */
969 MODIFY_REG(MPU_NS->MAIR0, (0xFFU << (AttIndex * 8U)), (Attributes << (AttIndex * 8U)));
970 }
971 /* When selected index is in range [4;7] */
972 else
973 {
974 /* Modify Attr<i> field of MPU_MAIR1_NS accordingly */
975 MODIFY_REG(MPU_NS->MAIR1, (0xFFU << ((AttIndex - 4U) * 8U)), (Attributes << ((AttIndex - 4U) * 8U)));
976 }
977 }
978 #endif /* __ARM_FEATURE_CMSE */
979
980 /**
981 * @brief Configure a MPU region limit address
982 * @rmtoll MPU_RNR REGION LL_MPU_SetRegionLimitAddress\n
983 * MPU_RLAR ADDR LL_MPU_SetRegionLimitAddress\n
984 * @param Region This parameter can be one of the following values:
985 * @arg @ref LL_MPU_REGION_NUMBER0
986 * @arg @ref LL_MPU_REGION_NUMBER1
987 * @arg @ref LL_MPU_REGION_NUMBER2
988 * @arg @ref LL_MPU_REGION_NUMBER3
989 * @arg @ref LL_MPU_REGION_NUMBER4
990 * @arg @ref LL_MPU_REGION_NUMBER5
991 * @arg @ref LL_MPU_REGION_NUMBER6
992 * @arg @ref LL_MPU_REGION_NUMBER7
993 * @param LimitAddress Value of region limit address
994 * @note cortex-M33 supports 8 secure and 8 non secure regions.
995 * @retval None
996 */
LL_MPU_SetRegionLimitAddress(uint32_t Region,uint32_t LimitAddress)997 __STATIC_INLINE void LL_MPU_SetRegionLimitAddress(uint32_t Region, uint32_t LimitAddress)
998 {
999 /* Set Region number */
1000 WRITE_REG(MPU->RNR, Region);
1001
1002 /* Set limit address */
1003 MODIFY_REG(MPU->RLAR, MPU_RLAR_LIMIT_Msk, (LimitAddress & MPU_RLAR_LIMIT_Msk));
1004 }
1005
1006 /**
1007 * @brief Get a MPU region limit address
1008 * @rmtoll MPU_RNR REGION LL_MPU_GetRegionLimitAddress\n
1009 * @param Region This parameter can be one of the following values:
1010 * @arg @ref LL_MPU_REGION_NUMBER0
1011 * @arg @ref LL_MPU_REGION_NUMBER1
1012 * @arg @ref LL_MPU_REGION_NUMBER2
1013 * @arg @ref LL_MPU_REGION_NUMBER3
1014 * @arg @ref LL_MPU_REGION_NUMBER4
1015 * @arg @ref LL_MPU_REGION_NUMBER5
1016 * @arg @ref LL_MPU_REGION_NUMBER6
1017 * @arg @ref LL_MPU_REGION_NUMBER7
1018 * @retval None
1019 */
LL_MPU_GetRegionLimitAddress(uint32_t Region)1020 __STATIC_INLINE uint32_t LL_MPU_GetRegionLimitAddress(uint32_t Region)
1021 {
1022 /* Set Region number */
1023 WRITE_REG(MPU->RNR, Region);
1024
1025 return (READ_REG(MPU->RLAR & MPU_RLAR_LIMIT_Msk));
1026 }
1027
1028 /**
1029 * @brief Configure a MPU region base address
1030 * @rmtoll MPU_RNR REGION LL_MPU_SetRegionBaseAddress\n
1031 * MPU_RBAR ADDR LL_MPU_SetRegionBaseAddress\n
1032 * @param Region This parameter can be one of the following values:
1033 * @arg @ref LL_MPU_REGION_NUMBER0
1034 * @arg @ref LL_MPU_REGION_NUMBER1
1035 * @arg @ref LL_MPU_REGION_NUMBER2
1036 * @arg @ref LL_MPU_REGION_NUMBER3
1037 * @arg @ref LL_MPU_REGION_NUMBER4
1038 * @arg @ref LL_MPU_REGION_NUMBER5
1039 * @arg @ref LL_MPU_REGION_NUMBER6
1040 * @arg @ref LL_MPU_REGION_NUMBER7
1041 * @param BaseAddress Value of region base address
1042 * @note cortex-M33 supports 8 secure and 8 non secure regions.
1043 * @retval None
1044 */
LL_MPU_SetRegionBaseAddress(uint32_t Region,uint32_t BaseAddress)1045 __STATIC_INLINE void LL_MPU_SetRegionBaseAddress(uint32_t Region, uint32_t BaseAddress)
1046 {
1047 /* Set Region number */
1048 WRITE_REG(MPU->RNR, Region);
1049
1050 /* Set base address */
1051 MODIFY_REG(MPU->RBAR, MPU_RBAR_BASE_Msk, (BaseAddress & MPU_RBAR_BASE_Msk));
1052 }
1053
1054 /**
1055 * @brief Get a MPU region base address
1056 * @rmtoll MPU_RNR REGION LL_MPU_GetRegionBaseAddress\n
1057 * @param Region This parameter can be one of the following values:
1058 * @arg @ref LL_MPU_REGION_NUMBER0
1059 * @arg @ref LL_MPU_REGION_NUMBER1
1060 * @arg @ref LL_MPU_REGION_NUMBER2
1061 * @arg @ref LL_MPU_REGION_NUMBER3
1062 * @arg @ref LL_MPU_REGION_NUMBER4
1063 * @arg @ref LL_MPU_REGION_NUMBER5
1064 * @arg @ref LL_MPU_REGION_NUMBER6
1065 * @arg @ref LL_MPU_REGION_NUMBER7
1066 * @retval None
1067 */
LL_MPU_GetRegionBaseAddress(uint32_t Region)1068 __STATIC_INLINE uint32_t LL_MPU_GetRegionBaseAddress(uint32_t Region)
1069 {
1070 /* Set Region number */
1071 WRITE_REG(MPU->RNR, Region);
1072
1073 return (READ_REG(MPU->RBAR & MPU_RBAR_BASE_Msk));
1074 }
1075
1076 /**
1077 * @brief Configure a MPU region access attributes and enable a region
1078 * @rmtoll MPU_RNR REGION LL_MPU_SetRegionAccess\n
1079 * MPU_RBAR XN LL_MPU_SetRegionAccess\n
1080 * MPU_RBAR AP LL_MPU_SetRegionAccess\n
1081 * MPU_RBAR SH LL_MPU_SetRegionAccess\n
1082 * @param Region This parameter can be one of the following values:
1083 * @arg @ref LL_MPU_REGION_NUMBER0
1084 * @arg @ref LL_MPU_REGION_NUMBER1
1085 * @arg @ref LL_MPU_REGION_NUMBER2
1086 * @arg @ref LL_MPU_REGION_NUMBER3
1087 * @arg @ref LL_MPU_REGION_NUMBER4
1088 * @arg @ref LL_MPU_REGION_NUMBER5
1089 * @arg @ref LL_MPU_REGION_NUMBER6
1090 * @arg @ref LL_MPU_REGION_NUMBER7
1091 * @param Attributes This parameter can be a combination of the following values:
1092 * @arg @ref LL_MPU_INSTRUCTION_ACCESS_ENABLE or @ref LL_MPU_INSTRUCTION_ACCESS_DISABLE
1093 * @arg @ref LL_MPU_ACCESS_NOT_SHAREABLE or @ref LL_MPU_ACCESS_OUTER_SHAREABLE
1094 * or @ref LL_MPU_ACCESS_INNER_SHAREABLE
1095 * @arg @ref LL_MPU_REGION_PRIV_RW or @ref LL_MPU_REGION_ALL_RW or @ref LL_MPU_REGION_PRIV_RO
1096 * or @ref LL_MPU_REGION_ALL_RO
1097 * @note cortex-M33 supports 8 secure and 8 non secure regions.
1098 * @retval None
1099 */
LL_MPU_SetRegionAccess(uint32_t Region,uint32_t Attributes)1100 __STATIC_INLINE void LL_MPU_SetRegionAccess(uint32_t Region, uint32_t Attributes)
1101 {
1102 /* Set Region number */
1103 WRITE_REG(MPU->RNR, Region);
1104
1105 /* Set base address */
1106 MODIFY_REG(MPU->RBAR, MPU_ACCESS_MSK, (Attributes & MPU_ACCESS_MSK));
1107 }
1108
1109 /**
1110 * @brief Get a MPU region access attributes
1111 * @rmtoll MPU_RNR REGION LL_MPU_GetRegionAccess\n
1112 * MPU_RBAR XN LL_MPU_GetRegionAccess\n
1113 * MPU_RBAR AP LL_MPU_GetRegionAccess\n
1114 * MPU_RBAR SH LL_MPU_GetRegionAccess\n
1115 * @param Region This parameter can be one of the following values:
1116 * @arg @ref LL_MPU_REGION_NUMBER0
1117 * @arg @ref LL_MPU_REGION_NUMBER1
1118 * @arg @ref LL_MPU_REGION_NUMBER2
1119 * @arg @ref LL_MPU_REGION_NUMBER3
1120 * @arg @ref LL_MPU_REGION_NUMBER4
1121 * @arg @ref LL_MPU_REGION_NUMBER5
1122 * @arg @ref LL_MPU_REGION_NUMBER6
1123 * @arg @ref LL_MPU_REGION_NUMBER7
1124 * @retval None
1125 */
LL_MPU_GetRegionAccess(uint32_t Region)1126 __STATIC_INLINE uint32_t LL_MPU_GetRegionAccess(uint32_t Region)
1127 {
1128 /* Set Region number */
1129 WRITE_REG(MPU->RNR, Region);
1130
1131 return (READ_REG(MPU->RBAR & (MPU_RBAR_XN_Msk | MPU_RBAR_AP_Msk | MPU_RBAR_SH_Msk)));
1132 }
1133
1134 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
1135 /**
1136 * @brief Configure a non-secure MPU region limit address
1137 * @rmtoll MPU_RNR REGION LL_MPU_SetRegionLimitAddress_NS\n
1138 * MPU_RLAR ADDR LL_MPU_SetRegionLimitAddress_NS\n
1139 * @param Region This parameter can be one of the following values:
1140 * @arg @ref LL_MPU_REGION_NUMBER0
1141 * @arg @ref LL_MPU_REGION_NUMBER1
1142 * @arg @ref LL_MPU_REGION_NUMBER2
1143 * @arg @ref LL_MPU_REGION_NUMBER3
1144 * @arg @ref LL_MPU_REGION_NUMBER4
1145 * @arg @ref LL_MPU_REGION_NUMBER5
1146 * @arg @ref LL_MPU_REGION_NUMBER6
1147 * @arg @ref LL_MPU_REGION_NUMBER7
1148 * @param LimitAddress Value of region limit address
1149 * @note cortex-M33 supports 8 secure and 8 non secure regions.
1150 * @retval None
1151 */
LL_MPU_SetRegionLimitAddress_NS(uint32_t Region,uint32_t LimitAddress)1152 __STATIC_INLINE void LL_MPU_SetRegionLimitAddress_NS(uint32_t Region, uint32_t LimitAddress)
1153 {
1154 /* Set Region number */
1155 WRITE_REG(MPU_NS->RNR, Region);
1156
1157 /* Set limit address */
1158 MODIFY_REG(MPU_NS->RLAR, MPU_RLAR_LIMIT_Msk, (LimitAddress & MPU_RLAR_LIMIT_Msk));
1159 }
1160
1161 /**
1162 * @brief Get a non-secure MPU region limit address
1163 * @rmtoll MPU_RNR REGION LL_MPU_GetRegionLimitAddress_NS\n
1164 * @param Region This parameter can be one of the following values:
1165 * @arg @ref LL_MPU_REGION_NUMBER0
1166 * @arg @ref LL_MPU_REGION_NUMBER1
1167 * @arg @ref LL_MPU_REGION_NUMBER2
1168 * @arg @ref LL_MPU_REGION_NUMBER3
1169 * @arg @ref LL_MPU_REGION_NUMBER4
1170 * @arg @ref LL_MPU_REGION_NUMBER5
1171 * @arg @ref LL_MPU_REGION_NUMBER6
1172 * @arg @ref LL_MPU_REGION_NUMBER7
1173 * @retval None
1174 */
LL_MPU_GetRegionLimitAddress_NS(uint32_t Region)1175 __STATIC_INLINE uint32_t LL_MPU_GetRegionLimitAddress_NS(uint32_t Region)
1176 {
1177 /* Set Region number */
1178 WRITE_REG(MPU_NS->RNR, Region);
1179
1180 return (READ_REG(MPU_NS->RLAR & MPU_RLAR_LIMIT_Msk));
1181 }
1182
1183 /**
1184 * @brief Configure a non-secure MPU region base address
1185 * @rmtoll MPU_RNR REGION LL_MPU_SetRegionBaseAddress_NS\n
1186 * MPU_RBAR ADDR LL_MPU_SetRegionBaseAddress_NS\n
1187 * @param Region This parameter can be one of the following values:
1188 * @arg @ref LL_MPU_REGION_NUMBER0
1189 * @arg @ref LL_MPU_REGION_NUMBER1
1190 * @arg @ref LL_MPU_REGION_NUMBER2
1191 * @arg @ref LL_MPU_REGION_NUMBER3
1192 * @arg @ref LL_MPU_REGION_NUMBER4
1193 * @arg @ref LL_MPU_REGION_NUMBER5
1194 * @arg @ref LL_MPU_REGION_NUMBER6
1195 * @arg @ref LL_MPU_REGION_NUMBER7
1196 * @param BaseAddress Value of region base address
1197 * @note cortex-M33 supports 8 secure and 8 non secure regions.
1198 * @retval None
1199 */
LL_MPU_SetRegionBaseAddress_NS(uint32_t Region,uint32_t BaseAddress)1200 __STATIC_INLINE void LL_MPU_SetRegionBaseAddress_NS(uint32_t Region, uint32_t BaseAddress)
1201 {
1202 /* Set Region number */
1203 WRITE_REG(MPU_NS->RNR, Region);
1204
1205 /* Set base address */
1206 MODIFY_REG(MPU_NS->RBAR, MPU_RBAR_BASE_Msk, (BaseAddress & MPU_RBAR_BASE_Msk));
1207 }
1208
1209 /**
1210 * @brief Get a non-secure MPU region base address
1211 * @rmtoll MPU_RNR REGION LL_MPU_GetRegionBaseAddress_NS\n
1212 * @param Region This parameter can be one of the following values:
1213 * @arg @ref LL_MPU_REGION_NUMBER0
1214 * @arg @ref LL_MPU_REGION_NUMBER1
1215 * @arg @ref LL_MPU_REGION_NUMBER2
1216 * @arg @ref LL_MPU_REGION_NUMBER3
1217 * @arg @ref LL_MPU_REGION_NUMBER4
1218 * @arg @ref LL_MPU_REGION_NUMBER5
1219 * @arg @ref LL_MPU_REGION_NUMBER6
1220 * @arg @ref LL_MPU_REGION_NUMBER7
1221 * @retval None
1222 */
LL_MPU_GetRegionBaseAddress_NS(uint32_t Region)1223 __STATIC_INLINE uint32_t LL_MPU_GetRegionBaseAddress_NS(uint32_t Region)
1224 {
1225 /* Set Region number */
1226 WRITE_REG(MPU_NS->RNR, Region);
1227
1228 return (READ_REG(MPU_NS->RBAR & MPU_RBAR_BASE_Msk));
1229 }
1230
1231 /**
1232 * @brief Configure a non-secure MPU region access attributes and enable a region
1233 * @rmtoll MPU_RNR REGION LL_MPU_SetRegionAccess_NS\n
1234 * MPU_RBAR XN LL_MPU_SetRegionAccess_NS\n
1235 * MPU_RBAR AP LL_MPU_SetRegionAccess_NS\n
1236 * MPU_RBAR SH LL_MPU_SetRegionAccess_NS\n
1237 * @param Region This parameter can be one of the following values:
1238 * @arg @ref LL_MPU_REGION_NUMBER0
1239 * @arg @ref LL_MPU_REGION_NUMBER1
1240 * @arg @ref LL_MPU_REGION_NUMBER2
1241 * @arg @ref LL_MPU_REGION_NUMBER3
1242 * @arg @ref LL_MPU_REGION_NUMBER4
1243 * @arg @ref LL_MPU_REGION_NUMBER5
1244 * @arg @ref LL_MPU_REGION_NUMBER6
1245 * @arg @ref LL_MPU_REGION_NUMBER7
1246 * @param Attributes This parameter can be a combination of the following values:
1247 * @arg @ref LL_MPU_INSTRUCTION_ACCESS_ENABLE or @ref LL_MPU_INSTRUCTION_ACCESS_DISABLE
1248 * @arg @ref LL_MPU_ACCESS_NOT_SHAREABLE or @ref LL_MPU_ACCESS_OUTER_SHAREABLE
1249 * or @ref LL_MPU_ACCESS_INNER_SHAREABLE
1250 * @arg @ref LL_MPU_REGION_PRIV_RW or @ref LL_MPU_REGION_ALL_RW or @ref LL_MPU_REGION_PRIV_RO
1251 * or @ref LL_MPU_REGION_ALL_RO
1252 * @note cortex-M33 supports 8 secure and 8 non secure regions.
1253 * @retval None
1254 */
LL_MPU_SetRegionAccess_NS(uint32_t Region,uint32_t Attributes)1255 __STATIC_INLINE void LL_MPU_SetRegionAccess_NS(uint32_t Region, uint32_t Attributes)
1256 {
1257 /* Set Region number */
1258 WRITE_REG(MPU_NS->RNR, Region);
1259
1260 /* Set base address Attributes */
1261 MODIFY_REG(MPU_NS->RBAR, MPU_ACCESS_MSK, (Attributes & MPU_ACCESS_MSK));
1262 }
1263
1264 /**
1265 * @brief Get a non-secure MPU region access attributes
1266 * @rmtoll MPU_RNR REGION LL_MPU_GetRegionAccess_NS\n
1267 * MPU_RBAR XN LL_MPU_GetRegionAccess_NS\n
1268 * MPU_RBAR AP LL_MPU_GetRegionAccess_NS\n
1269 * MPU_RBAR SH LL_MPU_GetRegionAccess_NS\n
1270 * @param Region This parameter can be one of the following values:
1271 * @arg @ref LL_MPU_REGION_NUMBER0
1272 * @arg @ref LL_MPU_REGION_NUMBER1
1273 * @arg @ref LL_MPU_REGION_NUMBER2
1274 * @arg @ref LL_MPU_REGION_NUMBER3
1275 * @arg @ref LL_MPU_REGION_NUMBER4
1276 * @arg @ref LL_MPU_REGION_NUMBER5
1277 * @arg @ref LL_MPU_REGION_NUMBER6
1278 * @arg @ref LL_MPU_REGION_NUMBER7
1279 * @retval None
1280 */
LL_MPU_GetRegionAccess_NS(uint32_t Region)1281 __STATIC_INLINE uint32_t LL_MPU_GetRegionAccess_NS(uint32_t Region)
1282 {
1283 /* Set Region number */
1284 WRITE_REG(MPU_NS->RNR, Region);
1285
1286 return (READ_REG(MPU_NS->RBAR & (MPU_RBAR_XN_Msk | MPU_RBAR_AP_Msk | MPU_RBAR_SH_Msk)));
1287 }
1288 #endif /* __ARM_FEATURE_CMSE */
1289
1290 /**
1291 * @}
1292 */
1293
1294 /**
1295 * @}
1296 */
1297
1298 /**
1299 * @}
1300 */
1301
1302 /**
1303 * @}
1304 */
1305
1306 #ifdef __cplusplus
1307 }
1308 #endif
1309
1310 #endif /* STM32WBAxx_LL_CORTEX_H */
1311