Sida 1 av 3

Lågkristallen startar inte igång min STM32 - Felsökning

Postat: 16 november 2021, 19:19:40
av DanielM
Jag tänker använda min LSE för att driva min RTC hos min STM32:a och då har jag satt dit en sådan.
Skärmklipp.PNG
För att ST rekommenderade den.
Skärmklipp.PNG
Jag har noterat att med denna kristall så ska man ha high mode aktiverat.
Skärmklipp.PNG
High mode:
Skärmklipp.PNG
Valt high mode i STM32CubeIDE:
Skärmklipp.PNG
Utplaceringen av min komponent.
Skärmklipp.PNG
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;
        }
      }
    }
__HAL_RCC_GET_FLAG() funktionen ser ut så här. Omöjligt att förstå vad dom har gjort.

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))))
Kondensatorerna jag använder är följande:
  • 15 pF - Fungerade inte
  • 4.7 pF - Fungerade inte
Skärmklipp.PNG
När jag mäter med mitt oscilloskop så får jag ingen fyrkantsvåg. Bara ett rak streck som förflyttar sig uppåt när den får kontakt med LSE. Det får jag inte heller på HSE (Externa high speed crystal). Den är ju på 8 MHz. Den fungerar utmärkt. Troligtvis sär mitt oscilloskop fö gammalt för att mäta frekvenser, trots att den har uS som valbar uppdateringsfrekvens.


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?

Re: Lågkristallen startar inte igång min STM32 - Felsökning

Postat: 16 november 2021, 19:32:12
av TomasL
Answer
In a commonly used approximation, the crystal capacitors rely on three parameters:
The Cl which is the crystal equivalent capacitance the crystal must see to operate at its typical frequency. This value is given by the crystal manufacturer.
The Ci which is the internal capacitance of the MCU oscillator (refer to “40. Electrical Characteristics” of the respective device datasheet).
The Cs which is the stray capacitance of the circuit board. The Cs is usually negligible as crystal is connected very close to the MCU.
C1 and C2 being the capacitance on XIN and XOUT pins, the calculation formula is:
Cl = (C1 * C2) / (C1 + C2) + Ci + Cs (1)

If we consider C1 = C2 = C and Cs negligible:
(1) => Cl = C / 2 + Ci (2)
(2) => C = 2(Cl - Ci)
Vilket betyder att du bör ha runt 25pF kondensatorer.

Sedan skall man vara försiktig med att mäta med ett skope på kristaller, då proben kapasitans mycket väl kan sparka igång kristallen.
Man skall alltid använda aktiva prober med 1pF kapacitans eller liknande, och mäta på rätt processorpinne.

Re: Lågkristallen startar inte igång min STM32 - Felsökning

Postat: 16 november 2021, 19:37:16
av DanielM
Oj. Detta är jag mycket osäker på om jag har sådana prober. Men jag testar att löda dit en 22 pF.

2(12.5 pF - 1.3 pF) = 22.4 pF. Jag antar att Ci är shuntkapacitansen.

Då tror jag väljer 22 pF

Re: Lågkristallen startar inte igång min STM32 - Felsökning

Postat: 16 november 2021, 19:39:17
av TomasL
he Ci which is the internal capacitance of the MCU oscillator
Du får titta i databladet på din MCU

Re: Lågkristallen startar inte igång min STM32 - Felsökning

Postat: 16 november 2021, 19:49:22
av DanielM
Oj, läste fel.

Det står inte vad Ci ska vara. Men det står iallafall att jag ska använda en kristall som har inbyggda kondensatorer.
Hmm...jag valde ju en kristall som är rekommenderad av ST. Alltså betyder det bara att jag behöver bara ta bort mina kondensatorer?
Skärmklipp.PNG

Re: Lågkristallen startar inte igång min STM32 - Felsökning

Postat: 16 november 2021, 19:52:12
av TomasL
Nej, du har inte använt en resonator, utan en ren kristall, utan kondingar

Re: Lågkristallen startar inte igång min STM32 - Felsökning

Postat: 16 november 2021, 20:09:51
av DanielM
Jag får inget mer information än detta. Här säger dom att Cs = 5 pF eller 10 pF.
Skärmklipp.PNG
Skärmklipp.PNG

Re: Lågkristallen startar inte igång min STM32 - Felsökning

Postat: 16 november 2021, 20:17:04
av TomasL
Ci hittar du i databladet, i sektionen för elektriska data.

Ofta är det så att man får labba sig fram till lämpliga värden.

Re: Lågkristallen startar inte igång min STM32 - Felsökning

Postat: 16 november 2021, 20:21:23
av rvl
Vad sa de gula varningstrianglarna i CubeIDE?

Re: Lågkristallen startar inte igång min STM32 - Felsökning

Postat: 16 november 2021, 20:27:36
av DanielM
TomasL skrev: 16 november 2021, 20:17:04 Ci hittar du i databladet, i sektionen för elektriska data.

Ofta är det så att man får labba sig fram till lämpliga värden.
Ja. Här. 5 pF.

Alltså blir mina externa kondensatorer C = 2*(12.5 - 5) = 15 pF. Vilket jag hade från början, men fungerade inte.
Skärmklipp.PNG
rvl skrev: 16 november 2021, 20:21:23 Vad sa de gula varningstrianglarna i CubeIDE?
Dom markerar bara att det finns begräsningar i vad jag kan göra just där. Mycket smidigt. Jag ser vad min processor använder för enheter och vilka enheter som är upptagna om jag väljer specifika enheter.

Re: Lågkristallen startar inte igång min STM32 - Felsökning

Postat: 16 november 2021, 20:33:16
av ghu
Dina problem kan bero på dålig layout på ditt kretskort. 32 kHz är ju en väldigt låg frekvens som inte är särskilt känslig för lite kass layout men om layouten är mycket dålig så fungerar inte ens kristaller vid denna låga frekvens.

Om det är kristallen med kondensatorer runt som är ritad i layouten av kretskortet i ditt tidigare inlägg så verkar kondensatorernas inkoppling till GND på processorn vara katastrofal. Den ena verkar inte inkopplad alls och den andra med mycket lång ledningsbana till GND på processorn

Re: Lågkristallen startar inte igång min STM32 - Felsökning

Postat: 16 november 2021, 20:43:15
av DanielM
ghu skrev: 16 november 2021, 20:33:16 Om det är kristallen med kondensatorer runt som är ritad i layouten av kretskortet i ditt tidigare inlägg så verkar kondensatorernas inkoppling till GND på processorn vara katastrofal. Den ena verkar inte inkopplad alls och den andra med mycket lång ledningsbana till GND på processorn
Dom har anslutning till GND. Det har jag bekräftat.
Ja, det kan vara kristallens placering som är problemet då varken dessa fungerar.
  • 4.7 pF
  • 15 pF
  • 22 pF

Re: Lågkristallen startar inte igång min STM32 - Felsökning

Postat: 16 november 2021, 20:44:56
av TomasL
Har du jordplan under och runt kristallen, det syns liksom inte.
Längden på en ledare till jordplanet bör inte vara längre än någon mm, typ.

Re: Lågkristallen startar inte igång min STM32 - Felsökning

Postat: 16 november 2021, 20:47:07
av DanielM
Det är en runt liten prick under kristallen. Men jag vet inte om det är ett jordplan.
Skärmklipp.PNG

Re: Lågkristallen startar inte igång min STM32 - Felsökning

Postat: 16 november 2021, 20:56:01
av TomasL
Jordplan har du på mönsterkortet, ett eller flera stycken.