Hallo zusammen Habe heute mein Board mit einem STM32F103RBT6 ausgegraben. Fix den ST-Link angeschlossen und mal geschaut, wie weit die Kompatiblität mit Arduino bei STM32 inzwischen ist. Habe kurzerhand die ArduinoIDE verwendet und dort Stm32duino als board hinzugefügt und getestet. Funktionierte auf anhieb... Doch ich würde auch gerne Debuggen können. Also hab ich mit das PlatformIO paket angeschaut und installiert. Leider funktioniert das einfachste LED-Blink Beispiel nicht. Der Code funktioniert so 1:1 wenn er mit der ArduinoIDE compiliert wird. Nicht jedoch mit PlatformIO. Ein Debuggen hilft leider nicht, da ein Breakpoint bei "setup()" nie aufgerufen wird. Der Prozessor scheint irgendwo zu hängen... Hat jemand eine Idee? Danke
Holger K. schrieb: > Ein Debuggen hilft leider nicht, da ein Breakpoint bei "setup()" nie > aufgerufen wird. Dann musst du den Debugger daran hindern, überhaupt bis dahin zu rennen. Habe PlatformIO jetzt schon lange nicht mehr in den Fingern gehabt (und auch nur je als Buildsystem genutzt, nicht als IDE/Debugger), aber da wird's schon irgendwo ein Häkchen geben. Und dann halt schubweise durch die Initialisierung hüpfen, bis du eingekreist hast, an welcher Stelle er crasht.
Jörg W. schrieb: > Holger K. schrieb: >> Ein Debuggen hilft leider nicht, da ein Breakpoint bei "setup()" nie >> aufgerufen wird. > > Dann musst du den Debugger daran hindern, überhaupt bis dahin zu rennen. > Habe PlatformIO jetzt schon lange nicht mehr in den Fingern gehabt (und > auch nur je als Buildsystem genutzt, nicht als IDE/Debugger), aber da > wird's schon irgendwo ein Häkchen geben. > > Und dann halt schubweise durch die Initialisierung hüpfen, bis du > eingekreist hast, an welcher Stelle er crasht. Danke für deinen Input. Das ist eine gute Idee Habe das hier gefunden: https://docs.platformio.org/en/latest/projectconf/section_env_debug.html#debug-init-cmds Habe entsprechend diese Zeilen hinzugefügt:
1 | debug_init_cmds = |
2 | target extended-remote $DEBUG_PORT |
3 | $INIT_BREAK |
4 | monitor reset halt |
5 | $LOAD_CMDS |
6 | monitor init |
7 | monitor reset halt |
Das Ergebnis ist das selbe wie ohne den obigen Code. Siehe dazu Bild 4. Es wird anscheinend ein temporärer Breakpoint gesetzt, aber ich kann den Prozessor nicht anhalten (siehe Steuerbuttons oben, da wäre theoretisch der halt button, der macht aber nichts). Johannes S. schrieb: > oder ist da was mit dem Bootloader anders? Glaube ich eher nicht, da ich hier direkt über den ST-Link zugreife. Ebenso bei der ArduinoIDE. Auch dort habe ich das Programm direkt heruntergeladen.
:
Bearbeitet durch User
Ich habe inzwischen eine Vermutung... Nach langem zögern, habe ich mir nun noch die Stm32CubeIDE heruntergeladen. Dort habe ich ein einfaches Programm erstellt, welches nur USART1 und 2 sowie den Tim1 als Systick verwendet. Bereits beim Initialisieren des HAL (HAL_Init(); ) bekomme ich jedoch einen BusFault error. Auch beim Durchsteppen geschieht das selbige. Es scheint so, als gäbe es ein Problem mit dem Interrupt. Ein ändern der SysTickSource von Tim1 zu SysTick hilft nicht. Nur das auskommentieren von HAL_Init() und SystemClock_Config(); hilft, dass der Controller nicht in einen HardFault geht. Wäre es möglich, dass der F103 aus dem Jahre 2008 evtl. ein HW-Problem hat? Dies würde dann das fehlerhafte Debuggen erklären.
Holger K. schrieb: > Ich habe inzwischen eine Vermutung... > > Nach langem zögern, habe ich mir nun noch die Stm32CubeIDE > heruntergeladen. Also ich hätte statt dessen lieber mal das Datenblatt des Device und der Familie runtergeladen. Und gelesen... Und verstanden... Nach all meiner Erfahrung ist sowas letzlich sehr viel hilfreicher bei der Aufklärung misteriöser Crashes... Allerdings mache ich das normalerweise sowieso eher umgekehrt: Erst wird die Doku gelesen, dann wird programmiert. Aber was weiss ich schon...
Danke für deine Antwort. Bin grundsätzlich auch deiner Meinung. Ich arbeite seit mehr als 10 Jahren mit den STM32F1xx. Jedoch nicht auf täglicher Basis... So habe ich nun seit ca. 1.5 Jahren nichts mehr damit gemacht und nun wieder ein neues Projekt :) Daher irritiert mich dieser BusFault nun doch etwas.
Holger K. schrieb: > Hallo zusammen > Habe heute mein Board mit einem STM32F103RBT6 ausgegraben. Ein Nucleo oder ein custom Board? Takt richtig konfiguriert? Und im CubeMX den SWD aktiviert? Der ist da als default aus.
Johannes S. schrieb: > Ein Nucleo oder ein custom Board? Takt richtig konfiguriert? Und im > CubeMX den SWD aktiviert? Der ist da als default aus. Ja, hab ich. Ist kein custom board. Ist das hier: https://www.futurlec.com/STM32_Development_Board.shtml Habe nun ein altes Board mit STM32F103VET6 angeschlossen. Siehe da, dieses lässt sich sofort debuggen... Echt mühsam, wenn man mal wieder 8h in einen defekten Chip investiert hat.
Ich würde trotzdem nach dem clock sehen. Das Nucleo hat einen ext Clock, die Konfiguration würde mit einem Quarz nicht laufen. Das Evalboard mit den vielen Jumpern ist vielleicht auch anders konfiguriert?
Holger K. schrieb: > Echt mühsam, wenn man mal wieder 8h in einen defekten Chip investiert > hat. Na, wenn es ein Nucleo-Board war und der Chip defekt ist, dann sollte man wohl rausfinden, wie das wohl passiert sein mag. Typisch werden diese Nucleo-Boards (man glaubt es kaum) doch tatsächlich mit funktionierenden Chips ausgeliefert. So jedenfalls meine Erfahrung, hatte noch nie ein defektes ab Anlieferung. Später allerdings gelegentlich schon... Aber was weiss ich schon...
Johannes S. schrieb: > Ich würde trotzdem nach dem clock sehen. Das Nucleo hat einen ext > Clock, > die Konfiguration würde mit einem Quarz nicht laufen. Das Evalboard mit > den vielen Jumpern ist vielleicht auch anders konfiguriert? Nun, das Problem besteht nur, wenn der SysTick konfiguriert wird. Werden keine Clock-Einstellungen vorgenommen, läuft das Debugging und die blinkende LED. c-hater schrieb: > Na, wenn es ein Nucleo-Board war und der Chip defekt ist, dann sollte > man wohl rausfinden, wie das wohl passiert sein mag. Typisch werden > diese Nucleo-Boards (man glaubt es kaum) doch tatsächlich mit > funktionierenden Chips ausgeliefert. Das Board ist mehr als 10 Jahre alt und hatte bereits schon so manches Projekt durchlebt...
Vor 10 Jahren gab es die noch nicht als Fakes, umso besser…
Holger K. schrieb: > Das Board ist mehr als 10 Jahre alt und hatte bereits schon so manches > Projekt durchlebt... Das letzte wohl nicht...
c-hater schrieb: > Holger K. schrieb: > >> Das Board ist mehr als 10 Jahre alt und hatte bereits schon so manches >> Projekt durchlebt... > > Das letzte wohl nicht... sieht so aus xD
Weil es ja mit stm32duino lief: Hast du das im CubeMX mit HSE und Quarz konfiguriert?
Johannes S. schrieb: > Hast du das im CubeMX mit HSE und Quarz konfiguriert? Nein, bei der Konfiguration der Clocks, gibts einen HardFault.
1 | void SystemClock_Config(void) |
2 | { |
3 | RCC_OscInitTypeDef RCC_OscInitStruct = {0}; |
4 | RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; |
5 | |
6 | /** Initializes the RCC Oscillators according to the specified parameters |
7 | * in the RCC_OscInitTypeDef structure. |
8 | */ |
9 | RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; |
10 | RCC_OscInitStruct.HSIState = RCC_HSI_ON; |
11 | RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; |
12 | RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; |
13 | if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) |
14 | { |
15 | Error_Handler(); |
16 | } |
17 | /** Initializes the CPU, AHB and APB buses clocks |
18 | */ |
19 | RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |
20 | |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; |
21 | RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; |
22 | RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; |
23 | RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; |
24 | RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; |
25 | |
26 | if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) |
27 | { |
28 | Error_Handler(); |
29 | } |
30 | } |
Wird obiger Code ausgeführt, gibts nach einigen hundert Takten einen HardFault
Als ich CubeMX vor wenigen Jahren zum ersten mal verwendete versagte auch die Takt Konfiguration. Hier im Forum wurde mir geholfen, den konkreten Fehler in der HAL zu finden. In der nächsten Version war der Fehler behoben, dafür ging zwei mal was anderes nicht. Ich habe das Gefühl, dass sie den F103 nur schlampig behandeln. Keine Ahnung ob du in diesem Fall auf einen Bug in der HAL gestoßen bist. Aber erwäge, dass es so sein könnte.
Holger K. schrieb: > Wird obiger Code ausgeführt, gibts nach einigen hundert Takten einen > HardFault Das klingt nach einem Problem mit Flash wait states oder sowas. Ich habe neulich ein (bare metal) STM32F103-Projekt damit hier gemacht:
1 | void init_clock(void) |
2 | {
|
3 | // Conf clock : 64MHz using HSE 16MHz crystal w/ PLL X 4 (16MHz x 4 = 64MHz)
|
4 | FLASH->ACR |= FLASH_ACR_LATENCY_2; // Two wait states, per datasheet |
5 | RCC->CFGR |= RCC_CFGR_PPRE1_2; // prescale AHB1 = HCLK/2 |
6 | RCC->CR |= RCC_CR_HSEON; // enable HSE clock |
7 | while( !(RCC->CR & RCC_CR_HSERDY) ); // wait for the HSEREADY flag |
8 | |
9 | RCC->CFGR |= RCC_CFGR_PLLSRC; // set PLL source to HSE |
10 | RCC->CFGR |= RCC_CFGR_PLLMULL4; // multiply by 4 |
11 | RCC->CR |= RCC_CR_PLLON; // enable the PLL |
12 | while( !(RCC->CR & RCC_CR_PLLRDY) ); // wait for the PLLRDY flag |
13 | |
14 | RCC->CFGR |= RCC_CFGR_SW_PLL; // set clock source to pll |
15 | |
16 | while( !(RCC->CFGR & RCC_CFGR_SWS_PLL) ); // wait for PLL to be CLK |
17 | |
18 | SystemCoreClockUpdate(); // calculate the SYSCLOCK value |
19 | }
|
Ich denke, die erste Zeile ist der Schlüssel hier.
> Wird obiger Code ausgeführt, gibts nach einigen hundert Takten einen > HardFault Aber nicht wegen der Flash Latency, da läuft der ja noch mit HSI, also internem RC Oszi. Danach wird es spannend, wenn auf HSE mit PLL umgeschaltet wird. An der gezeigten Stelle liegt es mit Sicherheit nicht.
Jörg W. schrieb: > Das klingt nach einem Problem mit Flash wait states oder sowas. Daran scheiterte es auch bei mir damals.
Wenn man einen Fehler in der Clock-Configuration oder den Flash Waitstates vermutet, ist wohl der einfachste Weg den Teil ganz aus dem Programm zu nehmen. Mit 8MHz lässt sich das Teil auch debuggen. Erst wenn da schon mal eine LED geblinkt hat kann man Stück für Stück weiter machen. Kann doch nicht so schwer sein.
Beitrag #6834579 wurde von einem Moderator gelöscht.
Beitrag #6834615 wurde vom Autor gelöscht.
Danke für eure Antworten. So weit komme ich garnicht. Habe euch mal ein Video angehängt. Da seht ihr, was da genau geht und was nicht.
Holger K. schrieb: > Leider funktioniert das > einfachste LED-Blink Beispiel nicht. Und deine Erklärung dazu heißt: Der Chip ist defekt. Nun das mag sein, aber ich denke da eher, daß es alles auf einer Programm-Hakelei aud dem PC zusammen mit all dem basiert, was bereits der C-Hater angerissen hat. Ich hätte da 2 Ratschläge für dich: 1. Versuche einmal, deine Firmware nur mit der eigentlichen Toolchain (bei dir vermutlich GCC) zu erstellen, ohne irgendwelche Cube's, IDE's und Fremd-Libs. 2. Suche hier einmal in der Historie dieses Forums nach einem Minimal-Projekt, was ich mal für die STM32F103C8T6 gepostet habe. Dort ist auch das fertig erzeugte Hexfile mit drin (per Keil erzeugt) und das funktioniert garantiert. Damit könntest du testen, ob dein µC tatsächlich kaputt ist oder ob es (wie ich eher vermute) seine Ursache in den diversen Programmen etc. auf deinem PC hat. W.S.
Ich spendiere mal meine (eine) funktionsfähige IOC Datei. Muss noch auf die verwendete IDE eingestellt werden, Pfad des Firmware Package auch ... Auffällig ist bei der IOC vom TO dass in der Clock-Konfiguration HSI gewählt ist, im RCC Bereich jedoch "Crystal/Ceramic Resonator" Kann momentan nicht beurteilen ob das relevant ist ...
Holger K. schrieb: > Hier noch die ioc sieht ok aus. Kann ich erst später testen, müsste ja auch auf einem Bluepill laufen. Clock ist nur HSI, was an HSE hängt ist ja nicht aktiv.
Holger K. schrieb: > Hier noch die ioc habe es jetzt auf einem BluePill geladen, und es crasht auch mit gleichem Fehlerbild, nach einer Zeit kommt eine Interrupt Fehlermeldung. Ohne HAL_Init(), also ohne TIM1 init, läuft es. Dann habe ich ein neues Projekt gemacht, aber mit F103C8 statt F103RB gemacht weil das BluePill ja den 48 Pinner drauf hat. Und damit läuft das Programm, auch die TIM1 ISR wird aufgerufen. Also immer noch merkwürdig, der C8 hat ja trotzdem 128k Flash und das Programm steht ja am Anfang des Flash, also kein signifikanter Unterschied. edit: ok, jetzt kam der Fehler auch in dem neu erstellten Projekt. Es dauert eine Zeit und die kam erst nach ein paar mal Pause/Go/Step. Aber die Meldung 'Interrupt failed.' ist etwas in der Debugger Kommunikation, also eher irgendwas im Zusammenspiel mit dem GDB. Auch in dem mbus Projekt wird die ISR aufegrufen und zahlt den HAL tick hoch.
Wow. VIelen Dank für deine Bemühungen. Bin immer wieder beeindruckt über die Community hier! Ok, also scheint da ein spezifisches Problem mit dem Zusammenspiel des F103RB und dem ST-Link zu sein? Ich hätte auch noch einen J-Link. Evtl. funktionierts da besser. Aber finde ich schon etwas merkwürdig das ganze... Voralle, dass ich nach 1.5 Jahren gerade in so einen "Bug" reinlaufen... Mit dem Bluepill läuft die Applikation inzwischen seit ca. 3h ohne Probleme. Für die, die es interessiert was es wird: Es handelt sich um ein Programm, welches automatisch den MBUS (nicht Modbus!) scannt und das erste gefundene Gerät ausliest und die Daten auch gleich parst...
1 | Scanning address: 1<\r><\n> |
2 | received: E5<\r><\n> |
3 | mbus: start long frame<\r><\n> |
4 | 00: 68 1b 1b 68 08 01 72 33 01 00 14 e6 1e 3c 07 f7 <\r><\n> |
5 | 10: 00 00 00 0c 78 33 01 00 14 0c 13 28 07 00 00 1b <\r><\n> |
6 | 20: 16 <\r><\n> |
7 | Stage 1...<\r><\n> |
8 | Stage 2...<\r><\n> |
9 | ID: lX<\n> |
10 | MFG: GWF<\n> |
11 | Medium: Water<\n> |
12 | AccessNr: 247<\n> |
13 | Status: 00<\n> |
14 | Signature: 2000064A0B<\n> |
15 | [<\n> |
16 | {<\n> |
17 | id: 0,<\n> |
18 | function: Instantaneous value,<\n> |
19 | sotrage nr: 0,<\n> |
20 | unit: Fabrication number,<\n> |
21 | value: 14000133,<\n> |
22 | },<\n> |
23 | {<\n> |
24 | id: 1,<\n> |
25 | function: Instantaneous value,<\n> |
26 | sotrage nr: 0,<\n> |
27 | unit: Volume (m m^3),<\n> |
28 | value: 728,<\n> |
29 | },<\n> |
30 | ] |
Ich habe ein BMP als Debugadapter dran, vielleicht macht der das. Einen Hardfault bekomme ich jedenfalls nicht und auch die LED an PC13 blinkt fröhlich wenn ich das in dein Projekt einbaue. Kompliziert war nur das Update der Firmware Packages, das 1.8.4 ging bei mir nur manuell. CubeMX ist auch nicht meine Lieblingsumgebung, nutze ich nur gelegentlich als Codegenerator. Aber im Gegensatz zu anderen hier halte ich das mittlerweile für sehr zuverlässig, das wird auch kommerziell bei meinen Kollegen und Fremdfirmen eingesetzt. edit: Damit ist die Chance groß das der F103RB doch einen Schuss hat. Und für das Debuggen reicht auch das SWD, belegt weniger Pins. JTAG hat bei den Cortex-M keinen Vorteil.
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.