Forklar mig ARM afbryde kode

H

hbaocr

Guest
hej, alle ven
Plz, forklare denne koden nedenfor, jeg ved ikke, hvordan det arbejde.Hvis mere end to FIQ anmodning, hvordan kan det arbejde, og hvordan kan CPU kerne genkende, som afbryder kilde reagerer.
kig på min kode på rækken malet rød farve,
kan erklære mig mere end to træk som dette
ex:

void FIQ_Handler (void) __fiq;void ADC_handler (void) __fiq;

Og hvis jeg kan gøre det, hvordan kan CPU genkende som FIQ Interrupt rutine reagere, som afbryder kilde, når det er besvaretKode:

/************************************************* *** /

/ * Eksempler Program For "CP-JR ARM7 USB-LPC2148" * /

/ * Target MCU: Philips ARM7-LPC2148 * /

/ *: X-TAL: 12,00 MHz * /

/ *: Kørselshastighed 60,00 MHz (Med PLL) * /

/ *: PLL Setup = M (5), P (2) * /

/ *: VPb Clock = CPU Clock = 60,00 MHz * /

/ * Keil Redaktør: uVision3 V3.03a * /

/ * Compiler: Keil CARM V2.50a * /

/ * Opret Af: Eakachai Makarn (WWW.ETT.CO.TH) * /

/ * Last Update: 17/May/2006 * /

/ * Function: Eksempel Brug UART1 Vis FIQ (EINT1) * /

/************************************************* *** /

/ / Print Besked til UART1 (9600, N, 8,1)

/ / Brugt GPIO0.14 Trigger Interrupt (FIQ Vector)

/ / Presse SW-belastning i Trigger Eksterne Interrup-1# include "LPC214x.H" / / LPC2148 MCU Register

# include <stdio.h> / / For brugte funktion printf/ * Pototype afsnittet * /

void init_serial0 (void); / / Initil UART-0

int putchar (int ch); / / Put Char til UART-0

int getchar (void); / / Get Char Fra UART-0

[color = red] void FIQ_Handler (void) __fiq; [/ color] / / EINT1 (FIQ) Interrupt Serviceint main (void)

(

init_serial0 (); / / Initilial UART0 = 9600, N, 8,1/ / Initial Eksterne Interrupt-1 (GPIO0.14)

EXTMODE | = 0x02; / / Vælg eksterne Interrupt-1 = Edge Vælg Trigger

EXTPOLAR | = 0x02; / / Vælg eksterne Interrupt-1 = Rising Edge Trigger

PINSEL0 | = 0x20000000; / / Set GPIO0.14 = EXTINT1 Interrupt

Uddød = 0x00000002; / / Clear Eksterne Interrupt1 flag/ / Initial Interrupt Vector

VICIntSelect = 0x00008000; / / Select Interrupt-15 (Eksterne Interrupt1)

VICIntEnable = 0x00008000; / / Aktiver Interrupt-15 (Eksterne Interrupt1)printf ( "CP-JRARM7 USB-LPC2148 ... Eksempel FIQ Interrupt \ n ");// Call printf Funktion

printf ( "Interrupt-1 Rising Edge Trig Ved GPIO0.14 \ n"); / / Call printf Funktion

printf ( "Tryk på Switch-belastning i Trigger Interrupt-1 \ n \ n"); / / Call printf Funktion

printf ( "Hello Fra ...... hovedfunktion \ n"); / / Call printf Funktion/ / Loop Her Vent Interrupt

while (1);

)/******************************/

/ * Initial UART0 = 9600, N, 8,1 * /

/ * VPb (pclk) = 60,00 MHz * /

/******************************/

void init_serial0 (void)

(

PINSEL0 & = 0xFFFFFFF0; / / Nulstil P0.0, P0.1 Pin Config

PINSEL0 | = 0x00000001; / / Select P0.0 = TxD (UART0)

PINSEL0 | = 0x00000004; / / Select P0.1 = RxD (UART0)U0LCR & = 0xFC; / / Nulstil Word Vælg (1:0)

U0LCR | = 0x03; / / Data Bit = 8 bit

U0LCR & = 0xFB; / / Stop Bit = 1 Bit

U0LCR & = 0xF7; / / Parity = Deaktiver

U0LCR & = 0xBF; / / Disable Break Control

U0LCR | = 0x80; / / Aktiver Programmering af Divisor Latches/ / U0DLM: U0DLL = 60,00 MHz / [16 x Baud]

/ / = 60,00 MHz / [16 x 9600]

/ / = 390,6 = 391 = 0187H

U0DLM = 0x01; / / Program Divisor Latch (391) til 9600 Baud

U0DLL = 0x87;U0LCR & = 0x7F; / / Disable Programmering af Divisor LatchesU0FCR | = 0x01; / / FIF0 Aktiver

U0FCR | = 0x02; / / RX FIFO Nulstil

U0FCR | = 0x04; / / TX FIFO Nulstil

U0FCR & = 0x3F;

)/****************************/

/ * Skriv Tegn Til UART0 * /

/****************************/

int putchar (int ch)

(

if (ch == '\ n')

(

while (! (U0LSR & 0x20)); / / Vent TXD Buffer Empty

U0THR = 0x0D; / / Skriv CR

)

while (! (U0LSR & 0x20)); / / Vent TXD Buffer Empty

return (U0THR = ch); / / Skriv Character

)/*****************************/

/ * Læs Character Fra UART0 * /

/*****************************/

int getchar (void)

(

while (! (U0LSR & 0x01)); / / Vent RXD Modtag data Ready

return (U0RBR); / / Get Receice Data & Retur

)
/********************************/

/ * Eksterne Interrupt-1 Service * /

/********************************/

void FIQ_Handler (void) __fiq

(

printf ( "Hello Fra ...... Eksterne Interrupt-1 \ n"); / / Call printf Funktion

Uddød = 0x00000002; / / Clear Eksterne Interrupt1 flag

)

 
Det kan ikke!

Du kan kun have én FIQ_Handler, hvis du har mere end en hurtig afbryder derefter din FIQ_Handler nødt til at kontrollere, hvad afbryde blev udløst.

 
hey, Krypteret
tak for din hjælp
kan du fortælle mig nærmere om det
det kan være under opførelse eller ej???

Kode:

# include "header.h"void FIQ_handle (void) __fiq;

/ / interrupt rutine for FIQ reagerevoid main ()

(

program

)void FIQ_handle (void) __fiq

(

check FIQ status register (VICFIQstatus) for at se, hvilke interrupt request kilder SVARENDE og program for hver coresponded interrupt request

eksempel

vælge sag VICFIQstatus

tilfælde <INT1>

(

interrupt service rutine for FIQ afbryder INT1

break;

)

tilfælde <INT 2>

(

interrupt service rutine for FIQ afbryder INT2

break;

)

....)
 
Ja, hvis du skal bruge hurtigt afbryder.

Det ville være lettere at bruge vektoriserede IRQ'er og lad Interrupt Controller tage sig af tingene.

PS: Læs '5 ,7 VIC brug noter 'i brugermanualen, det recommendeds, at kun én
afbryde kilden bør klassificeres som FIQ.

 
takker Krypteret en masse.

Jeg er den samme IRQ og non_IRQ interrupt request.At vi kan kun erklære en interrupt service rutine, og kontroller at se, hvilke afbryde kilden er SVARENDE ved at kontrollere IRQ status.og gøre det samme contruction ovenfor.

 
Nej, du har forskellige håndterer for forskellige afbryder, og du tildele dem prioriteringer.

Tag et kig på HITEX bogen 'The Insider's Guide To The NXP ARM7-Baseret Microcontrollers', kan du downloade det gratis.Den har alt, hvad du ønsker at vide.

 

Welcome to EDABoard.com

Sponsor

Back
Top