Skip to content

Commit 605bf03

Browse files
committed
STM32L5 : add QSPI support
1 parent fde2a5c commit 605bf03

File tree

2 files changed

+25
-4
lines changed

2 files changed

+25
-4
lines changed

targets/TARGET_STM/TARGET_STM32L5/objects.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,17 @@ struct can_s {
155155
};
156156
#endif
157157

158+
struct qspi_s {
159+
OSPI_HandleTypeDef handle;
160+
QSPIName qspi;
161+
PinName io0;
162+
PinName io1;
163+
PinName io2;
164+
PinName io3;
165+
PinName sclk;
166+
PinName ssel;
167+
};
168+
158169
#ifdef __cplusplus
159170
}
160171
#endif

targets/TARGET_STM/qspi_api.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -387,15 +387,18 @@ qspi_status_t qspi_init_direct(qspi_t *obj, const qspi_pinmap_t *pinmap, uint32_
387387
static qspi_status_t _qspi_init_direct(qspi_t *obj, const qspi_pinmap_t *pinmap, uint32_t hz, uint8_t mode)
388388
#endif
389389
{
390-
OSPIM_CfgTypeDef OSPIM_Cfg_Struct = {0};
391390
tr_info("qspi_init mode %u", mode);
392391

393392
// Reset handle internal state
394393
obj->handle.State = HAL_OSPI_STATE_RESET;
395394

396395
// Set default OCTOSPI handle values
397396
obj->handle.Init.DualQuad = HAL_OSPI_DUALQUAD_DISABLE;
398-
obj->handle.Init.MemoryType = HAL_OSPI_MEMTYPE_MICRON;
397+
#if defined(TARGET_MX25LM51245G)
398+
obj->handle.Init.MemoryType = HAL_OSPI_MEMTYPE_MACRONIX; // Read sequence in DTR mode: D1-D0-D3-D2
399+
#else
400+
obj->handle.Init.MemoryType = HAL_OSPI_MEMTYPE_MICRON; // Read sequence in DTR mode: D0-D1-D2-D3
401+
#endif
399402
obj->handle.Init.ClockPrescaler = 4; // default value, will be overwritten in qspi_frequency
400403
obj->handle.Init.FifoThreshold = 4;
401404
obj->handle.Init.SampleShifting = HAL_OSPI_SAMPLE_SHIFTING_NONE;
@@ -406,6 +409,9 @@ static qspi_status_t _qspi_init_direct(qspi_t *obj, const qspi_pinmap_t *pinmap,
406409
obj->handle.Init.ClockMode = mode == 0 ? HAL_OSPI_CLOCK_MODE_0 : HAL_OSPI_CLOCK_MODE_3;
407410
obj->handle.Init.DelayHoldQuarterCycle = HAL_OSPI_DHQC_ENABLE;
408411
obj->handle.Init.ChipSelectBoundary = 0;
412+
#if defined(HAL_OSPI_DELAY_BLOCK_USED) // STM32L5
413+
obj->handle.Init.DelayBlockBypass = HAL_OSPI_DELAY_BLOCK_USED;
414+
#endif
409415

410416
// tested all combinations, take first
411417
obj->qspi = pinmap->peripheral;
@@ -424,15 +430,13 @@ static qspi_status_t _qspi_init_direct(qspi_t *obj, const qspi_pinmap_t *pinmap,
424430
#if defined(OCTOSPI1)
425431
if (obj->qspi == QSPI_1) {
426432
__HAL_RCC_OSPI1_CLK_ENABLE();
427-
__HAL_RCC_OSPIM_CLK_ENABLE();
428433
__HAL_RCC_OSPI1_FORCE_RESET();
429434
__HAL_RCC_OSPI1_RELEASE_RESET();
430435
}
431436
#endif
432437
#if defined(OCTOSPI2)
433438
if (obj->qspi == QSPI_2) {
434439
__HAL_RCC_OSPI2_CLK_ENABLE();
435-
__HAL_RCC_OSPIM_CLK_ENABLE();
436440
__HAL_RCC_OSPI2_FORCE_RESET();
437441
__HAL_RCC_OSPI2_RELEASE_RESET();
438442
}
@@ -459,6 +463,11 @@ static qspi_status_t _qspi_init_direct(qspi_t *obj, const qspi_pinmap_t *pinmap,
459463
pin_function(pinmap->ssel_pin, pinmap->ssel_function);
460464
pin_mode(pinmap->ssel_pin, PullNone);
461465

466+
#if defined(OCTOSPI2)
467+
__HAL_RCC_OSPIM_CLK_ENABLE();
468+
469+
OSPIM_CfgTypeDef OSPIM_Cfg_Struct = {0};
470+
462471
/* The OctoSPI IO Manager OCTOSPIM configuration is supported in a simplified mode in mbed-os
463472
* QSPI1 signals are mapped to port 1 and QSPI2 signals are mapped to port 2.
464473
* This is coded in this way in PeripheralPins.c */
@@ -480,6 +489,7 @@ static qspi_status_t _qspi_init_direct(qspi_t *obj, const qspi_pinmap_t *pinmap,
480489
tr_error("HAL_OSPIM_Config error");
481490
return QSPI_STATUS_ERROR;
482491
}
492+
#endif
483493

484494
return qspi_frequency(obj, hz);
485495
}

0 commit comments

Comments
 (0)