Komisches Verhalten Delay

Gast #3112718
Lesenswert?

Hallo Leute ich habe hier ein Problem, welches mich fast verzweifeln 
lässt.

Wenn ich folgenes Blink Beispiel auf den Chip flashe, funktioniert alles 
super. Wenn ich lediglich den Wert in der ersten Delay in 450 oder 
größer ändere wird der Code danach nicht mehr ausgeführt. Wenn ich mit 
dem Debugger Schaue und beim Rücksetzen des Pins einen Breakepoint 
setze, wird dieser auch erreicht. Ein Breakepoint beim Setzen wird nicht 
erreicht. Der Chip hängt aber nirgendwo sondern erricht nur immer wieder 
den ersten Breakepiont... Wie gesagt mit Delay(400) läuft alles wie 
geplant...

1
#include "stm32f4xx.h"
2
#include "stm32f4xx_rcc.h"
3
#include "misc.h"
4
#include "stm32f4xx_gpio.h"
5
#include "stm32f4xx_spi.h"
6
#include "stm32f4xx_tim.h"
7
#include "ADXL345.h"
8

9
/*Prototypen*/
10

11

12
void Systick_Handler(void);
13
void Delay(uint32_t cycles);
14

15

16

17
/* globale Variablen*/
18

19
uint32_t Ticks=0;
20

21

22

23

24
int main(void)
25
{
26

27
    SystemInit();
28
    SysTick_Config(SystemCoreClock/ 1000);
29

30

31
    GPIO_InitTypeDef GPIO_InitStruct;
32

33
   RCC_AHB1PeriphClockCmd(ADXL345_GPIO_Clock, ENABLE);
34

35

36

37
   GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
38
   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
39
   GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
40
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
41
   GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
42
   GPIO_Init(ADXL345_SPI_Port, &GPIO_InitStruct);
43

44
   GPIO_WriteBit(ADXL345_SPI_Port, AXDL345_CS_Pin,SET);
45

46
    while(1)
47
    {
48
      GPIO_WriteBit(ADXL345_SPI_Port, GPIO_Pin_9, RESET);
49
        Delay(400);
50
        GPIO_WriteBit(ADXL345_SPI_Port, GPIO_Pin_9, SET);
51
        Delay(400);
52

53
    }
54
}
55

56

57

58

59

60

61
void SysTick_Handler(void){
62

63
  if (Ticks != 0)
64
    Ticks--;
65

66
  }
67

68

69

70
void Delay(uint32_t cycles ){
71

72
  Ticks = cycles;
73
  while (Ticks>0);
74
}
#3112769
Lesenswert?

Hallo,

also ich kenne zwar den STM32 nicht, aber ich denke mal das ein uint32 
nicht mit einem Befehl vom RAM in (ein oder mehrere Reg.?) tranferiert 
werden kann?
Wenn dem so ist, dann sind

  Ticks = cycles;
  while (Ticks>0);

nicht atomar, also könnte dir hier die ISR SysTick_Handler() 
dazwischenfunken und einen Teil des uint32 noch beim Beschreiben ändern.

Sascha
Gast #3113109
Lesenswert?

Pete schrieb:
> es sind 2
> identische Stm32 Discovery Boards......
Wenn das stimmt, was du schreibst, eher nicht. Kannst du sicherstellen, 
dass es immer das selbe Hex-File ist, welches du in beide Boards flasht? 
Du könntest ja auch beide Boards auslesen und ein Compare über die 
Hexfiles machen.
Gast #3113124
Lesenswert?

Sascha Weber schrieb:
> also ich kenne zwar den STM32 nicht, aber ich denke mal das ein uint32
> nicht mit einem Befehl vom RAM in (ein oder mehrere Reg.?) tranferiert
> werden kann?
Falsch; beim ARMv7 sind uint32-Zugriffe per Spezifikation immer atomar 
(und werden dank 32bit-Bus auch in einem Zyklus durchgeführt). Siehe S. 
101,102 im ARMv7M-Architecture Reference Manual.
Warum das nicht funktioniert weiß ich aber auch nicht ("Ticks" sollte 
natürlich volatile sein)... Vielleicht mal überprüfen ob der Controller 
aus ominösen Gründen ständig resettet? (Breakpoint auf Reset_Handler)
#3115480
Lesenswert?

Pete schrieb:
> Genau das!!! Kann das vom watchdog kommen?? Ist der hardwaremäßig
> implementiert?

Dein Prozessor-Datenblatt sollte darüber Auskunft geben.

Aber im Normalfall ist der hardwaremässig implementiert. Muss auch so 
sein, denn der Watchdog muss auch dann noch funktionieren, wenn sich 
dein Programm bzw. der Prozessor haushoch verfranst hat und nur noch vor 
sich hindümpelt.
Dann kommt die möglichst unabhängige Hardware-Einheit "Watchdog" und 
resettet den Prozessor in einen gültigen Zustand.
Gast #3115710
Lesenswert?

#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "misc.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_spi.h"
#include "stm32f4xx_tim.h"
#include "ADXL345.h"


Da wären doch einige gute Kandidaten dabei. Z.B die RTCC !
Gast #3115923
Lesenswert?

Peter Pan schrieb:
> Anscheinend gibt es aber keine Möglichkeit den IWDG ganz abzustellen
Du könntest aber dein Gesamt-Delay in handliche Brocken aufteilen und 
zwischendurch das arme Tier ein bisschen streicheln.
Besser wäre natürlich, wenn du die unsäglichen Delays ganz rausschmeißt 
und durch eine vernünftige Timersteuerung ersetzt. Spätestens wenn 
wesentlich mehr als eine LED blinken soll, brauchst du das sowieso.
Gast #3115952
Lesenswert?

Michael schrieb:
> Peter Pan schrieb:
>> Anscheinend gibt es aber keine Möglichkeit den IWDG ganz abzustellen
> Du könntest aber dein Gesamt-Delay in handliche Brocken aufteilen und
> zwischendurch das arme Tier ein bisschen streicheln.
> Besser wäre natürlich, wenn du die unsäglichen Delays ganz rausschmeißt
> und durch eine vernünftige Timersteuerung ersetzt. Spätestens wenn
> wesentlich mehr als eine LED blinken soll, brauchst du das sowieso.

Das weiß ich... Das Blinkn ist nur ein Testprogramm um den Bootloader zu 
testen, den ich gerade schreibe... Ich wollte halt ein Program, bei dem 
ich nach dem flashen gleich sehe obs geht....

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