Skip to content

Commit b0e1812

Browse files
committed
[L5] new system cortex M33 Device Peripheral Access Layer
Signed-off-by: Francois Ramu <[email protected]>
1 parent d0c4ac4 commit b0e1812

File tree

1 file changed

+243
-0
lines changed

1 file changed

+243
-0
lines changed

Diff for: system/STM32L5xx/system_stm32l5xx.c

+243
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,243 @@
1+
/**
2+
******************************************************************************
3+
* @file system_stm32l5xx_ns.c
4+
* @author MCD Application Team
5+
* @brief CMSIS Cortex-M33 Device Peripheral Access Layer System Source File
6+
* to be used in non-secure application when the system implements
7+
* the TrustZone-M security.
8+
*
9+
* This file provides two functions and one global variable to be called from
10+
* user application:
11+
* - SystemInit(): This function is called at non-secure startup before
12+
* branch to non-secure main program.
13+
* This call is made inside the "startup_stm32l5xx.s" file.
14+
*
15+
* - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
16+
* by the user application to setup the SysTick
17+
* timer or configure other parameters.
18+
*
19+
* - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
20+
* be called whenever the core clock is changed
21+
* during program execution.
22+
*
23+
* After each device reset the MSI (4 MHz) is used as system clock source.
24+
* Then SystemInit() function is called, in "startup_stm32l5xx.s" file, to
25+
* configure the system clock before to branch to main secure program.
26+
* Later, when non-secure SystemInit() function is called, in "startup_stm32l5xx.s"
27+
* file, the system clock may have been updated from reset value by the main
28+
* secure program.
29+
*
30+
******************************************************************************
31+
* @attention
32+
*
33+
* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
34+
* All rights reserved.</center></h2>
35+
*
36+
* This software component is licensed by ST under Apache License, Version 2.0,
37+
* the "License"; You may not use this file except in compliance with the
38+
* License. You may obtain a copy of the License at:
39+
* opensource.org/licenses/Apache-2.0
40+
*
41+
******************************************************************************
42+
*/
43+
44+
/** @addtogroup CMSIS
45+
* @{
46+
*/
47+
48+
/** @addtogroup STM32L5xx_System
49+
* @{
50+
*/
51+
52+
/** @addtogroup STM32L5xx_System_Private_Includes
53+
* @{
54+
*/
55+
56+
#include "stm32l5xx.h"
57+
58+
/**
59+
* @}
60+
*/
61+
62+
/** @addtogroup STM32L5xx_System_Private_TypesDefinitions
63+
* @{
64+
*/
65+
66+
/**
67+
* @}
68+
*/
69+
70+
/** @addtogroup STM32L5xx_System_Private_Defines
71+
* @{
72+
*/
73+
74+
#if !defined (HSE_VALUE)
75+
#define HSE_VALUE 16000000U /*!< Value of the External oscillator in Hz */
76+
#endif /* HSE_VALUE */
77+
78+
#if !defined (MSI_VALUE)
79+
#define MSI_VALUE 4000000U /*!< Value of the Internal oscillator in Hz*/
80+
#endif /* MSI_VALUE */
81+
82+
#if !defined (HSI_VALUE)
83+
#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/
84+
#endif /* HSI_VALUE */
85+
86+
/* Note: Following vector table addresses must be defined in line with linker
87+
configuration. */
88+
/*!< Uncomment the following line if you need to relocate the vector table
89+
anywhere in Flash or Sram, else the vector table is kept at the automatic
90+
remap of boot address selected */
91+
/* #define USER_VECT_TAB_ADDRESS */
92+
93+
#if defined(USER_VECT_TAB_ADDRESS)
94+
/*!< Uncomment the following line if you need to relocate your vector Table
95+
in Sram else user remap will be done in Flash. */
96+
/* #define VECT_TAB_SRAM */
97+
98+
#if defined(VECT_TAB_SRAM)
99+
#define VECT_TAB_BASE_ADDRESS SRAM1_BASE_NS /*!< Vector Table base address field.
100+
This value must be a multiple of 0x200. */
101+
#define VECT_TAB_OFFSET 0x00018000U /*!< Vector Table base offset field.
102+
This value must be a multiple of 0x200. */
103+
#else
104+
#define VECT_TAB_BASE_ADDRESS FLASH_BASE_NS /*!< Vector Table base address field.
105+
This value must be a multiple of 0x200. */
106+
#define VECT_TAB_OFFSET 0x00040000U /*!< Vector Table base offset field.
107+
This value must be a multiple of 0x200. */
108+
#endif /* VECT_TAB_SRAM */
109+
#endif /* USER_VECT_TAB_ADDRESS */
110+
111+
/******************************************************************************/
112+
/**
113+
* @}
114+
*/
115+
116+
/** @addtogroup STM32L5xx_System_Private_Macros
117+
* @{
118+
*/
119+
120+
/**
121+
* @}
122+
*/
123+
124+
/** @addtogroup STM32L5xx_System_Private_Variables
125+
* @{
126+
*/
127+
/* The SystemCoreClock variable is updated in three ways:
128+
1) by calling CMSIS function SystemCoreClockUpdate()
129+
2) by calling HAL API function HAL_RCC_GetHCLKFreq()
130+
3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
131+
Note: If you use this function to configure the system clock; then there
132+
is no need to call the 2 first functions listed above, since SystemCoreClock
133+
variable is updated automatically.
134+
*/
135+
uint32_t SystemCoreClock = 4000000U;
136+
137+
const uint8_t AHBPrescTable[16] = {0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U, 6U, 7U, 8U, 9U};
138+
const uint8_t APBPrescTable[8] = {0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U};
139+
const uint32_t MSIRangeTable[16] = {100000U, 200000U, 400000U, 800000U, 1000000U, 2000000U, \
140+
4000000U, 8000000U, 16000000U, 24000000U, 32000000U, 48000000U, \
141+
0U, 0U, 0U, 0U}; /* MISRAC-2012: 0U for unexpected value */
142+
/**
143+
* @}
144+
*/
145+
146+
/** @addtogroup STM32L5xx_System_Private_FunctionPrototypes
147+
* @{
148+
*/
149+
150+
/**
151+
* @}
152+
*/
153+
154+
/** @addtogroup STM32L5xx_System_Private_Functions
155+
* @{
156+
*/
157+
158+
/**
159+
* @brief Setup the microcontroller system.
160+
* @retval None
161+
*/
162+
163+
void SystemInit(void)
164+
{
165+
/* Vector table location and FPU setup done by secure application */
166+
167+
/* Configure the Vector Table location -------------------------------------*/
168+
#if defined(USER_VECT_TAB_ADDRESS)
169+
SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET;
170+
#endif
171+
172+
/* Non-secure main application shall call SystemCoreClockUpdate() to update */
173+
/* the SystemCoreClock variable to insure non-secure application relies on */
174+
/* the initial clock reference set by secure application. */
175+
}
176+
177+
/**
178+
* @brief Update SystemCoreClock variable according to Clock Register Values.
179+
* The SystemCoreClock variable contains the core clock (HCLK), it can
180+
* be used by the user application to setup the SysTick timer or configure
181+
* other parameters.
182+
*
183+
* @note From the non-secure application, the SystemCoreClock value is
184+
* retrieved from the secure domain via a Non-Secure Callable function
185+
* since the RCC peripheral may be protected with security attributes
186+
* that prevent to compute the SystemCoreClock variable from the RCC
187+
* peripheral registers.
188+
*
189+
* @note Each time the core clock (HCLK) changes, this function must be called
190+
* to update SystemCoreClock variable value. Otherwise, any configuration
191+
* based on this variable will be incorrect.
192+
*
193+
* @note - The system frequency computed by this function is not the real
194+
* frequency in the chip. It is calculated based on the predefined
195+
* constant and the selected clock source:
196+
*
197+
* - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*)
198+
*
199+
* - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**)
200+
*
201+
* - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***)
202+
*
203+
* - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***)
204+
* or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors.
205+
*
206+
* (*) MSI_VALUE is a constant defined in stm32l5xx_hal.h file (default value
207+
* 4 MHz) but the real value may vary depending on the variations
208+
* in voltage and temperature.
209+
*
210+
* (**) HSI_VALUE is a constant defined in stm32l5xx_hal.h file (default value
211+
* 16 MHz) but the real value may vary depending on the variations
212+
* in voltage and temperature.
213+
*
214+
* (***) HSE_VALUE is a constant defined in stm32l5xx_hal.h file (default value
215+
* 8 MHz), user has to ensure that HSE_VALUE is same as the real
216+
* frequency of the crystal used. Otherwise, this function may
217+
* have wrong result.
218+
*
219+
* - The result of this function could be not correct when using fractional
220+
* value for HSE crystal.
221+
*
222+
* @retval None
223+
*/
224+
void SystemCoreClockUpdate(void)
225+
{
226+
/* Get the SystemCoreClock value from the secure domain */
227+
SystemCoreClock = SECURE_SystemCoreClockUpdate();
228+
}
229+
230+
231+
/**
232+
* @}
233+
*/
234+
235+
/**
236+
* @}
237+
*/
238+
239+
/**
240+
* @}
241+
*/
242+
243+
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

0 commit comments

Comments
 (0)