Unable To Activate PLL64M on STM32WB05TZ/BlueNRG-LPS
I'm building an application for a BlueNRG-LPS (332), now rebranded as STM32WB05TZ (WLCSP-36 Package) by starting with a simply Blinky project testing the clock signals of my device. I need to enable the PLL64M clock source to use the radio peripherals, and the generated configuration fails. Maybe I'm missing to add or properly set up something here?
Context:
I'm using STM32CubeIDE 1.16.0 with STM32Cube FW_WB0 V1.0.0 to generate some basic code.
Initially, all the Radio Peripherals are OFF, I'm using a 32MHz external crystal for the HSE, and do not have an LSE installed on my PCB (planning to have one, but for now, using the LSI).
In my particular case, I added external 12pF capacitors to my HSE crystal, and set the chip's internal tuning capacitors to 0. (Ignore the inductor symbol, this is only a 0ohm resistor)

The PCB has the hardware to not work on SMPS mode (no Inductor), tried 2.4V and 3.3V as the VDD source with similar results.
My clock tree initially looked like following image, checking the MCO pin with an oscilloscope tells me that indeed the HSE signal looked proper. (1MHz as expected after the 32x division on the pin itself).


Using the exact same settings, but changing the RC64MPLL from using HSI RC to PLL64M input, fails with the following error:

// main.c
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Configure the SYSCLKSource and SYSCLKDivider
*/
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_RC64MPLL;
RCC_ClkInitStruct.SYSCLKDivider = RCC_RC64MPLL_DIV2;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_WAIT_STATES_0) != HAL_OK)
{
Error_Handler(); // <-------------------------------------------------- FAILS HERE
}
HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_32);
HAL_RCCEx_EnableLSCO(RCC_LSCO1, RCC_LSCOSOURCE_LSI);
}
Stepping further within "HAL_RCC_ClockConfig":
//stm32wb0x_hal_rcc.c
/* RC64MPLL is selected as System Clock Source */
if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_RC64MPLL)
{
/* Check the HSI ready flag */
if (LL_RCC_HSI_IsReady() == 0U)
{
return HAL_ERROR;
}
/* Check the HSE ready flag */
if (LL_RCC_HSE_IsReady() == 0U)
{
return HAL_ERROR;
}
/* Enable the RC64MPLL*/
__HAL_RCC_RC64MPLL_ENABLE();
/* Get Start Tick*/
tickstart = HAL_GetTick();
/* Wait till RC64MPLL is ready */
while (LL_RCC_RC64MPLL_IsReady() == 0)
{
if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE)
{
return HAL_TIMEOUT; // <---------------------------------------- FAILS HERE
}
}
/* Configure the RC64MPLL multiplication factor */
__HAL_RCC_RC64MPLL_PRESC_CONFIG(RCC_ClkInitStruct->SYSCLKDivider);
}
Other notes:
While loop only has GPIO toggle function and nothing else.
Any hints as to why the LL_RCC_RC64MPLL_IsReady() would constantly fail?
Thanks,
DC.
