Skip to content

Commit edaf4cd

Browse files
committed
PortentaH7: self configure HSE based on bootloader information
PortentaH7: change ext clock speed based on bootloader provided info Portenta: Use slower clock in bootloader fixed isBootloader to correctly report status
1 parent ccedc62 commit edaf4cd

File tree

4 files changed

+38
-7
lines changed

4 files changed

+38
-7
lines changed

targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_PORTENTA_H7/system_clock.c

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,11 @@ void SetSysClock(void)
8585
}
8686
}
8787

88+
static const uint32_t _keep;
89+
bool isBootloader() {
90+
return ((uint32_t)&_keep < 0x8040000);
91+
}
92+
8893
#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )
8994
/******************************************************************************/
9095
/* PLL (clocked by HSE) used as System clock source */
@@ -109,7 +114,12 @@ uint8_t SetSysClock_PLL_HSE(uint8_t bypass)
109114
/* Supply configuration update enable */
110115
HAL_PWREx_ConfigSupply(PWR_SMPS_1V8_SUPPLIES_LDO);
111116
/* Configure the main internal regulator output voltage */
112-
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
117+
118+
if (isBootloader()) {
119+
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);
120+
} else {
121+
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
122+
}
113123

114124
while (!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
115125

@@ -123,8 +133,12 @@ uint8_t SetSysClock_PLL_HSE(uint8_t bypass)
123133
RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
124134
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
125135
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
126-
RCC_OscInitStruct.PLL.PLLM = 9;
127-
RCC_OscInitStruct.PLL.PLLN = 300;
136+
RCC_OscInitStruct.PLL.PLLM = 5;
137+
if (isBootloader()) {
138+
RCC_OscInitStruct.PLL.PLLN = 40;
139+
} else {
140+
RCC_OscInitStruct.PLL.PLLN = 160;
141+
}
128142
RCC_OscInitStruct.PLL.PLLFRACN = 0;
129143
RCC_OscInitStruct.PLL.PLLP = 2;
130144
RCC_OscInitStruct.PLL.PLLR = 2;
@@ -202,7 +216,7 @@ uint8_t SetSysClock_PLL_HSI(void)
202216
RCC_OscInitStruct.PLL.PLLQ = 10;
203217
RCC_OscInitStruct.PLL.PLLR = 2;
204218
RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
205-
RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
219+
RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;
206220
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
207221
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
208222
return 0; // FAIL

targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_PORTENTA_H7/system_stm32h7xx.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,12 @@
5252
#include <math.h>
5353
#include "nvic_addr.h" // MBED PATCH for Bootloader
5454

55-
#if !defined (HSE_VALUE)
56-
#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
55+
#if defined (HSE_VALUE)
56+
#undef HSE_VALUE
5757
#endif /* HSE_VALUE */
5858

59+
uint32_t HSE_VALUE = ((uint32_t)25000000);
60+
5961
#if !defined (CSI_VALUE)
6062
#define CSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/
6163
#endif /* CSI_VALUE */
@@ -300,6 +302,13 @@ void SystemCoreClockUpdate (void)
300302
uint32_t pllp, pllsource, pllm, pllfracen, hsivalue, tmp;
301303
float_t fracn1, pllvco;
302304

305+
uint8_t* bootloader_data = (uint8_t*)(0x801F000);
306+
if (bootloader_data[0] != 0xA0 || bootloader_data[1] < 14) {
307+
HSE_VALUE = 27000000;
308+
} else {
309+
HSE_VALUE = bootloader_data[10] * 1000000;
310+
}
311+
303312
/* Get SYSCLK source -------------------------------------------------------*/
304313

305314
switch (RCC->CFGR & RCC_CFGR_SWS)
@@ -319,6 +328,7 @@ void SystemCoreClockUpdate (void)
319328

320329
case RCC_CFGR_SWS_PLL1: /* PLL1 used as system clock source */
321330

331+
322332
/* PLL_VCO = (HSE_VALUE or HSI_VALUE or CSI_VALUE/ PLLM) * PLLN
323333
SYSCLK = PLL_VCO / PLLR
324334
*/

targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_PORTENTA_H7_M7/TOOLCHAIN_GCC_ARM/STM32H747xI.ld

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ MEMORY
3939
__OPENAMP_region_start__ = ORIGIN(OPEN_AMP_SHMEM);
4040
__OPENAMP_region_end__ = ORIGIN(OPEN_AMP_SHMEM) + LENGTH(OPEN_AMP_SHMEM);
4141

42+
_ConfigStart = 0x0801F000;
43+
4244
/* Linker script to place sections and symbol values. Should be used together
4345
* with other linker script that defines memory regions FLASH and RAM.
4446
* It references following symbols, which must be defined in code:
@@ -96,6 +98,11 @@ SECTIONS
9698
KEEP(*(.eh_frame*))
9799
} > FLASH
98100

101+
.ConfigData _ConfigStart :
102+
{
103+
KEEP(*(.bootloader_version))
104+
} > FLASH
105+
99106
.ARM.extab :
100107
{
101108
*(.ARM.extab* .gnu.linkonce.armextab.*)

targets/targets.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2703,7 +2703,7 @@
27032703
},
27042704
"hse_value": {
27052705
"help": "HSE default value is 27MHz in HAL",
2706-
"value": "27000000",
2706+
"value": "25000000",
27072707
"macro_name": "HSE_VALUE"
27082708
},
27092709
"usb_speed": {

0 commit comments

Comments
 (0)