För att ST rekommenderade den. Jag har noterat att med denna kristall så ska man ha high mode aktiverat. High mode: Valt high mode i STM32CubeIDE: Utplaceringen av min komponent. Men när jag startar min STM32 när LSE är aktiverad, då hamnar jag här. Sök efter pilen <-------------------------------------------.
Då är frågan. Varför blir det så?
Kod: Markera allt
/*------------------------------ LSE Configuration -------------------------*/
if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE)
{
FlagStatus pwrclkchanged = RESET;
/* Check the parameters */
assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState));
/* Update LSE configuration in Backup Domain control register */
/* Requires to enable write access to Backup Domain of necessary */
if(__HAL_RCC_PWR_IS_CLK_DISABLED())
{
__HAL_RCC_PWR_CLK_ENABLE();
pwrclkchanged = SET;
}
if(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP))
{
/* Enable write access to Backup domain */
SET_BIT(PWR->CR, PWR_CR_DBP);
/* Wait for Backup domain Write protection disable */
tickstart = HAL_GetTick();
while(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP))
{
if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE)
{
return HAL_TIMEOUT;
}
}
}
/* Set the new LSE configuration -----------------------------------------*/
__HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState);
/* Check the LSE State */
if(RCC_OscInitStruct->LSEState != RCC_LSE_OFF)
{
/* Get Start Tick */
tickstart = HAL_GetTick();
/* Wait till LSE is ready */
while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET)
{
if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE)
{
return HAL_TIMEOUT; <---------------------------------------------HÄR hamnar den tillslut.
}
}
}
else
{
/* Get Start Tick */
tickstart = HAL_GetTick();
/* Wait till LSE is disabled */
while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET)
{
if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE)
{
return HAL_TIMEOUT;
}
}
}
Kod: Markera allt
(((((((uint8_t)((((uint8_t)2U) << 5U) | ((uint8_t)__builtin_clz(__RBIT((0x1UL << (1U)))))))) >> 5U) == ((uint8_t)1U)) ? ((RCC_TypeDef *) ((0x40000000UL + 0x00020000UL) + 0x00001000UL))->CR : \
(((((uint8_t)((((uint8_t)2U) << 5U) | ((uint8_t)__builtin_clz(__RBIT((0x1UL << (1U)))))))) >> 5U) == ((uint8_t)2U))? ((RCC_TypeDef *) ((0x40000000UL + 0x00020000UL) + 0x00001000UL))->BDCR : \
(((((uint8_t)((((uint8_t)2U) << 5U) | ((uint8_t)__builtin_clz(__RBIT((0x1UL << (1U)))))))) >> 5U) == ((uint8_t)4U))? ((RCC_TypeDef *) ((0x40000000UL + 0x00020000UL) + 0x00001000UL))->CFGR : \
((RCC_TypeDef *) ((0x40000000UL + 0x00020000UL) + 0x00001000UL))->CSR) & (1U << ((((uint8_t)((((uint8_t)2U) << 5U) | ((uint8_t)__builtin_clz(__RBIT((0x1UL << (1U)))))))) & ((uint8_t)0x1FU))))
- 15 pF - Fungerade inte
- 4.7 pF - Fungerade inte
Vad finns det för slutsatser här?
- Kristallen är sönder? Jag kan ju mäta spänningen på kristallen (GND och valfri pinne PC14 eller PC15 för LSE). Dock ingen fyrkantsvåg, bara rakt streck.
- Felaktiga kondensatorer? Jag har införskaffat en samling nu. Allt från 1.0 pF till 22 nF.
- Bug i koden? Jag tänkte om koden allmänt är för snäv?