STM32L443CC HSE Config

Gast #5247940
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.)
Gast #5248069
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...
Gast #5248094
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren