Skip to content

Commit f6f20ca

Browse files
iabdalkaderfacchinm
authored andcommitted
SDRAM: Fix FMC PLL settings for 16MHz and 25MHz HSE.
1 parent b20c4e0 commit f6f20ca

File tree

2 files changed

+23
-16
lines changed

2 files changed

+23
-16
lines changed

Diff for: libraries/Portenta_SDRAM/src/ram_internal.c

+14-9
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,24 @@ static HAL_StatusTypeDef FMC_SDRAM_Clock_Config(void)
3737
{
3838
RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct;
3939

40-
/* PLL2_VCO Input = HSE_VALUE/PLL2_M = 5 Mhz */
41-
/* PLL2_VCO Output = PLL2_VCO Input * PLL_N = 800 Mhz */
42-
/* FMC Kernel Clock = PLL2_VCO Output/PLL_R = 800/4 = 200 Mhz */
4340
RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_FMC;
4441
RCC_PeriphCLKInitStruct.FmcClockSelection = RCC_FMCCLKSOURCE_PLL2;
4542
#ifdef ARDUINO_GIGA
46-
RCC_PeriphCLKInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_3;
47-
RCC_PeriphCLKInitStruct.PLL2.PLL2M = 2;
48-
RCC_PeriphCLKInitStruct.PLL2.PLL2N = 60;
43+
/* 16MHz HSE */
44+
/* PLL2_VCO Input = HSE_VALUE/PLL2_M = (16/4) = 4 Mhz */
45+
/* PLL2_VCO Output = PLL2_VCO Input * PLL_N = 4*100 = 400 Mhz */
46+
/* FMC Kernel Clock = PLL2_VCO Output/PLL_R = 400/2 = 200 Mhz */
47+
RCC_PeriphCLKInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_2;
48+
RCC_PeriphCLKInitStruct.PLL2.PLL2M = 4;
49+
RCC_PeriphCLKInitStruct.PLL2.PLL2N = 100;
4950
#else
51+
/* 25MHz HSE */
52+
/* PLL2_VCO Input = HSE_VALUE/PLL2_M = 25/5 = 5 Mhz */
53+
/* PLL2_VCO Output = PLL2_VCO Input * PLL_N = 5*80 = 400 Mhz */
54+
/* FMC Kernel Clock = PLL2_VCO Output/PLL_R = 400/2 = 200 Mhz */
5055
RCC_PeriphCLKInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_2;
5156
RCC_PeriphCLKInitStruct.PLL2.PLL2M = 5;
52-
RCC_PeriphCLKInitStruct.PLL2.PLL2N = 95;
57+
RCC_PeriphCLKInitStruct.PLL2.PLL2N = 80;
5358
#endif
5459
RCC_PeriphCLKInitStruct.PLL2.PLL2FRACN = 0;
5560
RCC_PeriphCLKInitStruct.PLL2.PLL2P = 2;
@@ -150,7 +155,7 @@ bool sdram_init(void) {
150155

151156
/* SDRAM device configuration */
152157
hsdram.Instance = FMC_SDRAM_DEVICE;
153-
/* Timing configuration for 90 Mhz of SD clock frequency (180Mhz/2) */
158+
/* Timing configuration for 100 Mhz of SD clock frequency (200Mhz/2) */
154159
/* TMRD: 2 Clock cycles */
155160
SDRAM_Timing.LoadToActiveDelay = MICROPY_HW_SDRAM_TIMING_TMRD;
156161
/* TXSR: min=70ns (6x11.90ns) */
@@ -247,7 +252,7 @@ static void sdram_init_seq(SDRAM_HandleTypeDef
247252
we also need to subtract 20 from the value, so the target
248253
refresh rate is 703 - 20 = 683.
249254
*/
250-
#define REFRESH_COUNT (MICROPY_HW_SDRAM_REFRESH_RATE * 90000 / 8192 - 20)
255+
#define REFRESH_COUNT (MICROPY_HW_SDRAM_REFRESH_RATE * MICROPY_HW_SDRAM_FREQUENCY / MICROPY_HW_SDRAM_REFRESH_CYCLES - 20)
251256
HAL_SDRAM_ProgramRefreshRate(hsdram, REFRESH_COUNT);
252257
}
253258

Diff for: libraries/Portenta_SDRAM/src/ram_internal.h

+9-7
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,26 @@ bool sdram_init(void);
55

66
#define MICROPY_HW_SDRAM_TIMING_TMRD (2)
77
#define MICROPY_HW_SDRAM_TIMING_TXSR (7)
8-
#define MICROPY_HW_SDRAM_TIMING_TRAS (4)
8+
#define MICROPY_HW_SDRAM_TIMING_TRAS (5)
99
#define MICROPY_HW_SDRAM_TIMING_TRC (7)
1010
#define MICROPY_HW_SDRAM_TIMING_TWR (2)
11-
#define MICROPY_HW_SDRAM_TIMING_TRP (2)
12-
#define MICROPY_HW_SDRAM_TIMING_TRCD (2)
11+
#define MICROPY_HW_SDRAM_TIMING_TRP (3)
12+
#define MICROPY_HW_SDRAM_TIMING_TRCD (3)
1313
#define MICROPY_HW_SDRAM_REFRESH_RATE (64) // ms
14+
#define MICROPY_HW_SDRAM_FREQUENCY (100000) // 100 MHz
15+
#define MICROPY_HW_SDRAM_REFRESH_CYCLES 4096
1416

15-
#define MICROPY_HW_SDRAM_BURST_LENGTH 2
17+
#define MICROPY_HW_SDRAM_BURST_LENGTH 1
1618
#define MICROPY_HW_SDRAM_CAS_LATENCY 2
1719
#define MICROPY_HW_SDRAM_COLUMN_BITS_NUM 8
1820
#define MICROPY_HW_SDRAM_ROW_BITS_NUM 12
1921
#define MICROPY_HW_SDRAM_MEM_BUS_WIDTH 16
2022
#define MICROPY_HW_SDRAM_INTERN_BANKS_NUM 4
2123
#define MICROPY_HW_SDRAM_CLOCK_PERIOD 2
22-
#define MICROPY_HW_SDRAM_RPIPE_DELAY 1
23-
#define MICROPY_HW_SDRAM_RBURST (0)
24+
#define MICROPY_HW_SDRAM_RPIPE_DELAY 0
25+
#define MICROPY_HW_SDRAM_RBURST (1)
2426
#define MICROPY_HW_SDRAM_WRITE_PROTECTION (0)
25-
#define MICROPY_HW_SDRAM_AUTOREFRESH_NUM (4)
27+
#define MICROPY_HW_SDRAM_AUTOREFRESH_NUM (8)
2628

2729
#define HW_SDRAM_SIZE (8 * 1024 * 1024)
2830

0 commit comments

Comments
 (0)