Porta biblotek till STM32L151 ger ett repeterbart fel..

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Johan.o
EF Sponsor
Inlägg: 2386
Blev medlem: 18 juni 2003, 01:08:50
Ort: Jönköping

Porta biblotek till STM32L151 ger ett repeterbart fel..

Inlägg av Johan.o »

Håller just nu på att porta ett API till STM32L151. Det är ett api från decawave. För kommunikation med en radio över SPI.
SPI-kommunikationen fungerar.

Men mitt problem är i deca_device.c, somm tillhör API'et.
Där deklareras en pekare, som även initialiseras.
Men problemet är att pekaren aldrig blir initialiserad.

static dwt_local_data_t *pdw1000local = dw1000local ; // Static local data structure pointer

Men jag förstår inte varför..
Hela projektet (Cocox), finns bifogat för den som har lust att kika på det..

Tacksam för hjälp :-)
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Johan.o
EF Sponsor
Inlägg: 2386
Blev medlem: 18 juni 2003, 01:08:50
Ort: Jönköping

Re: Porta biblotek till STM32L151 ger ett repeterbart fel..

Inlägg av Johan.o »

Hittade felet nu,

tydligen så var bss-sektionen i startup-filen bortkomenterad.. (använder Cocox)
Tog bort komenteringen, och då blev alla globala inititialiserade, men instället så går den i hardFault_Handler hela tiden..
Så det verkar vara ett problem som kommer från kompilatorn..

Ska försöka testa någon annan kompilator.. Ananrs, är det någon som har ett tips på hur man kan få ordning på startup-filen i Cocox?
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Porta biblotek till STM32L151 ger ett repeterbart fel..

Inlägg av lillahuset »

Det kan naturligtvis vara kompilatorn men jag tvivlar.
Jag har nog bara kunnat dokumentera kompilatorfel en handfull gånger under det kvartssekel jag programmerat i C. Aldrig med GCC även om jag har upplevt en del underligheter.

Vid något tillfälle hade jag samma (?) problem som du med Cocox. Tyvärr minns jag inte vad orsaken var men det var absolut inte kompilatorn. Möjligen att det var ett "spurious interrupt". Har du en vettig interrupthanterare för hard fault? Själv har jag inspirerats av det här: http://www.freertos.org/Debugging-Hard- ... llers.html Har hjälpt mig att hitta fel ett par gånger.

Edit: Så här ser "min" kod ut. Helt uppenbart att assemblerbiten är "cut and paste" från webbsidan. :)

Kod: Markera allt

/**
  * @brief  assembler part of hard fault handler
  * @brief  http://www.freertos.org/Debugging-Hard-Faults-On-Cortex-M-Microcontrollers.html
  * @param  none
  * @retval none
  * @date   2015-06-17
  */
void HardFault_Handler(void)
{

  __asm volatile
    (
     " tst lr, #4						\n"
     " ite eq							\n"
     " mrseq r0, msp						\n"
     " mrsne r0, psp						\n"
     " ldr r1, [r0, #24]					\n"
     " ldr r2, handler2_address_const				\n"
     " bx r2							\n"
     " handler2_address_const: .word irqHandleStackFrame	\n"
    );

} /* HardFault_Handler */


/**
  * @brief  C part of hard fault handler
  * @brief  http://www.freertos.org/Debugging-Hard-Faults-On-Cortex-M-Microcontrollers.html
  * @param  pointer to stack frame
  * @retval none
  * @date   2015-06-17
  */
void irqHandleStackFrame(uint32_t *stackframe)
{

  StackR0 = stackframe[0];
  StackR1 = stackframe[1];
  StackR2 = stackframe[2];
  StackR3 = stackframe[3];

  StackR12 = stackframe[4];
  StackLR = stackframe[5];
  StackPC = stackframe[6];
  StackPSR = stackframe[7];

#ifdef DISPLAYENVIRONMENT
  static USART_TypeDef *usart;
  static const char *cp;
  static uint32_t i, j, t, v;

  usart = UsartPtr[1];

  for (i = 0; i < ENVIRONMENTSZ; i++) {
    /* display string */
    cp = envlabel[i];

    while (*cp) {
      /* wait for TXE */
      while (!(usart->SR & USART_SR_TXE)) {
      }

      usart->DR = (uint16_t) *cp++;
    }

    /* display value */
    if (envvalue[i]) {
      v = *envvalue[i];

      for (j = 0; j < 8; j++) {
	t = v >> 28;
	v <<= 4;

	if (t <= 9) {
	  t += '0';
	} else {
	  t += ('a' - 0x0a);
	}

	/* wait for TXE */
	while (!(usart->SR & USART_SR_TXE)) {
	}

	usart->DR = (uint16_t) t;
      }
    }
  }
#endif

  for(;;) {
  }

} /* irqHandleStackFrame */
Johan.o
EF Sponsor
Inlägg: 2386
Blev medlem: 18 juni 2003, 01:08:50
Ort: Jönköping

Re: Porta biblotek till STM32L151 ger ett repeterbart fel..

Inlägg av Johan.o »

Hej,

Tack för hjälpen. Fick det att snurra.. Men sedan har jag inte jobbat mer med det då det var dags för semester..
Hur som helst var det bss-sektionen som var bortkomenterad i startupfilen från cocox, det är de som skrivit den.
Sedan kommer jag inte ihåg om det var något mer.. får kika närmare efter jag vilat upp mig.

I min hard fault handler har jag än så länge ingen kod alls, mer än en evighetsloop och en stopflagga för debuggern.
Vad gör din kod i din hard-fault handler? Känns som det kan vara bra att göra något vettigt där, för för eller senare kommer
det att inträffa något fel.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Porta biblotek till STM32L151 ger ett repeterbart fel..

Inlägg av lillahuset »

Ja du det undrade jag också när jag började titta på koden, det är ju två år sedan jag skrev den...

Det som händer är att ett antal register från stacken och några systemregister som kan vara användbara skrivs ut till debuguarten. Detta som ett komplement till debuggern.

Jag vet inte riktigt varför jag krånglade till det så men det verkade väl vettigt då. Idag skulle jag nog förenkla lite, tex ta bort de globala variablerna StackR0..StackPSR. Se nedan för saknad information.


I headerfilen för projektet:

Kod: Markera allt

extern volatile uint32_t StackR0, StackR1, StackR2, StackR3, StackR12, StackLR, StackPC, StackPSR;
I filen med globala variabler:

Kod: Markera allt

volatile uint32_t StackR0, StackR1, StackR2, StackR3, StackR12, StackLR, StackPC, StackPSR;
I filen med interrupthanterarna:

Kod: Markera allt

#define ENVIRONMENTSZ 16
static const char *envlabel[ENVIRONMENTSZ] = {
  "\r\nHard fault handler",
  "\r\nR0  0x",
  "\r\nR1  0x",
  "\r\nR2  0x",
  "\r\nR3  0x",
  "\r\nR12 0x",
  "\r\nLR  0x",
  "\r\nPC  0x",
  "\r\nPSR 0x",
  "\r\nMMAR 0x",
  "\r\nBFAR 0x",
  "\r\nCFSR 0x",
  "\r\nHFSR 0x",
  "\r\nDFSR 0x",
  "\r\nAFSR 0x",
  "\r\n******************\r\n"};
volatile uint32_t *envvalue[ENVIRONMENTSZ] = {
  NULL,
  &StackR0,
  &StackR1,
  &StackR2,
  &StackR3,
  &StackR12,
  &StackLR,
  &StackPC,
  &StackPSR,
  ((volatile uint32_t *) 0xe000ed34),
  ((volatile uint32_t *) 0xe000ed38),
  ((volatile uint32_t *) 0xe000ed28),
  ((volatile uint32_t *) 0xe000ed2c),
  ((volatile uint32_t *) 0xe000ed30),
  ((volatile uint32_t *) 0xe000ed3c),
  NULL};
Skriv svar