17
17
*/
18
18
19
19
#include " pins_arduino.h"
20
+ #include " otp.h"
20
21
21
22
#ifdef __cplusplus
22
23
extern " C" {
@@ -88,6 +89,36 @@ const PinName digitalPin[] = {
88
89
extern " C" {
89
90
#endif
90
91
92
+ static uint8_t *OTP_Read (uint8_t id)
93
+ {
94
+ uint8_t *p_id;
95
+
96
+ p_id = (uint8_t *)(CFG_OTP_END_ADDRESS - 7 ) ;
97
+
98
+ while (((*(p_id + 7 )) != id) && (p_id != (uint8_t *)CFG_OTP_BASE_ADDRESS)) {
99
+ p_id -= 8 ;
100
+ }
101
+
102
+ if ((*(p_id + 7 )) != id) {
103
+ p_id = 0 ;
104
+ }
105
+
106
+ return p_id ;
107
+ }
108
+
109
+ static void Config_HSE (void )
110
+ {
111
+ OTP_ID0_t *p_otp;
112
+
113
+ /* *
114
+ * Read HSE_Tuning from OTP
115
+ */
116
+ p_otp = (OTP_ID0_t *) OTP_Read (0 );
117
+ if (p_otp) {
118
+ LL_RCC_HSE_SetCapacitorTuning (p_otp->hse_tuning );
119
+ }
120
+ }
121
+
91
122
/* *
92
123
* @brief System Clock Configuration
93
124
* @param None
@@ -99,60 +130,58 @@ WEAK void SystemClock_Config(void)
99
130
RCC_ClkInitTypeDef RCC_ClkInitStruct = {};
100
131
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {};
101
132
102
- /* Configure LSE Drive Capability */
133
+ Config_HSE ();
134
+
103
135
__HAL_RCC_LSEDRIVE_CONFIG (RCC_LSEDRIVE_LOW);
104
- /* Configure the main internal regulator output voltage */
105
136
__HAL_PWR_VOLTAGESCALING_CONFIG (PWR_REGULATOR_VOLTAGE_SCALE1);
106
- /* Initializes the CPU, AHB and APB busses clocks */
107
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE
108
- | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_MSI;
137
+
138
+ /* Initializes the CPU, AHB and APB busses clocks */
139
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSI48
140
+ | RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_LSE;
109
141
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
110
- RCC_OscInitStruct.LSEState = RCC_LSE_ON;
111
142
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
112
- RCC_OscInitStruct.MSIState = RCC_MSI_ON;
143
+ RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
144
+ RCC_OscInitStruct.LSEState = RCC_LSE_ON;
113
145
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
114
- RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
115
- RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;
116
- RCC_OscInitStruct.PLL .PLLState = RCC_PLL_ON;
117
- RCC_OscInitStruct.PLL .PLLSource = RCC_PLLSOURCE_MSI;
118
- RCC_OscInitStruct.PLL .PLLM = RCC_PLLM_DIV1;
119
- RCC_OscInitStruct.PLL .PLLN = 32 ;
120
- RCC_OscInitStruct.PLL .PLLP = RCC_PLLP_DIV2;
121
- RCC_OscInitStruct.PLL .PLLR = RCC_PLLR_DIV2;
122
- RCC_OscInitStruct.PLL .PLLQ = RCC_PLLQ_DIV2;
146
+ RCC_OscInitStruct.PLL .PLLState = RCC_PLL_NONE;
123
147
if (HAL_RCC_OscConfig (&RCC_OscInitStruct) != HAL_OK) {
124
148
Error_Handler ();
125
149
}
150
+
126
151
/* Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers */
127
152
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4 | RCC_CLOCKTYPE_HCLK2
128
153
| RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
129
154
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
130
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK ;
155
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE ;
131
156
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
132
157
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
133
158
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
134
- RCC_ClkInitStruct.AHBCLK2Divider = RCC_SYSCLK_DIV2 ;
159
+ RCC_ClkInitStruct.AHBCLK2Divider = RCC_SYSCLK_DIV1 ;
135
160
RCC_ClkInitStruct.AHBCLK4Divider = RCC_SYSCLK_DIV1;
136
-
137
- if (HAL_RCC_ClockConfig (&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK) {
161
+ if (HAL_RCC_ClockConfig (&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) {
138
162
Error_Handler ();
139
163
}
140
- /* Initializes the peripherals clocks */
141
- PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS | RCC_PERIPHCLK_USB;
142
- PeriphClkInitStruct.PLLSAI1 .PLLN = 24 ;
143
- PeriphClkInitStruct.PLLSAI1 .PLLP = RCC_PLLP_DIV2;
144
- PeriphClkInitStruct.PLLSAI1 .PLLQ = RCC_PLLQ_DIV2;
145
- PeriphClkInitStruct.PLLSAI1 .PLLR = RCC_PLLR_DIV2;
146
- PeriphClkInitStruct.PLLSAI1 .PLLSAI1ClockOut = RCC_PLLSAI1_USBCLK;
147
- PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_PLLSAI1;
148
- PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSI;
149
- PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE0;
150
164
165
+ /* Initializes the peripherals clocks */
166
+ /* RNG needs to be configured like in M0 core, i.e. with HSI48 */
167
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS | RCC_PERIPHCLK_RFWAKEUP
168
+ | RCC_PERIPHCLK_RNG | RCC_PERIPHCLK_USB;
169
+ PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
170
+ PeriphClkInitStruct.RngClockSelection = RCC_RNGCLKSOURCE_HSI48;
171
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
172
+ PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
173
+ PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1;
151
174
if (HAL_RCCEx_PeriphCLKConfig (&PeriphClkInitStruct) != HAL_OK) {
152
175
Error_Handler ();
153
176
}
154
- /* Enable MSI Auto calibration */
155
- HAL_RCCEx_EnableMSIPLLMode ();
177
+
178
+ LL_PWR_SMPS_SetStartupCurrent (LL_PWR_SMPS_STARTUP_CURRENT_80MA);
179
+ LL_PWR_SMPS_SetOutputVoltageLevel (LL_PWR_SMPS_OUTPUT_VOLTAGE_1V40);
180
+ LL_PWR_SMPS_Enable ();
181
+
182
+ /* Select HSI as system clock source after Wake Up from Stop mode */
183
+ LL_RCC_SetClkAfterWakeFromStop (LL_RCC_STOP_WAKEUPCLOCK_HSI);
184
+
156
185
}
157
186
158
187
#ifdef __cplusplus
0 commit comments