Forum: Mikrocontroller und Digitale Elektronik STM32L443CC HSE Config


von Benni S. (Gast)


Lesenswert?

Hallo,

ich versuche gerade bei einem stm32L443CC den externen Quarz zu 
verwenden. Mit dem internen MSI läuft das ganze schon nur der externe 
Quarz macht noch Probleme.

Als IDE verwende ich TrueSTUDIOARM. Gleich am Anfange von main kommt 
folgender Code:
1
  SystemInit();
2
3
  RCC->CR &= 0xFEFFFFFF;    //Disable PLL
4
  while(RCC->CR &= 0x02000000);    //Wait until PLL is disabled
5
  RCC->CR &= 0x00010000;    //Enable HSE (Bit HSEON)
6
  while(!(RCC->CR &= 0x00020000))  //Wait until HSE is ready
7
  RCC->PLLCFGR |= 0x00000003;    // PLL-Source = HSE
8
  RCC->PLLCFGR &= 0xFFFFFF8F;    // PLL-M = 1
9
  RCC->PLLCFGR |= 0x00001400;    // PLL-N = 20
10
  RCC->PLLCFGR &= 0xF9FFFFFF;    // PLL-R = 2
11
  RCC->CR |= 0x01000000;    //Enable PLL
12
  while(!(RCC->CR &= 0x02000000));  //Wait until PLL is enabled
13
  RCC->PLLCFGR |= 0x01000000;     //Enable PLL-R
14
  RCC->CFGR |= 0x00000003;     //SYSCLK = PLL

Leider wird das Bit HSEON einfach nicht gesetzt. Wenn ich rein debugge 
und über die Stelle steppe wird das Bit im CR Register nicht gesetzt. 
Weis einer wieso / hatte schonmal jemand das gleiche Problem ?

Ich würde es noch gerne ohne HAL machen (als ich die in das Projekt 
kopiert habe kamen viele Fehler mit "ist nicht deklariert" in den HAL 
Dateien usw.)

von Darth Moan (Gast)


Lesenswert?

Benni S. schrieb:
> RCC->CR &= 0x00010000;    //Enable HSE (Bit HSEON)

Bist du sicher, dass das HSEON bit auf 0 gesetzt werden muss um HSE
einzuschalten?

von Darth Moan (Gast)


Lesenswert?

Sorry,
verquer ausgedrueckt.
Ich wollte fragen, ob das bit nicht vielleicht eingeodert werden sollte?

von Benni S. (Gast)


Lesenswert?

Stimmt, nur hat das leider auch nicht geholfen.

von Mr. Big (Gast)


Lesenswert?

1
        RCC->CR |= ( RCC_CR_HSEON );
2
        while( !( RCC->CR & RCC_CR_HSERDY ) )
3
                asm ("nop");

von Benni S. (Gast)


Lesenswert?

Mr. Big schrieb:
> RCC->CR |= ( RCC_CR_HSEON );
>         while( !( RCC->CR & RCC_CR_HSERDY ) )
>                 asm ("nop");

Vielen Dank, mit diesem Code hats geklappt. Kannst du mir auch sagen 
wieso ? Würde das gerne verstehen.

von Curby23523 N. (Gast)


Lesenswert?

Bitte verwende lesbare Bitmasken. Diese heißen bei CMSIS z.B. RCC_CR_xxx 
wobei xxx = Name des Bits (siehe Datenblatt).

von Mr. Big (Gast)


Lesenswert?

Benni S. schrieb:
> Vielen Dank, mit diesem Code hats geklappt. Kannst du mir auch sagen
> wieso ? Würde das gerne verstehen.

Weil es richtig ist? ;)

Damit setzt Du das Bit zum Einschalten:
1
RCC->CR |= ( RCC_CR_HSEON );

Damit wartest Du, bis der Takt stabil ist:
1
while( !( RCC->CR & RCC_CR_HSERDY ) )


Ganz nach Manual.
Du hast mehrere Fehler drin:
1. Das & anstelle des | und
2. Das &= anstelle des !&

Sieh auch den Rest Deines Codes durch, der muss auch geändert werden...

von Mr. Big (Gast)


Lesenswert?

Noch als Beispiel ein Teil der Initialisierung für einen STM32F407:
1
#define PLLM      4
2
#define PLLN      168
3
#define PLLP      2
4
5
6
init() {
7
        // Enable Caches, Prefetch and set Waitstates
8
        FLASH->ACR |= ( FLASH_ACR_DCEN | FLASH_ACR_ICEN | FLASH_ACR_PRFTEN | FLASH_ACR_LATENCY_5WS );
9
        while( ( FLASH->ACR & FLASH_ACR_LATENCY ) != FLASH_ACR_LATENCY_5WS )
10
                asm ("nop");
11
12
        RCC->CFGR = ( RCC_CFGR_PPRE2_DIV4 | RCC_CFGR_PPRE1_DIV8 );
13
 
14
        // Enable HSE
15
        RCC->CR |= ( RCC_CR_HSEON );
16
        while( !( RCC->CR & RCC_CR_HSERDY ) )
17
                asm ("nop");
18
19
        RCC->PLLCFGR = ( 0x24000000 | RCC_PLLCFGR_PLLSRC_HSE | ((( PLLP >> 1 ) - 1 ) << 16 ) | ( PLLN << 6 ) | PLLM );
20
21
        RCC->CR |= ( RCC_CR_PLLON );
22
        while( !( RCC->CR & RCC_CR_PLLRDY ) )
23
                asm ("nop");
24
25
        RCC->CFGR |= ( RCC_CFGR_SW_PLL );
26
        while( ( RCC->CFGR & RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL )
27
                asm ("nop");
28
29
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.