Hallo,
hat jemand einen funktionierenden Code für den ARM7, idealerweise mit
Crossworks geschrieben, damit die Header einheitlich sind, der zB eine
LED über die Timer zum blinken bringt? Aus mir unerfindlichen Gründen
laufen meine IRQ nicht, sie werden einfach nicht "gezündet", dabei
verwende ich fertige Beispiele, die eigentlich klipp und klar sein
sollten. Nun ja, so ganz blicke ich durch die vielen Vektoren noch nicht
durch aber wenigstens sollte es erstmal blinken.
Gruss,
Christian
"Den ARM7" gibt es nicht.
Jedenfalls aus Sicht der verschiedenen Komponenten der Übersetzungstools
und Laufzeitbibliotheken. Die sind immer auf ein spezielles µC-Modell
(mit ARM7 Kern und Herstellerspezifischer Periferie auf dem µC)
abgestimmt.
Welchen µC hast du konkret?
Die zusätzlichen Beispiele auf
http://www.rowleydownload.co.uk/arm/packages/ hast du schon gesichtet?
Ich sehe zwar im Moment keins speziell zum Timer-Interrupt, aber die
Beschreibungen der Pakete sind auch nicht sehr ausführlich.
Hallo,
ja, die habe ich schon, wenngleich es mein Board dort nicht gibt. Das
Beispiel zum RTC IRQ ist dermassen kompliziert, dass ich da nur Bahnhof
verstehe, weil die mit Funktionen in der Parameterliste arbeiten und
kiloweise Zeigern, die alles noch unübersichtlicher machen, wenn man
nicht der war, der das Programm erstellt hat. Passt ausserdem wohl nur
für die Keil Oberfläche, Crossworks hat andere Spezialwörter um zB eine
Funktion als IRQ zu definieren.
1
//interrupts.c
2
#include"interrupts.h"
3
4
/**** INTERRUPTS FUNCTION ****/
5
void(*UART0_function)(unsignedchar);
6
void(*UART1_function)(unsignedchar);
7
void(*EINT0_function)();
8
void(*EINT1_function)();
9
void(*EINT2_function)();
10
void(*RTC_function)();
11
12
voidVIC_EnableInt(unsignedintIntType)
13
{
14
VICIntEnable|=IntType;//Enable inerrupt
15
}
16
17
voidVIC_DisableInt(unsignedintIntType)
18
{
19
VICIntEnClear|=IntType;//Disable interrupt
20
}
21
22
voidVic_Init()
23
{
24
VICProtection=0;// Setup interrupt controller.
25
VICIntEnClear=0xffffffff;// Disable all interrupts
Hallo Christian,
der folgende Code ist in Crossworks erstellt und benutzt die Crossworks
tasking library (ctl_api.h). Er ist für den AT91SAM7S64, aber die
Benutzung der ctl_api sollte daraus klar werden.
Eigentlich benötigst Du nur folgende Funktionen:
isr ist der Interrupt-Handler
PIOA_ID ist die ID der Interruptquelle
Eine relativ gute Beschreibung der library findest Du auch unter:
http://www.rowley.co.uk/documentation/arm_1_7/index.htm
Hier ein Programmausschnitt. Bei Tastendruck wird ein Interrupt
ausgelöst, ein Flag wird gesetzt und in main() wird darauf mit
LED-Leuchten reagiert.
@ Christian
Ah, es geht um den VIC (vector interrupt controller) und vectored
interrupts (##).
Disclaimer: Ich bin Laie und spekuliere nur
U.a. dass man einen Zeiger auf deine Interruptfunktion (im Beispiel
UART0_func) an eine Funktion (im Beispiel InitUART0Interrupt) übergibt
und diese Funktion dann den global speichert (im Beispiel in
UART0_function) und in den ersten Interruptvektor-Slot (im Beispiel
VICVectAddr0) einträgt sowie den Kanal setzt für den dieser Vektor
gelten soll (siehe #)
Und dann es einen globalen Interrupthandler (im Beispiel
IRQ_ISR_Handler) gibt, der sich den aufgetretenen Interruptvektor (im
Beispiel VICVectAddr) schnappt und ausführt.
Leider sieht man im Codeschnippsel mehrere Sachen nicht
* Wie wird deine Interruptfunktion definiert? Ich schätze dafür sind
spezielle Schlüsselworte in der Definition nötig. Crossworks ist doch
auf GCC Basis - da helfen vielleicht die Definitionen aus #
* Läuft das VIC immer oder müssen andere Sachen beachtet werden. Dazu
habe ich
http://ccgi.rowley.co.uk/support/faq.php?do=article&articleid=25
gefunden. Das sieht für mich so aus, dass die VIC Unterstützung nicht
defaultmässig mitkompiliert wird sondern dass speziell übersetzt werden
muss. In # steht ähnliches mit speziellem Startupcode.
#
http://www.mikrocontroller.net/articles/ARM-elf-GCC-Tutorial#Interrupts
sowie die Beispiele bei WinARM ### und/oder GnuARM
##
http://winarm.scienceprog.com/arm-mcu-types/interrupt-system-of-arm-lpc2000-microcontrollers.html
### Beispiel RTV für WinARM
http://winarm.scienceprog.com/winarm-gcc-tutorial/real-time-clock-of-lpc2148.html
Hallo,
danke, erstmal Eure Antworten ausgedruckt, bevor sie "weggetaucht" sind.
Toll, dass sich Leute hier soviel Arbeit mit der Hilfe machen !!!!
Grosses Dankeschön!
PS: Die nächste Frage kommt bestimmt.... warum bei Crossworks ein Brand
mit "Flash release" das Programm nicht startet. Der mit "Flash debug"
klappt nämlich, mit eingestecktem JTAG aber auch abgezogenen. Nur sind
da eben die Debug Infos noch mit im Code.
Gute Nacht erstmal !
Christian
Hallo,
ich denke folgende Struktur würde für alle Fälle reichen, die bei mir
vorkommen:
1. - IRQ Routine Timer 1
- IRQ Routine UART
- IRQ Routine SPI
......
2. Initialisierung der IRQ Routinen, Zuordnung der Hardware zum
jeweiligen Handler.
3. IRQ freigeben und glücklich sein.
Bevor ich da tiefer reintauche muss ich jedoch erst mehr über diesen VIC
lesen, wie der funktioniert. Beim PIC war das so schön einfach, nur ein
IRQ Vektor, Bits abfragen und je nach Bit in die passende Routine
verzweigen. Die Zeiten sind wohl vorbei.
Im ersten Ansatz wäre schon eine blinkende LED schön, die bei jedem
Timer Match aufblinkt.
Gruss,
Christian
Nachwort:
Was bisher nicht funktioniert ist immer noch der "Flash release" bei
Crossworks 1.7. (Anm: Die Release Version enthält keine Debug Infos mehr
und ist wesentlich kleiner im Code) Ich habe da wirklich alles
ausprobiert, der uC startet nicht von allein. Der besagte Schalter
STARTUP_FROM_RESET für den Startup code wird im LPC210x.s gar nicht
abgefragt, ist also nicht wirksam. Was ich mich frage ist, ob es
vielleicht einen LPC213x.s Code gibt, der liegt jedoch der Eval Version
nicht anbei.
Weiss da jemand einen Rat? Wie bringe ich dem uC bei, dass er bei 0
starten soll? Ach ja, die Schalter für das Laden per RS232 auf dem
Demoboard sind abgeschaltet, ers springt also nicht in die Bootloader
Routine hinein.
Was ohne weiteres funktioniert ist das Starten, wenn ich "Flash debug"
brenne, er bootet dann auch ohne JTAG Kabel und die Crossworks Umgebung.
Gruss,
Christian
@Nils:
Um das nochmal auszugraben (ich kann eh nicht schlafen bei Vollmond).
1
intmain(void)
2
{
3
…
4
ctl_set_isr(11,11,CTL_ISR_TRIGGER_FIXED,isr,0);
5
ctl_unmask_isr(11);
6
…
7
}
ist mit der ersten 11 die Interruptquelle SPI gemeint? Beim LPC.... gibt
es 16 Quellen, jede ist einer Hardware zugeordnet.
es gibt zudem zwei ctl Header, eine low-level und einen für
"programmable interrupt controllers". weiterhin wird behauptet, dass der
ARM keinen programmierbaren Controller hat, daher müsse man die bekannte
Syntax anwenden:
1
Interrupt service routine (ARM example)
2
3
This example declares an ISR using the GCC syntax for declaring naked functions and accessing assembly code instructions.
4
5
void irq_handler(void) __attribute__((naked))
Bin da jetzt ein bisschen verwirrt, kann man wirklich nicht die
komfortablen ctl Funktionen zur Interruptsteuerung verwenden?
PS:
Lüppt eh nicht...., kriege vom Linker die Meldungen, dass er die ctl
Funktionen nicht referenzieren kann, obwohl die im Header eingebunden
wurden.
grumpf
> kriege vom Linker die Meldungen, dass er die ctl> Funktionen nicht referenzieren kann, obwohl die im Header eingebunden> wurden.
Den Linker interessieren eingebundene Header nicht, Du musst schon
angeben, welche Library gelinkt werden muss.
Das sollte bei CW unter Project Options -> Linker -> Additional Input
Files möglich sein.
http://rowley.co.uk/documentation/arm_1_7/ide_property_linker_help.htm
Hi guys,
I I just read the discussion here. I could abel to understand
half of it. I have aproblem with the CTL . my code runs with JATAG ,
reset my board then the program hangs , bootloader boots and starts the
application.but the application hangs.any sugestion would be helpfull.
cheers
Kumar
Read this, it helps :-)
http://ccgi.rowley.co.uk/support/faq.php?do=article&articleid=35
Please tell us what ARM7 you use and how it works with the ctl
functions. I am not sure if the arm7 has a programmable IRQ controller
or not. I get linker errors when trying to use the ctl functions.
Hi Cristian,
THanks for the reply.we use str71 processor, and it has the
EIC(extended interreput controller). what kind of linker error you are
getting.you could link the ctl library in to your project and need to do
some porting stuff for your target like which timer to use for the
ctl_tick.you can find the board support package for most of the target
from crossworks where the ctl porting is done.
Cheers
kumar
Hello,
the question is: Has the LPC22xx from NXP a "programmable" IRQ System?
In my opinion the VIC is not programmable, it is only a vectored IRQ
system.
Maybe my error is, that I don not include the Library in the linker
file. I only include the ctl.h File same way like I use other standard
libearys. The linker knows the path to the standard libs.