Skip to content

Commit c4c2877

Browse files
authored
Merge pull request #14149 from jeromecoutant/PR_G4
STM32G4: enable TRNG and correct dual bank flash detection
2 parents 97c7c91 + 61d00d8 commit c4c2877

File tree

4 files changed

+43
-28
lines changed

4 files changed

+43
-28
lines changed

targets/TARGET_STM/TARGET_STM32G4/TARGET_STM32G474xE/system_clock.c

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,14 @@
2020
* | 2- USE_PLL_HSE_XTAL (external 8 MHz xtal)
2121
* | 3- USE_PLL_HSI (internal 16 MHz)
2222
*-----------------------------------------------------------------
23-
* SYSCLK(MHz) | 64
24-
* AHBCLK (MHz) | 64
25-
* APB1CLK (MHz) | 64
23+
* SYSCLK(MHz) | 160 (default configuration) / 170 (CAN disabled)
2624
* USB capable | NO
2725
*-----------------------------------------------------------------
2826
*/
2927

3028
#include "stm32g4xx.h"
3129
#include "mbed_error.h"
3230

33-
/*!< Uncomment the following line if you need to relocate your vector Table in
34-
Internal SRAM. */
35-
/* #define VECT_TAB_SRAM */
36-
#define VECT_TAB_OFFSET 0x00U /*!< Vector Table base offset field.
37-
This value must be a multiple of 0x100. */
38-
3931
#define USE_PLL_HSE_EXTC 0x8 // Use external clock (ST Link MCO)
4032
#define USE_PLL_HSE_XTAL 0x4 // Use external xtal (X3 on board)
4133
#define USE_PLL_HSI 0x2 // Use HSI internal clock
@@ -90,16 +82,19 @@ void SetSysClock(void)
9082
/******************************************************************************/
9183
/* PLL (clocked by HSE) used as System clock source */
9284
/******************************************************************************/
93-
uint8_t SetSysClock_PLL_HSE(uint8_t bypass)
85+
MBED_WEAK uint8_t SetSysClock_PLL_HSE(uint8_t bypass)
9486
{
9587
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
9688
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
9789

98-
/** Configure the main internal regulator output voltage
99-
*/
90+
#if HSE_VALUE != 24000000
91+
#error Unsupported externall clock value, check HSE_VALUE define
92+
#endif
93+
94+
/* Configure the main internal regulator output voltage */
95+
__HAL_RCC_PWR_CLK_ENABLE();
10096
HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1_BOOST);
101-
/** Initializes the CPU, AHB and APB busses clocks
102-
*/
97+
10398
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
10499
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
105100
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
@@ -116,18 +111,20 @@ uint8_t SetSysClock_PLL_HSE(uint8_t bypass)
116111
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
117112
RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
118113
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
114+
#if defined(DEVICE_TRNG)
115+
RCC_OscInitStruct.OscillatorType |= RCC_OSCILLATORTYPE_HSI48;
116+
RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
117+
#endif
119118
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
120119
return 0; // FAIL
121120
}
122-
/** Initializes the CPU, AHB and APB busses clocks
123-
*/
121+
124122
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
125123
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
126124
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
127125
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
128126
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
129127
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
130-
131128
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_8) != HAL_OK) {
132129
return 0; // FAIL
133130
}
@@ -145,33 +142,41 @@ uint8_t SetSysClock_PLL_HSI(void)
145142
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
146143
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
147144

148-
/** Configure the main internal regulator output voltage
149-
*/
150-
HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);
151-
/** Initializes the CPU, AHB and APB busses clocks
152-
*/
145+
/* Configure the main internal regulator output voltage */
146+
__HAL_RCC_PWR_CLK_ENABLE();
147+
HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1_BOOST);
148+
153149
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
154150
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
155151
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
156152
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
157153
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
158154
RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV4;
155+
//! 170MHz as a core frequency for FDCAN is not suitable for many frequencies,
156+
//! as it provides low accuracy. When no FDCAN is used, the full capacity of 170 MHz
157+
//! should be standard.
158+
#if DEVICE_CAN
159+
RCC_OscInitStruct.PLL.PLLN = 80;
160+
#else
159161
RCC_OscInitStruct.PLL.PLLN = 85;
162+
#endif
160163
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
161164
RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
162165
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
166+
#if defined(DEVICE_TRNG)
167+
RCC_OscInitStruct.OscillatorType |= RCC_OSCILLATORTYPE_HSI48;
168+
RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
169+
#endif
163170
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
164171
return 0; // FAIL
165172
}
166-
/** Initializes the CPU, AHB and APB busses clocks
167-
*/
173+
168174
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
169175
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
170176
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
171177
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
172178
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
173179
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
174-
175180
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_8) != HAL_OK) {
176181
return 0; // FAIL
177182
}

targets/TARGET_STM/TARGET_STM32G4/flash_api.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ static uint32_t GetPage(uint32_t Addr)
4848
static uint32_t GetBank(uint32_t Addr)
4949
{
5050
uint32_t bank = 0;
51-
#if defined(SYSCFG_MEMRMP_FB_MODE) && defined(FLASH_OPTR_DBANK)
51+
#if defined (FLASH_OPTR_DBANK)
5252
if (READ_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_FB_MODE) == 0) {
5353
/* No Bank swap */
5454
if (Addr < (FLASH_BASE + FLASH_BANK_SIZE)) {
@@ -106,7 +106,6 @@ int32_t flash_erase_sector(flash_t *obj, uint32_t address)
106106
int32_t status = 0;
107107

108108
if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
109-
110109
return -1;
111110
}
112111

targets/TARGET_STM/trng_api.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ void trng_init(trng_t *obj)
3737
{
3838
uint32_t dummy;
3939

40-
#if defined(RCC_PERIPHCLK_RNG) /* STM32L4 / STM32H7 / STM32WB */
40+
#if defined(RCC_PERIPHCLK_RNG) /* STM32L4 / STM32H7 / STM32WB / STM32G4 */
4141

4242
#if defined(TARGET_STM32WB)
4343
/* No need to configure RngClockSelection as already done in SetSysClock */
@@ -81,6 +81,16 @@ void trng_init(trng_t *obj)
8181
}
8282
}
8383

84+
#elif defined(TARGET_STM32G4)
85+
/* RNG and USB clocks have the same HSI48 source which has been enabled in SetSysClock */
86+
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
87+
88+
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RNG;
89+
PeriphClkInitStruct.RngClockSelection = RCC_RNGCLKSOURCE_HSI48;
90+
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) {
91+
error("RNG clock configuration error\n");
92+
}
93+
8494
#elif defined(TARGET_STM32L5)
8595
/* No need to reconfigure RngClockSelection as alreday done in SetSysClock */
8696

targets/targets.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2635,6 +2635,7 @@
26352635
"ANALOGOUT",
26362636
"FLASH",
26372637
"MPU",
2638+
"TRNG",
26382639
"CAN"
26392640
]
26402641
},

0 commit comments

Comments
 (0)