Forum: Mikrocontroller und Digitale Elektronik Stm32f107 Quarz für CAN


von Uwe (Gast)


Lesenswert?

Hallo,
Brauche ich beim stm32f107 aus der connectivity line einen 25MHz 
externen Quarz um Can zum Fliegen zu bringen? Mit einem 8Mhz läuft es 
bei mir nicht.

von Uwe (Gast)


Lesenswert?

Ich brauche hier dringend unterstütztung.

von Steffen R. (steffen_rose)


Lesenswert?

Geht mit beiden Quarzen.
Das Bittiming muß entsprechend des eingestellten CAN Peripherie-Taktes 
gesetzt werden.

von Uwe (Gast)


Lesenswert?

Steffen R. schrieb:
> Geht mit beiden Quarzen.
> Das Bittiming muß entsprechend des eingestellten CAN Peripherie-Taktes
> gesetzt werden.

Ja, davon gehe ich eigentlich auch aus. Aber bei der Connectivity Line 
(hier stm32f107) scheinen sich die Mühlen bzgl. dem Timing anders zu 
drehen als bei den Rest im Bezug auf die Takt Einstellungen.

Verstehe ich es richtig:
Externer 8MHz Takt > Systemtakt = 72MHz > CAN Takt (APB1) = 36MHz ?
Geht/Ist das so beim F107'er?
Muss ich den HSE_Value=8000000 im header hinterlegen?

CAN1 habe ich an PA11 und PA12.
Da muss ich kein Remap machen, sondern nur die beiden PINS 
konfigurieren, richtig?
So in etwa?
1
   /* Configure CAN pin: RX */
2
            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
3
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
4
            GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
5
            GPIO_Init(GPIOA, &GPIO_InitStructure);
6
7
            /* Configure CAN pin: TX */
8
            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
9
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
10
            GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
11
            GPIO_Init(GPIOA, &GPIO_InitStructure);

Irgendwie bekomme ich kein einziges Bit übertragen

von Programmierer (Gast)


Lesenswert?

Uwe schrieb:
> Externer 8MHz Takt > Systemtakt = 72MHz > CAN Takt (APB1) = 36MHz ?
Je nachdem was du im RCC eingestellt hast. Es sind viele verschiedene 
Vorteiler und Multiplikatoren möglich. Wenn du die system_stm32f1xx.c 
von ST eingebunden hast, da steht das drin. Der CubeMX generiert aber 
auch entsprechenden Code. Siehe im Reference Manual unter RCC.
> Geht/Ist das so beim F107'er?
> Muss ich den HSE_Value=8000000 im header hinterlegen?
Nur wenn du die o.g. Datei verwendest und die auch HSE_VALUE überhaupt 
verwendet.

von Steffen R. (steffen_rose)


Lesenswert?

Wie Du deine Umgebung einstellen mußt hängt von deiner Umgebung ab.
Stimmen andere bekannte Takte? Was meinst Du mit "Rest"? Und ja, die 
Connectivity Line hat für den Takt ein extra Kapitel im 
Referenzhandbuch.

Welche weitere Peripherie nutzt Du?

Fange bei der Fehlersuche etwas zeitiger an.

"To leave Initialization mode, the software clears the INQR bit. bxCAN 
has left Initialization mode once the INAK bit has been cleared by 
hardware."

Wird das INAK Bit gelöscht?

Sind CAN-TX und CAN-RX im Ruhezustand High?

Dann das übliche (eigentlich vorher, kann man sich aber bei Erfolg 
sparen):
CAN und AFIO Takt aktiv, CAN Reset inaktiv (wenn INAK dem INRQ folgt ist 
dies gegeben).

REMAP register überprüfen, falls unbekannter Code benutzt wird. 
Vielleicht ändert dieser die Einstellung.

Misst Du mit dem Oszi oder versuchst Du nur, Daten mit einer Gegenstelle 
zu empfangen?

von Uwe (Gast)


Lesenswert?

> Welche weitere Peripherie nutzt Du?
GPIO für LED's
>
> Fange bei der Fehlersuche etwas zeitiger an.
>
> "To leave Initialization mode, the software clears the INQR bit. bxCAN
> has left Initialization mode once the INAK bit has been cleared by
> hardware."
>
> Wird das INAK Bit gelöscht?
>
> Sind CAN-TX und CAN-RX im Ruhezustand High?
TX und RX sind High
>
> Dann das übliche (eigentlich vorher, kann man sich aber bei Erfolg
> sparen):
> CAN und AFIO Takt aktiv, CAN Reset inaktiv (wenn INAK dem INRQ folgt ist
> dies gegeben).
>
> REMAP register überprüfen, falls unbekannter Code benutzt wird.
> Vielleicht ändert dieser die Einstellung.
Bei PA11 und PA12 brauche ich doch kein Remap, oder?

> Misst Du mit dem Oszi oder versuchst Du nur, Daten mit einer Gegenstelle
> zu empfangen?
Mit dem Oszi.

von Uwe (Gast)


Lesenswert?

Steffen R. schrieb:
> Wird das INAK Bit gelöscht?

Das muss ich noch prüfen

von Uwe (Gast)


Lesenswert?

Das wird wohl mit einem 8MHz Quarz nicht funktionieren

system_stm32f10x.c:
1
#ifdef STM32F10X_CL
2
    /* Configure PLLs ------------------------------------------------------*/
3
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
4
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
5
        
6
    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
7
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
8
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
9
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
10
  
11
    /* Enable PLL2 */
12
    RCC->CR |= RCC_CR_PLL2ON;
13
    /* Wait till PLL2 is ready */
14
    while((RCC->CR & RCC_CR_PLL2RDY) == 0)
15
    {
16
    }
17
    
18
   
19
    /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */ 
20
    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
21
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | 
22
                            RCC_CFGR_PLLMULL9); 
23
#else    
24
    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
25
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
26
                                        RCC_CFGR_PLLMULL));
27
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
28
#endif /* STM32F10X_CL */

von Programmierer (Gast)


Lesenswert?

Uwe schrieb:
> Das wird wohl mit einem 8MHz Quarz nicht funktionieren

Doch. Das funktioniert auch auf allen anderen STM32 mit 8MHz bis zur 
maximalen Baudrate vom CAN von 1MHz. Du musst nur die Zahlen im von dir 
geposteten Code anpassen. Lies im Reference Manual unter RCC nach, ist 
nicht schwer.

von Programmierer (Gast)


Lesenswert?

Uwe schrieb:
> Bei PA11 und PA12 brauche ich doch kein Remap, oder?

Da schafft nur das Reference Manual Gewissheit. Ließ unter AFIO nach und 
überprüfe es selber.

von Uwe (Gast)


Lesenswert?

Uwe schrieb:
> STM32F10X_CL

Ich habe einen STM32F10X_CL
Wenn 8MHz dran sind, wie soll das hier funktionieren?
1
    /* Configure PLLs ------------------------------------------------------*/
2
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
3
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
4
        
5
    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
6
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
7
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
8
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
9
  
10
    /* Enable PLL2 */
11
    RCC->CR |= RCC_CR_PLL2ON;
12
    /* Wait till PLL2 is ready */
13
    while((RCC->CR & RCC_CR_PLL2RDY) == 0)
14
    {
15
    }
16
    
17
   
18
    /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */ 
19
    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
20
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | 
21
                            RCC_CFGR_PLLMULL9);

von Programmierer (Gast)


Lesenswert?

Uwe schrieb:
> Ich habe einen STM32F10X_CL Wenn 8MHz dran sind, wie soll das hier
> funktionieren?

Dumm oder so?

Programmierer schrieb:
> Du musst nur die Zahlen im von dir geposteten Code anpassen. Lies im
> Reference Manual unter RCC nach, ist nicht schwer.

von Uwe (Gast)


Lesenswert?

Programmierer schrieb:
> Dumm oder so?

Hast Du'nen Vogel, oder bist Du ein Vogel?
Wenn ich sage, das der Code da oben nicht für einen 8MHz Quarz passt, 
kannst Du nicht herkommen und sagen das dieser doch mit 8MHz 
funktioniert und nur die Zahlen angepasst werden müssen?!?!
Aber sonst geht's noch gut, oder wie?

von Programmierer (Gast)


Lesenswert?

Uwe schrieb:
> kannst Du nicht herkommen und sagen das dieser doch mit 8MHz
> funktioniert und nur die Zahlen angepasst werden müssen?!?

Wieso kann ich das nicht? Verträgst du die Wahrheit nicht?

Uwe schrieb:
> Aber sonst geht's noch gut, oder wie?
Du bist doch der der die Antworten nicht liest in zweimal das gleiche 
postet.

von Uwe (Gast)


Lesenswert?

Programmierer schrieb:
> Wieso kann ich das nicht? Verträgst du die Wahrheit nicht?

Da sind keine Zahlen, sondern nur defines. Und wenn Du nicht mal 
verstehst das der oben genannte CODE nicht mit einem 8MHz funktionieren 
kann, dann scheinst Du wohl noch weniger Ahnung zu haben.
So kaper jetzt nicht den Thread hier. Vielleicht wollen andere noch 
helfen.
Danke, auch für Deine Bemühungen bis jetzt!

von Uwe (Gast)


Lesenswert?

Ich habe mal versucht es anzupassen:
1
 /*PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz
2
    RCC_PREDIV2Config(RCC_PREDIV2_Div5);
3
    RCC_PLL2Config(RCC_PLL2Mul_8);
4
    */
5
  RCC_PREDIV2Config(RCC_PREDIV2_Div2);
6
  RCC_PLL2Config(RCC_PLL2Mul_10);
7
8
      /* Enable PLL2 */
9
      RCC_PLL2Cmd(ENABLE);
10
11
      /* Wait till PLL2 is ready */
12
      while (RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET)
13
      {}
14
15
      /* PLL configuration: PLLCLK = (PLL2 / 5) * 9 = 72 MHz */
16
      RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2, RCC_PREDIV1_Div5);
17
      RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9);
18
19
      /* Enable PLL */
20
      RCC_PLLCmd(ENABLE);
21
22
      /* Wait till PLL is ready */
23
      while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
24
      {
25
      }
26
27
      /* Select PLL as system clock source */
28
      RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
29
30
      /* Wait till PLL is used as system clock source */
31
      while(RCC_GetSYSCLKSource() != 0x08)
32
      {
33
      }

Würde das so gehen?

von Programmierer (Gast)


Lesenswert?

Uwe schrieb:
> Da sind keine Zahlen, sondern nur defines

In deren Namen Zahlen sind. Wählt man hier andere Zahlen, wählt man 
automatisch ein anderes richtiges Macro.

Uwe schrieb:
> Und wenn Du nicht mal verstehst das der oben genannte CODE nicht mit
> einem 8MHz funktionieren kann, dann scheinst Du wohl noch weniger Ahnung
> zu haben.

Ich habe jedenfalls schon diverse STM32 mit 8 MHz und CAN zum Laufen 
gebracht, ohne hier dumme Fragen stellen zu müssen. Und natürlich 
funktioniert der Code, wenn man die Zahlen anpasst. Da du aber nicht 
verstehst wie man ein PDF liest und einen Texteditor bedient, verstehst 
du scheinbar nicht so viel.

Uwe schrieb:
> Würde das so gehen?

Wie wäre es mit ausprobieren?

von Uwe (Gast)


Lesenswert?

entspann Dich mal!
Einen F103'er würde ich auch zum laufen bringen, aber bei einem F107'er 
mit einem 8Mhz Quarz mus man halt die system_stm32f10x Lib anpassen.

von Programmierer (Gast)


Lesenswert?

Uwe schrieb:
> aber bei einem F107'er
> mit einem 8Mhz Quarz mus man halt die system_stm32f10x Lib anpassen.
Davon spreche ich doch die ganze Zeit. Das ist keine Lib, sondern ein 
Beispielcode, den du anpassen sollst. Das ist nicht so schwierig...

von Steffen R. (steffen_rose)


Lesenswert?

Uwe schrieb:
>> REMAP register überprüfen, falls unbekannter Code benutzt wird.
>> Vielleicht ändert dieser die Einstellung.
> Bei PA11 und PA12 brauche ich doch kein Remap, oder?

Könnte aber ein unbekannter Codeteil aktivieren....
Bedenke, dass Du einen Fehler suchst und die offensichtlichen Dinge 
bereits geprüft hast.

Uwe schrieb:
> Ich habe einen STM32F10X_CL
> Wenn 8MHz dran sind, wie soll das hier funktionieren?

Kannst Du detailierter auf deine Gedanken eingehen?
Wie @Programmierer schrieb müssen ggf. die Faktoren angepasst werden.
Der Code selbst ist korrekt, d.h. die verwendeten Register und die 
Reihenfolge der Zuweisungen. Fehlerhaft wäre der Code aus dem 'else' 
Bereich.

Uwe schrieb:
> Da sind keine Zahlen, sondern nur defines.

Was ist der Unterschied? Sei froh, dass Du nicht in die jeweiligen Bit's 
umrechnen mußt, sondern die Zahlen in lesbarer Form eintragen kannst.

Uwe schrieb:
> Würde das so gehen?
Weiß nicht, was Du erreichen willst, d.h. deine Randbedingungen sind 
unbekannt. Wenigstens die Kommentare könntest Du deiner Konfiguration 
anpassen.

Die Forderung SYSCLK = 72Mhz sollte erfüllt sein.
Rastet die PLL ein? (Werden die whiles() durchlaufen?)

Uwe schrieb:
> system_stm32f10x.c

Diese Files sind normalerweise nur als template in der Lib enthalten und 
sollten immer in das Projekt kopiert und an die verwendete Hardware 
angepasst werden.

von Uwe (Gast)


Lesenswert?

Mein erstes STM32 Projekt klappt mittlerweile schon ziemlich gut.

Ich sagte lediglich, das dieser Code, der nun mal ausgeführt wird in 
meiner Umgebung, so nicht mit meiner Hardware (8Mhz Quarz am CL) 
funktionieren kann, und nicht, das dieser fehlerhaft ist. Da sist für 
mich ein Unterschied.
[c]
#ifdef STM32F10X_CL
    /* Configure PLLs 
------------------------------------------------------*/
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */

    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 
|
                             RCC_CFGR2_PREDIV1SRC_PLL2 | 
RCC_CFGR2_PREDIV1_DIV5);

    /* Enable PLL2 */
    RCC->CR |= RCC_CR_PLL2ON;
    /* Wait till PLL2 is ready */
    while((RCC->CR & RCC_CR_PLL2RDY) == 0)
    {
    }


    /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | 
RCC_CFGR_PLLMULL);
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | 
RCC_CFGR_PLLSRC_PREDIV1 |
                            RCC_CFGR_PLLMULL9);
#else
    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | 
RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
#endif /* STM32F10X_CL */
[c]

Dies habe ich so abgeändert, so das ich den CL'er auch mit einem 8MHz 
fahren kann, da dieser NUR für einen 25MHz Quarz ausgelegt war.

von Jens E. (surfjenser)


Angehängte Dateien:

Lesenswert?

Das Tutorial kennst du?
http://diller-technologies.de/stm32_wide.html

Und lad dir doch mal CubeMX runter von STM, da kannst du dir schön 
grafisch anschauen, wie sich die Clock zusammensetzt (siehe Bild). Den 
Code kannst du dir davon auch erzeugen lassen

von Steffen R. (steffen_rose)


Lesenswert?

Uwe schrieb:
> Ich sagte lediglich, das dieser Code, der nun mal ausgeführt wird in
> meiner Umgebung, so nicht mit meiner Hardware (8Mhz Quarz am CL)
> funktionieren kann, und nicht, das dieser fehlerhaft ist. Da sist für
> mich ein Unterschied.

Für uns gibt es nicht nur schwarz und weiß. Wir sind immer wieder froh 
grau zu haben.

Uwe schrieb:
> Dies habe ich so abgeändert, so das ich den CL'er auch mit einem 8MHz
> fahren kann, da dieser NUR für einen 25MHz Quarz ausgelegt war.

Er funktioniert auch mit 8 MHz. Es gibt genug Leute, die nicht den 
maximalen Takt fahren möchten. Insofern wäre ich der Meinung gewesen, 
dass Du eine sehr kleine Bitrate auf dem CAN hättest sehen müssen, wenn 
Du von 36MHz ausgegangen bist.

Aber gut, nun funktioniert der Takt. Oder?
Wie gehts dem CAN?

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.