Hallo, vielleicht sollte ich doch einen Sammelthread aufmachen.... Ich möchte einfach nur jede Minute durch die RTC im LPC2368 einen IRQ auslösen. Die IRQs werden auch ausgelöst aber dauernd, d.h. der uC ist sofort nach Verlassen der ISR wieder drin, hat kaum für was anderes Zeit. Die LEDS flimmern beide gleichmässig, statt jede Minute zu wechseln. Dabei lösche ich doch die IRQ Anforderung RTC_ILR |= RTC_ILR_RTCCIF; // 1= RTC IRQ Flags in der ISR. Mir fällt nichts mehr ein, habe das Keil Beispiel studiert, das sieht genauso aus wie meines. Das __ARMLIB_enableIRQ() ist übrigens nur ein Makro für Rowley Programme, ähnliche dem IEENABLE bei Keil. VECTORED_IRQ_INTERRUPTS habe ich im Präprozessor auch definiert, sonst läuft die ISR gar nicht. Der Aufruf
1 | Init_RTC(); |
2 | Init_RTC_ISR(RTC_CIIR_IMMIN); |
3 | __ARMLIB_enableIRQ(); |
Hier der Code
1 | void Init_RTC() |
2 | {
|
3 | RTC_CCR = 0; // RTC ausschalten |
4 | PCONP |= (1 << 9); // RTC mit Strom versorgen |
5 | RTC_AMR = 0xff; // Alle Alarms deaktivieren |
6 | RTC_CIIR = 0; // Alle IRQs aus |
7 | |
8 | // Die RTC starten und auf 32khz Quarz legen
|
9 | RTC_CCR |= (1<<CCR_CLKSRC_BIT); |
10 | RTC_CCR |= (1<<CCR_CLKEN_BIT) ; |
11 | }
|
12 | |
13 | |
14 | // ISR installieren (mode, s. header file)
|
15 | BOOL Init_RTC_ISR(uint8_t mode) |
16 | {
|
17 | |
18 | RTC_ILR &= ~(1 << RTC_ILR_RTCCIF); // Lösche das RTC_ILR, pending IRQ's |
19 | RTC_CIIR = mode; // Setze 1s IRQ Auslösung, alle anderen Bits = 0 |
20 | |
21 | // Installiere die ISR
|
22 | |
23 | /* alternativer Code statt Keil, läuft auch
|
24 | VICVectAddr13 = (uint32_t)&RTC_ISR;
|
25 | VICIntEnable = 1 << RTC_INT;
|
26 | */
|
27 | |
28 | if ((Install_irq (RTC_INT, (void*)RTC_ISR,LOWEST_PRIORITY)) == FALSE) |
29 | return FALSE; |
30 | |
31 | return TRUE; |
32 | |
33 | }
|
Die ISR
1 | / Die ISR der RTC |
2 | void __attribute__ ((interrupt("IRQ"))) RTC_ISR (void) |
3 | {
|
4 | static char sw = 0; |
5 | |
6 | if (sw == 0) { |
7 | LED1_ON(); |
8 | LED2_OFF(); |
9 | sw = 1; |
10 | }
|
11 | else if (sw == 1) |
12 | {
|
13 | LED1_OFF(); |
14 | LED2_ON(); |
15 | sw = 0; |
16 | }
|
17 | |
18 | RTC_ILR |= RTC_ILR_RTCCIF; // 1= RTC IRQ Flags löschen |
19 | VICVectAddr = 0; // IRQ löschen |
20 | |
21 | }
|
Die Defines
1 | #define RTC_ILR_RTCCIF 0x01 //ILR Register, Bit für pending IRQs der Uhr
|
2 | |
3 | // RTC: Counter Increment IRQ Register Bits
|
4 | #define RTC_CIIR_IMSEC 0x00000001
|
5 | #define RTC_CIIR_IMMIN 0x00000002
|
6 | #define RTC_CIIR_IMHOUR 0x00000004
|
7 | #define RTC_CIIR_IMDOM 0x00000008
|
8 | #define RTC_CIIR_IMDOW 0x00000010
|
9 | #define RTC_CIIR_IMDOY 0x00000020
|
10 | #define RTC_CIIR_IMMON 0x00000040
|
11 | #define RTC_CIIR_IMYEAR 0x00000080
|