Forum: Mikrocontroller und Digitale Elektronik Cortex M3 "hängt" bei Initialsierung - (wilde Zeilensprünge)


von Martin (Gast)


Lesenswert?

Hallo zusammen,

ich bin dabei ein CM3 Projekt in Betrieb zu nehme.
Die Firmware läuft auch auf einem anderem Projekt zu 98% Gleichheit.

Anders ist lediglich die ADC Config und es gibt keinen ext. Interrupt 
mehr.

So, nun habe ich das Teil (in Eclipse mit ST-Link im Debug mode) 
angeschlossen und festgestellt dass sich er sich in der Initialiserung 
irgendwo wohl verläuft.

Also bin ich Schritt für Schritt durchgegangen und habe folgendes 
festgestellt:

- wenn in einer Anweisung z.b. 4 einfach Variablenzuweisungen o.ä. 
hintereinander kommen werden diese in wilder Reihenfolge abgearbeitet. 
Cursor springt gleich zur 3. dann mal zur 1. dann wieder zur 3., dann 
zur 2. usw. Woher kann das kommen - habe sowas noch nie gesehen?

- in der NVIC_INIT hängt er sich auf, bzw. er geht einfach nicht rein 
und es heißt der Controller ist im Run mode, als würde er sich nicht 
finden. Komischerweiße bin ich diese ini routine auch schon step by step 
durchgegangen und es hat funktioniert. Also wieder "zufällige" 
Abarbeitung. Jetzt habe ich sie auskommentiert und der Controller geht 
bis zur Hauptschleife durch und arbeitet diese ab.

- Am Anfang habe ich die LED_OK und LED_ERR gesetzt und rückgesetzt um 
zu sehen ob das ausgeführt wird. "Manchmal" werden die LEDs gesetzt, 
manchmal wiederrum nicht.


Wo kann so ein seltsames Verhalten vorkommen.
Wie gesagt die Software ist bis den Ext. Interrupt (der nun deaktiviert 
ist) exakt gleich zu einem problemlos laufendem System.

Danke für eure Vorschläge

Gruß Michl
1
int main(void)
2
{
3
  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4
5
  // System startup
6
7
  MainGpioInit();                                           // GPIO configuration
8
  //A. Martin debug
9
  GPIO_SetBits(LED_OK_PORT, LED_OK_PIN);
10
  GPIO_ResetBits(LED_ERR_PORT, LED_ERR_PIN);
11
12
  RCC_Configuration();                                      // System clocks configuration
13
  RCC_ClockSecuritySystemCmd(ENABLE);                       // Enable clock security system(CSS)
14
  EH_Init();                                                // Error Code Handling initialization
15
  //A. Martin debug
16
  //NVIC_Configuration();                                     // NVIC configuration
17
  //MainGpioInit();                                           // GPIO configuration
18
19
  if (SysTick_Config(SystemCoreClock / SYSTICK_FREQ))       // Setup SysTick Timer for 1 msec interrupts
20
    while (1)
21
      ;
22
23
  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
24
25
  // Initialize internal peripherals
26
27
  I2c_Configuration();                                        // I2C configuration
28
  Timer_Configuration();                                      // Timer configuration
29
  //ExtInt_Configuration();                                   // External hardware interrupt configuration
30
                                // was only used for overtemp sensor which is not used in DLX
31
  Adc_Configuration();                                        // ADC_ configuration
32
33
34
  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
35
36
  // Initialize system control and get system informations
37
38
  ParameterInit();                                            // initialize internal parameters and structures
39
  GetStartupInformation();                                    // request static system information
40
41
  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
42
43
  // Prepare command reception and command buffer
44
45
  nCanRxCounter = 0;
46
  pCBWritePtr = pCBReadPtr = szCmdQueue;              // set circular buffer pointer to first element of buffer
47
  Can_Configuration();                                        // CAN configuration
48
49
  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
50
51
  // Prepare program execution
52
53
  FncDispEnable(true);                                        // enable periodically function dispatcher
54
  WatchdogConfig();                                           // configure independent watchdog
55
56
  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
57
58
  // Start program execution
59
  while (1)
60
  {
61
  //A. Martin debug
62
  GPIO_SetBits(LED_OK_PORT, LED_OK_PIN);
63
64
    GPIO_SetBits(TEST2_PORT, TEST2_PIN);        // switch On Testpin, to check if app runs
65
66
67
    // check permanently for errors
68
    if( EH_GetErrorCounter() != 0)
69
    {
70
      nStatusByte |= (1<<UC_ERR_FLAG);      // set error flag in global status byte
71
      SetStatusLED(UC_ERR);
72
    }
73
    else
74
    {
75
      nStatusByte &= ~(1<<UC_ERR_FLAG);      // clear error flag in global status byte
76
      SetStatusLED(UC_OK);
77
    }
78
79
  //A. Martin debug
80
  GPIO_SetBits(LED_OK_PORT, LED_OK_PIN);
81
/************************OVERTEMPERATURE-Handling***********************************************************/
82
83
    // check if over-temperature error is always active
84
    if (((nStatusByte & (1<<OVERTEMP_FLAG)) == !0) && (GPIO_ReadInputDataBit(OVT_PORT, OVT_PIN) == 0x00))   // read OV flag and input pin status (PORTE Pin11)/low active
85
    {
86
     EXTI_ClearITPendingBit(EXTI_LINE_OVT);             // Clear the supervisor board over-temperature EXTI line pending bit
87
     OVFailureCount++;                                   // increase failure counter
88
     if (OVFailureCount >= 500)                          // does counter reach end point?
89
     {
90
       Overtemp_Shutdown ();                          // call over temperature shutdown
91
       //nStatusByte &= ~(1<<OVERTEMP_FLAG);            // clear over temperature flag
92
       OVFailureCount = 0;                            // clear counter
93
     }
94
    }
95
    else if (GPIO_ReadInputDataBit(OVT_PORT, OVT_PIN) == 0x01)
96
   {
97
//      if ((nStatusByte & (1<<OVERTEMP_FLAG)) == !0)       // overtemp_flag was set
98
//      {
99
        nStatusByte &= ~(1<<OVERTEMP_FLAG);             // clear over temperature flag
100
         EXTI_ClearITPendingBit(EXTI_LINE_OVT);          // Clear the supervisor board over-temperature EXTI line pending bit
101
//      }
102
     //EH_ClearErrorCode(ERR_OVT);                         // clear error code
103
     OVFailureCount = 0;                                 // clear counter
104
   }
105
106
    // reset watchdog counter
107
    WatchdogReset();
108
109
    // call command interpreter
110
    CmdEval();
111
112
    // reset watchdog counter
113
    WatchdogReset();
114
  }
115
}
116
117
118
119
void NVIC_Configuration(void)
120
{
121
  NVIC_InitTypeDef NVIC_InitStructure;
122
123
  /* Configure the Priority Grouping with 1 bit */
124
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
125
126
  /* Configure and enable CAN interrupt */
127
  NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
128
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
129
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
130
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
131
  NVIC_Init(&NVIC_InitStructure);
132
133
  // Enable ADC1_2 IRQChannel
134
  NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn;
135
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
136
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
137
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
138
  NVIC_Init(&NVIC_InitStructure);
139
140
  /* Enable the EXTI15_10 Interrupt */
141
  /*
142
  NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
143
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
144
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 5;
145
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
146
  NVIC_Init(&NVIC_InitStructure);
147
  */
148
}

von Martin (Gast)


Lesenswert?

PS:
- wenn ich mit F5 (Einzelschritte) debugge, geht er in alle Ini/Config 
gehe führt er alle sauber aus

- wenn ich mit F8 (bis zu nächsten Breakpoint - den ich immer in die 
Zeile der nächsten Config Hauptroutine setze) debugge "verläuft" er sich 
meißtens, sprich er zeigt weder an wo er sich, noch kann ich ihn 
kontrollieren, zeigt RUN_MODE an.

- in die ParameterInit Funktion komme ich nie rein, selbst mit F5 
verläuft er sich einfach wenn er reinspringen soll


Es scheint irgendwo etwas im Argen zu liegen wenn "alles" so sporadisch 
abgearbeitet wird....

Merci

von Martin (Gast)


Lesenswert?

Sorry
1
void ParameterInit(void)
2
{
3
  uint8_t i;
4
5
  // get block identifier depending on codification on IO pin
6
  if (GPIO_ReadInputDataBit(BLKSEL_PORT, BLKSEL_PIN) == 0x01)
7
  {
8
    nBlockIdentifier = 'R';
9
    nCanReceiveID = CAN_PFBR_ID;                  // distinct CAN ID for addressing the peltier frame board of right thermo block
10
    nCanSendID = nCanReceiveID - CAN_ID_OFFSET;   // distinct CAN ID to mark the peltier frame board of right thermo block as sender towards the supervisor controller
11
  }
12
  else
13
  {
14
    nBlockIdentifier = 'L';
15
    nCanReceiveID = CAN_PFBL_ID;                  // distinct CAN ID for addressing the peltier frame board of left thermo block
16
    nCanSendID = nCanReceiveID - CAN_ID_OFFSET;   // distinct CAN ID to mark the peltier frame board of left thermo block as sender towards the supervisor controller
17
  }
18
19
  // get HW revision information from pattern of I/O pins
20
  nHwVersion = GPIO_ReadInputDataBit(REV3_PORT, REV3_PIN) << 3;     // get HW revision information from pattern of I/O pins
21
  nHwVersion += GPIO_ReadInputDataBit(REV2_PORT, REV2_PIN) << 2;
22
  nHwVersion += GPIO_ReadInputDataBit(REV1_PORT, REV1_PIN) << 1;
23
  nHwVersion += GPIO_ReadInputDataBit(REV0_PORT, REV0_PIN);
24
25
  // LUT to build HW major/minor version information from HW revision code
26
  switch (nHwVersion)
27
  {
28
    case 0:
29
      nHwMajor = 1; nHwMinor = 0; break;
30
    case 1:
31
      nHwMajor = 1; nHwMinor = 1; break;
32
    case 2:
33
      break;
34
    case 3:
35
      break;
36
    case 4:
37
      break;
38
    case 5:
39
      break;
40
    case 6:
41
      break;
42
    //....
43
    default:
44
      nHwMajor = 0;       // set 0.0 to indicate an unknown hardware revision
45
      nHwMinor = 0;
46
47
      // set error code if no known hardware revision has been detected
48
      EH_SetErrorCode(ERR_HWSUPPORT);
49
    break;
50
  }

von Rangi J. (rangi)


Lesenswert?

Das mit den "wilden Sprüngen" sieht nach optimierung aus. Das kenne ich 
und ist nicht ungwöhnlich. Der Debugger kann die Assemblerbefahler nicht 
richtig zum Quelltext zuordnen. Schau dirs mal im Mixed-Mode oder im 
Assembler an, dort wirst du feststellen, das die Adressen auch schon 
wild durcheinander stehen.
Versuchs mal die optimierung auszuschalten (-O0)

von Roland H. (batchman)


Lesenswert?

Martin schrieb:
> ich bin dabei ein CM3 Projekt in Betrieb zu nehme.
> Die Firmware läuft auch auf einem anderem Projekt zu 98% Gleichheit.

"Den" CM3 gibt es nicht. Welcher ist es konkret? Compiler-Version und 
ggf. Version der "driver library" schadet auch nicht.

Und für welche MCU steht das "andere Projekt"?

Was war die Ausgangslage für die Portierung, auf welcher Plattform lief 
das ganze System fehlerfrei?

von Martin (Gast)


Angehängte Dateien:

Lesenswert?

STM32F103VCT6

gcc compiler.

Das andere Projekt ist auf dem exakt gleichem controller gelaufen, nur 
wie gesagt mit der minimalen Änderung der Hardware.

Nun habe ich rausgefunden:

- es scheint ein problem mit dem ext. EEPROM zu geben, weil er sich an 
dieser Stelle an der Initialisierung aufhängt. Gut... muss man mal 
schauen woran das liegen kann.

- Wenn ich den EEPROM Teil herausnehme hängt er sich (wie im bild 
gezeigt) in der NVIC_Config und der darauffolgendenen NVIC_Init auf. Die 
Init wird aufgerufen, und scheinbar auch durchlaufen, den der debugger 
sagt dass er in Zeile 144 in misc.c hängt. Und genau das ist die letzte 
Klammer der Init funktion... also hää? warum gehts dann nicht weiter?

Danke!

von Roland H. (batchman)


Lesenswert?

Martin schrieb:
> Wenn ich den EEPROM Teil herausnehme hängt er sich (wie im bild
> gezeigt) in der NVIC_Config und der darauffolgendenen NVIC_Init auf.

Auf dem Screenshot sieht es so aus, als ob er sich bereis im 
ADC-Interrupt-Handler befindet.

Wann wird ADC gestartet? Vor dem NVIC-Setup?

Wie sieht denn der Handler aus? Hängt er evtl. in einem Default-Handler 
in einer Endlosschleife?

von Martin (Gast)


Lesenswert?

Also eigentlich dachte ich ist mir nicht aufgefallen, dass der ADC VOR 
der NVIC konfiguriert wird.
Nun wird er aber wie im code oben erst danach konfiguriert.

Warum also springt er dann in die ADC_IRQ rein und erledigt dort richtig 
seine Arbeit.

Das ist auch das was ich durchs debuggen jetzt nachvollziehen kann:
Er bleibt in der besagten NVIC_Config stehen (warum auch immer) und es 
wird immer und immer wieder die ADC_IRQ ausgelöst und in der main 
schleife geht es auch garnicht mehr weiter...

Die frage ist also warum wird an dieser Stelle bereits der ADC 
ausgeführt obwohl er laut code (siehe Reihenfolge oben) noch nicht 
initialisiert ist.

PS: oben ist die NVIC_config auskommentiert, war nur kurzfristig so, 
jetzt ist sie natürlich wieder drin.

von Martin (Gast)


Lesenswert?

Nachschub:

- Die Reihenfolge wann NVIC_Config ausgeführt wird ist egal, er bleibt 
dann immer  an besagter Stelle stehen und es wird nur noch die ADC_IRQ 
ausgeführt

- kommentiere ich NVIC_Config aus (zum Test) wird die main "normal" 
abgearbeitet, allerdings natürlich ohne ADC werte weil die ADC_IRQ nicht 
mehr ausgeführt wird (wegen fehlender NVIC confi)

von Jojo S. (Gast)


Lesenswert?

ist denn die ADC init ok? Ich habe auch gerade mit einem LPC1769 und 
internem ADC gespielt. Dabei habe ich den ADC-Takt zu klein gemacht und 
der zu grosse Teiler hat dann das Burst-Bit erwischt und aktiviert.
Ein anderer Fehler war das im ADC_IRQ Handler der IRQ nicht gelöscht 
wurde, das ist meiner Ansicht nach schon in den CMSIS Beispielen falsch 
die ich als Muster genommen hatte, dort wurde das falsche Register 
gelesen. Das führte dazu das nur noch IRQs ausgelöst wurden.

von Roland H. (batchman)


Lesenswert?

Irgendwie passt das alles nicht zusammen: Hat das Programm auf dem 
gleichen Controller jemals funktioniert? Obwohl immer mehr abgeschaltet 
wird, kommt es nicht zum Laufen.

Ich zweifle daran, dass der ADC ohne Konfiguration einfach an der Stelle 
zufällig losläuft.

Also: Nochmals prüfen, testen, und letzten Programmstand und 
Beobachtungen posten. Das macht aber nur dann Sinn, wenn alle im ersten 
Posting genannten Funktionen enthalten sind.

Im Zweifel das Ding komplett entkernen, solange bis es funktioniert. 
Dann schrittweise die weitere HW dazunehmen.

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.