ethernut-Interrupts auf AT91SAM7X-EK mit gcc

OP #868801
Lesenswert?
• ▲
▼
Mache hier noch einmal einen letzten Versuch jemanden zu finden, der 
auch ethernut auf dem AT91SAM7X-EK einsetzt.

Hierbei habe ich nicht nur Probleme, eigene Interrupts per
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_PIOA]=(unsigned int)ex_int_handler;
zum Laufen zu bekommen (Interrupt springt nicht zu main() zurück), 
sondern beim Timerbeispiel der ethernut-Homepage wird erst gar kein 
Interrupt ausgelöst.

Anbei das Projekt gezippt und hier main.c :
1
#include "AT91SAM7X256.h"
2
#ifndef __ASSEMBLY__
3
extern void dbgu_print_ascii(const char *buffer);
4
extern void dbgu_print_hex8(unsigned long);
5
#endif
6
#define LED4    AT91C_PIO_PB18 
7
#define LED3    AT91C_PIO_PB19 
8
#define LED1    AT91C_PIO_PB21 
9
#define LED2    AT91C_PIO_PB20 
10
#define TRUE 1
11
#define FALSE 0 
12
typedef unsigned char BOOL;
13
typedef unsigned char BYTE;
14
#include <string.h>
15
#include <stdio.h>
16
#include <fcntl.h>
17
#include <io.h>
18
#include <dev/board.h>
19
#include <arch/arm.h>
20
#include <dev/irqreg.h>
21
#include <sys/timer.h>
22
#include <sys/version.h>
23
int counter;
24
//+********************************************************************
25
void ApiTimerIntr(void *arg)
26
{      
27
  AT91C_BASE_PIOB->PIO_CODR=LED3; 
28
  counter++;
29
}
30
//+********************************************************************
31
int InitApiTimer(void)
32
{
33
  int dummy;
34
  outr(TC1_CCR, TC_CLKDIS);
35
  outr(TC1_IDR, 0xFFFFFFFF);
36
  dummy = inr(TC1_SR);
37
  outr(TC1_CMR, TC_CLKS_MCK32 | TC_CPCTRG | TC_WAVE | TC_EEVT_XC0);
38
  outr(TC1_RC, 0x8FF);
39
  outr(TC1_CCR, TC_CLKEN);
40
  outr(TC1_IER, TC_CPCS);
41
  NutRegisterIrqHandler(&sig_TC1, ApiTimerIntr, 0);
42
  NutIrqSetPriority(&sig_TC1, 0);
43
  NutIrqEnable(&sig_TC1);
44
  outr(TC1_CCR, TC_SWTRG);
45
  return 0;
46
}
47
//+********************************************************************
48
int w_init(void){
49
  AT91C_BASE_PIOA->PIO_PER=AT91C_PIO_PA5;    
50
  AT91C_BASE_PIOA->PIO_PER=AT91C_PIO_PA6;    
51
  AT91C_BASE_PIOA->PIO_PER=AT91C_PIO_PA7;    
52
  AT91C_BASE_PIOB->PIO_PER=LED4;    
53
  AT91C_BASE_PIOB->PIO_OER=LED4;    
54
  AT91C_BASE_PIOB->PIO_SODR=LED4;   
55
  AT91C_BASE_PIOB->PIO_PER=LED3;    
56
  AT91C_BASE_PIOB->PIO_OER=LED3;    
57
  AT91C_BASE_PIOB->PIO_SODR=LED3;   
58
  AT91C_BASE_PIOB->PIO_PER=LED2;    
59
  AT91C_BASE_PIOB->PIO_OER=LED2;    
60
  AT91C_BASE_PIOB->PIO_SODR=LED2;   
61
  AT91C_BASE_PIOB->PIO_PER=LED1;    
62
  AT91C_BASE_PIOB->PIO_SODR=LED1;   
63
  AT91C_BASE_PIOB->PIO_OER=LED1;    
64
  return 0;
65
}
66
//+********************************************************************
67
int main(void)
68
{
69
  u_long baud = 115200;
70
  int last;
71
  NutRegisterDevice(&DEV_DEBUG, 0, 0);
72
  freopen(DEV_DEBUG_NAME, "w", stdout);
73
  _ioctl(_fileno(stdout), UART_SETSPEED, &baud);
74
  printf("\n\nNut/OS %s CPU running at %lu Hz\n", NutVersionString(), NutGetCpuClock());
75
  printf("System Timer running at %lu ticks/s\n", NutGetTickClock());
76
  printf("1 second needs %lu system ticks\n", NutTimerMillisToTicks(1000));
77
  w_init();
78
  InitApiTimer();
79
  AT91C_BASE_PIOB->PIO_CODR=LED1;
80
  for(;;) {
81
    NutIrqDisable(&sig_TC1);
82
    last=counter;
83
    counter = 0;
84
    NutIrqEnable(&sig_TC1);
85
    printf("%d counter ticks\n", last);
86
    AT91C_BASE_PIOB->PIO_SODR=LED1;  // blinkende led zum test (OK)
87
    NutSleep(1000); // Sleep 1 second.      
88
    AT91C_BASE_PIOB->PIO_CODR=LED1;  // blinkende led zum test (OK)
89
    NutSleep(1000); // Sleep 1 second.      
90
  }
91
}
#868830
Lesenswert?
• ▲
▼
Hier ist ja gar keine Funktion als Interruptfunktion deklariert. Beim 
Keil geht das mit __irq - ansonsten kommst du natürlich nicht zu main 
zurück. Für den Gnu hab ich sowas auch schon gesehen. Schau mal hier im 
Forum in den Codesammlungen nach.

...oder gibt es noch andere Funktionen....

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.