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.
Geht mit beiden Quarzen. Das Bittiming muß entsprechend des eingestellten CAN Peripherie-Taktes gesetzt werden.
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
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.
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?
> 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.
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 */ |
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.
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.
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); |
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.
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?
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.
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!
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?
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?
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.
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...
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
