NUCLEO-WL55JC1 Dual-Core project: CM4 runs, CM0+ doesn’t start after reset
Hello ST Community and ST Engineers,
I am currently working with a NUCLEO-WL55JC1 (STM32WL55 dual-core: Cortex-M4 + Cortex-M0+) and I am facing an issue when using dual-core projects generated with STM32CubeMX. I would really appreciate any guidance or confirmation from ST engineers or experienced users.
Hardware / Software:
-
Board: NUCLEO-WL55JC1 (STM32WL55 CM4 + CM0+)
-
Tools: STM32CubeIDE, STM32CubeMX, STM32CubeProgrammer
-
Also tested using VSCode with STM32 extensions
-
Firmware packages tested:
-
STM32Cube_FW_WL_V1.3.0
-
STM32Cube_FW_WL_V1.4.0
-
-
Examples tested:
-
LoRaWAN_End_Node
-
LoRaWAN_End_Node_FreeRTOS
-
LoRaWAN_End_Node_DualCore
-
LoRaWAN_End_Node_DualCoreFreeRTOS
-
References followed:
-
YouTube (LoRaWAN workflow overview): https://www.youtube.com/watch?v=8KNfrWoa1fw
-
Dual-core from scratch and CM4/CM0+ LED blink walkthroughs:
Summary of the issue:
Single-core projects work perfectly on my board (including LoRaWAN and FreeRTOS). However, when I generate a dual-core project, CM4 always runs but CM0+ does not start after reset or after programming from STM32CubeIDE.
What works:
-
Single-core CubeMX projects: OK.
-
Dual-core LED blink examples sometimes show CM0+ activity, but only under very specific conditions.
What fails:
In dual-core projects generated by CubeMX:
-
After pressing the hardware RESET button, only CM4 firmware runs.
-
After power cycling the board, only CM4 firmware runs.
-
After programming from STM32CubeIDE, only CM4 firmware runs.
Observations:
-
Flashing appears correct
Using STM32CubeProgrammer, I verified that the CM0+ image is programmed in the expected flash region (according to STM32WL55XX_FLASH_CM0P.ld). -
CM0+ only runs when forced to execute after programming
If I program the CM0+ ELF using STM32CubeProgrammer and enable "Execute after programming", CM0+ runs (LED blink visible). However, this behavior does not survive reset or power cycling. -
Clock-dependent behavior on CM0+
CM0+ LED blinking works only when using a crude busy-wait for-loop delay (no timer or SysTick). When using clock-based delays, CM0+ seems not to execute unless manually forced after flashing.
Things already tried:
-
CPU2 release and dual-core boot sequences following ST templates (HSEM usage, release timing, etc.)
-
Different placement of CPU2 release in CM4 main()
-
Multiple clock configurations in CubeMX
-
Verification of IPCC configuration and IRQs
-
Verification of CM0+ linker script and vector table location
-
Multiple flashing orders (CM4 first, CM0+ first)
-
CubeProgrammer vs CubeIDE programming
Key suspicion:
It looks like CM0+ is not being started automatically after reset, and it only runs when CubeProgrammer forces execution immediately after flashing.
Questions:
-
What is the recommended and reset-safe way to ensure CM0+ boots every time on STM32WL55 dual-core projects?
-
Are there any required Option Bytes for dual-core boot on STM32WL55, or is CM0+ startup purely controlled by CM4?
-
Is there a CubeIDE configuration required to ensure both cores are started after programming and after reset?
-
Is the observed behavior (CM0+ only running when manually executed after programming) expected or indicative of a configuration issue?
I can provide CubeMX .ioc files, ELF/MAP files, and CubeProgrammer screenshots if needed.
Thank you very much in advance for your help.
Best regards,
Ignacio
