Các chân ngắt ngoài

Một phần của tài liệu Lập trình ARM của Ngô Vinh (Trang 51 - 67)

Các ngắt ngoài đƣợc điều khiển bởi 4 thanh ghi nhƣ hình dƣới. Thanh ghi EXMODE chọn ngắt kích theo mức hoặc theo sƣờn. Nếu một ngắt ngoài đƣợc cấu hình là kích theo sƣờn thì thanh ghi EXPOL đƣợc sử dụng để theo dõi ngắt hoạt động tăng lên hay giảm xuống. Trong trƣờng hợp kích theo mức, ngắt ngoài có thể chỉ ở mức logic 0. Nếu ở chế độ tiết kiệm nguồn thì thanh ghi EXWAKE có thể cho phép một ngắt đánh thức CPU. Để cài đặt một nguồn ngắt đơn giản chƣơng trình cần cấu hình chân EINT1 kích theo mức và kết nối tới CPU qua thanh ghi PINSEL0.

Trang 52

Hình 3.3. Chân ngắt ngoài dễ dàng đƣợc cấu hình để tạo nguồn ngắt.

3.3.3. Cấu trúc ngắt

- ARM7 có 2 chân ngắt ngoài cho yêu cầu ngắt nhanh (FIQ) và yêu cầu chế độ ngắt đa mục đích. Tất cả các ngắt đều phải kết nối tới ngắt IRQ. Trong một hệ thống đơn giản có thể kết nối qua cổng OR.

- VIC cho phép điều khiển ngắt một cách hiệu quả:

Hình 3.4 Bộ điều khiển ngắt VIC cho phép điều khiển ngắt hiệu quả

- Các ngắt phát sinh trong ứng dụng đƣợc đƣa đên VIC và đƣợc điều khiển nhƣ ngắt FIQ hoặc một vecto ngắt hoặc không có vecto ngắt.

Trang 53 Hình 3.5.

Các thanh ghi điều khiển ngắt:

VICIRQStatus: Trạng thái các ngắt IRQ VICFIQStatus: Trạng thái các ngắt FIQ

VICIntSelect: Thanh ghi chọn ngắt FIQ hay IRQ với các chân từ 14 đến 17:

Nếu các chân có giá trị 0 tƣơng ứng với ngắt IRQ đƣợc chọn, bằng 1 tƣơng ứng với ngát FIQ đƣợc chọn: STT Bít Loại ngắt Giá trị 1 14 EINT0 =0 loại ngắt IRQ =1 loại ngắt FIQ 2 5 EINT1 3 16 EINT2 4 17 EINT3

VICIntEnable: Thanh ghi cho phép ngắt.

Sử dụng các bít từ bít 14 đến bít 17 để cho phép các ngắt từ EINT0 đến EINT3:

STT Bít Loại ngắt Giá trị 1 14 EINT0 =0 không cho phép ngắt =1 cho phép ngắt 2 5 EINT1 3 16 EINT2 4 17 EINT3

VICIntEnClr: Xóa các ngắt sử dụng các bít từ 14 đến 17 tƣơng ứng với các ngắt từ EINT0 đến EINT3:

STT Bít Loại ngắt Giá trị

1 14 EINT0

=1 cho phép xóa ngắt

Trang 54

3 16 EINT2

4 17 EINT3

VICProtection: Thanh ghi bảo vệ ngắt, sử dụng bít 0:

Bít Ý nghĩa

0

=0: VIC cho phép truy cập các thanh ghi ở chế độ phân quyền hoặc ngƣời dùng.

=1: VIC chỉ cho phép truy cập các thanh ghi ở chế độ phân quyền.

VICVectAddr : Chứa địc chỉ chƣơng trình con phục vụ ngắt khi xảy ra ngắt.

VICDefVectAddr: Chứa địa chỉ chƣơng trình con phục vụ ngắt đối với loại ngắt không vecto.

VICVectAddr0 đến VICVectAddr16: Chứa địa chị chƣơng trình con phục vụ ngắt tƣơng ứng với các slot từ 0 đến 15.

VICVectCntl0 đến VICVectCntl15: Cho phép ngắt:

Bít Ý nghĩa

5 = 1 cho phép ngắt tại slot tƣơng ứng 4:0 Chứa số lƣợng ngắt tại slot

Nguồn ngắt

Nguồn ngắt và quy định kênh ngắt trên LPC213x:

Nguồn ngắt Cờ ngắt Kênh phục

vụ qua VIC

WDT Watchdog Interrupt (WDINT) 0

- Chỉ dùng cho ngắt mềm 1

ARM Core Embedded ICE, DbgCommRx 2

ARM Core Embedded ICE, DbgCommRx 3

TIMER0 Match 0 - 3 (MR0, MR1, MR2, MR3) Capture 0 - 3 (CR0, CR1, CR2, CR3)

4

Trang 55 Capture 0 - 3 (CR0, CR1, CR2, CR3) UART0 Rx Line Status (RLS)

Transmit Holding Register Empty (THRE) Rx Data Available (RDA)

Character Time-out Indicator (CTI)

6

UART1 PWM0

Rx Line Status (RLS)

Transmit Holding Register Empty (THRE) Rx Data Available (RDA)

Character Time-out Indicator (CTI) Modem Status Interrupt (MSI)

7

PWM0 Match 0 - 6 (MR0, MR1, MR2, MR3, MR4, MR5, MR6)

8

I2C0 SI (state change 9

SPI0 SPI Interrupt Flag (SPIF) Mode Fault (MODF)

10

SPI1(SSP) TX FIFO at le ast half empty (TXRIS) Rx FIFO at least half full (RXRIS) Receive Timeout condition (RTRIS) Receive overrun (RORRIS)

11

PLL PLL Lock (PLOCK) 12

RTC Counter Increment (RTCCIF) Alarm (RTCALF)

13

System Control

External Interrupt 0 (EINT0) External Interrupt 1 (EINT1) External Interrupt 2 (EINT2) External Interrupt 3 (EINT3)

14 15 16 17 ADC0 A/D Converter 0 end of conversion 18

I2C1 SI (state change) 19

BOD Brown Out detect 20

Trang 56

3.3.4. Ngắt FIQ

- Nếu có nhiều ngắt FIQ thì tƣơng ứng với các bít trong trong thanh ghi ISR thì thanh ghi trạnh thái VIC FIQ sẽ chọn chƣơng trình cọn phục vụ ngắt phù hợp để thực thi.

- Khi một ngắt FIQ sinh ra, CPU sẽ chuyển sang chế độ FIQ và PC nhảy tới địa chỉ 0x0000001C và nhảy tới địa chỉ chƣơng trình con pvn.

3.3.5. Kết thúc ngắt

- Trƣớc khi kết thúc chƣơng trình con phục vu ngắt phải đảm xóa cờ ngắt ở phía thiết bị không ngắt lại tiếp tục sinh ra.

Thí dụ ngắt FIQ: void main (void) {

IODIR1 = 0x00FF0000; //Thiet lap chan LED la chan ra

PINSEL0 = 0x20000000; //Chon chuc nang EINT1 tai chan connect block VICIntSelect = 0x00008000; //Cho phep mot kenh qua VIC la FIQ VICIntEnable = 0x00008000; //Cho phép ngat tu EINT1 vào VIC IOCLR1 = 0x00FF0000; // Xoa LED

while(1); //Lap mai mai }

void fiqint (void) __fiq //chuong trinh pvn {

IOSET1 = 0x00FF0000; //thiet lap chan led

EXTINT = 0x00000002; //xoa co ngat tu phia thiet bi ngoai }

3.3.6. Vecto IRQ

- Nếu có một nguồn ngắt là FIQ thì tất cả các nguồn con lại phải đƣợc kết nối tới đƣờng IRQ. Để quá trình xử lý ngắt hiệu quả, VIC cung cấp một bảng tìm kiếm để phân phát địa chỉ của các hàm C cho từng nguồn ngắt.

- VIC chứa đựng 16 khe cho địa chỉ. Mỗi khe chứa đựng một địa chỉ vecto và một thanh ghi điều khiển vecto.

Trang 57 Hình 3.6

- Thanh ghi điều khiển ngắt chứa đựng 2 trƣờng: một trƣờng kênh và một bít cho phép. Bằng cách lập trình trƣờng kênh, bất kỳ một kệnh ngắt nào cũng có thể đƣợc kết nối đến một khe (slot) đƣợc đƣa ra và kích hoạt bít cho phép ngắt. Thứ tự ƣu tiên của một vecto ngắt đƣợc đƣa ra bởi số slot,slot càng thấp thì ngắt càng đƣợc ƣu tiên.

Hình 3.7

- Một thanh ghi khác trong VIC slot là thanh ghi địa chỉ vecto (Vector Address Register). Thanh ghi này chứa địa chỉ của một chƣơng trình con phục vụ ngắt.

3.3.7. Kết thúc một ngắt IRQ

- Khi kết thúc một ngắt thì gửi một tín hiệu đến thanh ghi địa chỉ vecto: void main (void)

Trang 58 {

IODIR1 = 0x000FF000; //thiet lap chan ra

PINSEL0 = 0x20000000; //cho phep ngat ngoai EXTINT1 VICVectCntl0 = 0x0000002F; //chon 1 khe uu tien cho ngat

VICVectAddr0 = (unsigned)EXTINTVectoredIRQ; //lay dia chi chuong //trinh phuc vu ngat

VICIntEnable = 0x00008000; //cho phep ngat while(1);

}

void EXTINTVectoredIRQ (void) __irq {

IOSET1 = 0x000FF000; //bat led

EXTINT = 0x00000002; //xoa co ngat ngoai

VICVectAddr = 0x00000000; //gui 1 tin hieu ket thuc ngat }

3.3.8. Ngắt không có địa chỉ

VIC có thể điều khiển đƣợc 16 ngắt, nếu có nhiều hơn 16 ngắt thì phải mở rộng ngắt. Các ngắt này đƣợc phụ bởi một ISR. Địa chỉ của ISR đƣợc lƣu trong trong một thanh ghi địa chỉ ngắt mặc định. Nêu một ngắt đƣợc cho phép bởi VIC mà không đƣợc cấu hình là FIQ hoặc IRQ thì sẽ đƣợc xếp vào ngắt không có địa chỉ. Khi ngắt này xảy ra thì một địa chỉ sẽ đƣợc tải vào trong thanh ghi địa chỉ ngắt. Và CPU phải đọc thanh ghi trạng thái IRQ để xem nguyên nhân ngắt.

Trang 59

3.3.9. Kết thúc ngắt không địa chỉ

- Khi kết thúc ngắt phải xóa cờ trạng thái và viết thanh ghi địa chỉ ngắt. Thí dụ ngắt không địa chỉ:

void main (void) {

IODIR1 = 0x000FF000; //cau hinh cac chan ra

PINSEL0 = 0x20000000; //cho phap ngat ngoai EXTINT0

VICDefVectAddr = (unsigned)NonVectoredIRQ; //dua dia chi ngat IRQ //vao VIC slot VICIntEnable = 0x8000; //cho phep ngat ngoai EXTINT0 trong VIC while(1);

}

void NonVectoredIRQ (void) __irq {

if(VICIRQStatus&0x00008000) //kiem tra nguon sinh ngat {

IOSET1 = 0x00FF0000; //bat led EXTINT = 0x00000002; //xoa co ngat update++;

}

VICVectAddr = 0x00000000; //gui tin hieu ket thuc ngat }

3.4. Lập trình Timer 3.4.1. Các Timer

- Họ vi điều khiển ARM có số lƣợng các Timer dùng cho mục đích chung là khác nhau, tùy vào từng loại, nhƣng ít nhất là có 2 Timer.

- Mỗi Timer 32 bít và một mạch đếm 32 bít.

Trang 60

Hình 3.9. Cấu trúc Timer 32 bít của ARM

Thangh ghi PINSEL0 cấu hình cho các chân của TIMER:

STT Chân Kí hiệu Giá trị Chọn chân

1 5:4 P0.2 10 Capture 0.0 (Timer 0) 2 9:8 P0.4 10 Capture 0.1 (Timer 0) 3 13:12 P0.6 10 Capture 0.2 (Timer 0) 4 21:20 P0.10 10 Capture 1.0 (Timer 1) 5 23:22 P0.11 10 Capture 1.1 (Timer 1) 6 7:6 P0.3 10 Match 0.0 (Timer 0) 7 11:10 P0.5 10 Match 0.1 (Timer 0) 8 25:24 P0.12 10 Match 1.0 (Timer 1) 9 27:26 P0.13 10 Match 1.1 (Timer 1)

Thanh ghi VICIntEnable cho phép ngắt của TIMER:

- Bít D5: cho phép ngắt của Timer 1 - Bít D4: cho phép ngắt của Timer 0 Giá trị các bít này có thể đọc hoặc ghi đƣợc.

Thanh ghi VICIntSelect cho phép chọn loại ngắt của TIMER:

- Bít D5: cho phép chọn loại ngắt của Timer 1 - Bít D4: cho phép chọn loại ngắt của Timer 0

Trang 61

Giá trị các bít này có thể đọc hoặc ghi đƣợc, nếu bằng 0-là loại ngắt IRQ, 1-loại ngắt FIQ.

Các thanh ghi của Timer:

 Thanh ghi ngắt: TxIR (T0IR, T1IR)

Bít Kí hiệu Ý nghĩa Giá trị khi

khởi động

0 MR0 Cờ ngắt cho kênh so khớp 0 0

1 MR1 Cờ ngắt cho kênh so khớp 1 0

2 MR2 Cờ ngắt cho kênh so khớp 2 0

3 MR3 Cờ ngắt cho kênh so khớp 3 0

4 CR0 Cờ ngắt cho sự khiện chụp trên kênh so khớp 0 0 5 CR1 Cờ ngắt cho sự khiện chụp trên kênh so khớp 1 0 6 CR2 Cờ ngắt cho sự khiện chụp trên kênh so khớp 2 0 7 CR3 Cờ ngắt cho sự khiện chụp trên kênh so khớp 3 0

 Thanh ghi điều khiển Timer – TCR: TIMER0: T0TCR, TIMER1: T1TCR: Bít Ý nghĩa

0 =1: Cho phép đếm 1 =1: Reset bộ đếm 7:2 Không dùng

 Thanh ghi điều khiển đếm - CTCR: TIMER0: T0CTCR và TIMER1:T1CTCR: Thanh ghi này cho phép chọn giữa chế độ định thời và chế độ đếm:

Bít Mục đích Ý nghĩa các bít 1:0 Cho phép chọn chế độ đếm hoặc định thời 00: Chọn chế độ định thời

01-Chế độ đếm: TC tăng trên chân chụp đƣợc chọn bởi bít 3:2 có tăng theo sƣờn

10-Chế độ đếm: TC tăng trên chân chụp đƣợc chọn bởi bít 3:2 có giảm theo sƣờn

11-Chế độ đếm: TC tăng trên chân chụp đƣợc chọn bởi bít 3:2 theo cả sƣờn tăng và sƣờn giảm

Trang 62 3:2 Cho phép

chọn đầu vào đếm

00-Chọn kệnh CAPn.0 (CAP0.0 cho TIMER0 và CAP1.0 cho TIMER1)

00-Chọn kênh CAPn.1 (CAP0.1 cho TIMER0 và CAP1.1 cho TIMER1)

00-Chọn kệnh CAPn.2 (CAP0.2 cho TIMER0 và CAP1.2 cho TIMER1)

00-Chọn kệnh CAPn.3 (CAP0.3 cho TIMER0 và CAP1.3 cho TIMER1)

7:4 Không dùng

 Thanh ghi đếm – TC: T0TC và T1TC: Chứa giá trị đếm, giá trị trong TC sẽ tăng lên khi bộ đếm Prescale Counter đạt tới giá trị tới hạn. Khi đạt đến giá trị

0xFFFFFFFF thì TC lại quay về 0.

 Thanh ghi Prescale Register – PR: TIME R0: T0PR và TIMER1: T1PR: Là thanh ghi 32 bít, chứa giá trị cực đại cho Prescale Counter.

Thanh ghi Prescale Counter Register –PC: TIMER0: T0PC và TIMER1: T1PC:

Là thanh ghi 32 bít, giá trị của PC sẽ tăng lên theo mỗi xung nhịp, khi PC đạt tới giá trị lƣu trong thanh ghi PR và trở về 0 thì TC sẽ tăng lên 1.

 Thanh ghi so khớp MR0 đến MR3: Giá trị liên tiếp đƣợc so sánh với giá trị của TC trên các kênh tƣơng ứng.

 Thanh ghi điều khiển so khớp - MCR, TIMER0: T0MCR và TIMER1: T1MCR:

Điều khiển hành động xảy ra khi có sự kiện chụp trên các kênh tƣơng ứng:

Bít Kí hiệu Ý nghĩa

0 MR0I Cho phép sinh ra ngắt khi TC=MR0 1 MR0R Reset TC khi TC=MR0

2 MR0S Dừng TC và PC khi TC=MR0 3 MR1I Cho phép sinh ra ngắt khi TC=MR1 4 MR1R Reset TC khi TC=MR1

Trang 63

6 MR2I Cho phép sinh ra ngắt khi TC=MR2 7 MR2R Reset TC khi TC=MR2

8 MR2S Dừng TC và PC khi TC=MR2 9 MR3I Cho phép sinh ra ngắt khi TC=MR3 10 MR3R Reset TC khi TC=MR3

11 MR3S Dừng TC và PC khi TC=MR3

15:12 - Không dùng

 Các thanh ghi chụp - CR0-CR3: Chứa giá trị chụp đƣợc trên các kênh tƣơng ứng.

 Thanh ghi điều khiển chụp – CCR: TIMER0: T0CCR và TIMER1: T1CCR:

Bít Kí hiệu Ý nghĩa

0 CAP0RE Chụp khi có tín hiệu tăng từ 0 lên 1 tại kênh CAPn.0 1 CAP0FE Chụp khi có tín hiệu giảm từ 1 lên 0 tại kênh CAPn.0 2 CAP0I Cho phép sinh ra ngắt xảy ra tại kênh CAPn.0

3 CAP1RE Chụp khi có tín hiệu tăng từ 0 lên 1 tại kênh CAPn.1 4 CAP1FE Chụp khi có tín hiệu giảm từ 1 lên 0 tại kênh CAPn.1 5 CAP1I Cho phép sinh ra ngắt xảy ra tại kênh CAPn.1

6 CAP2RE Chụp khi có tín hiệu tăng từ 0 lên 1 tại kênh CAPn.2 7 CAP2FE Chụp khi có tín hiệu giảm từ 1 lên 0 tại kênh CAPn.2 8 CAP2I Cho phép sinh ra ngắt xảy ra tại kênh CAPn.2

9 CAP3RE Chụp khi có tín hiệu tăng từ 0 lên 1 tại kênh CAPn.3 10 CAP3FE Chụp khi có tín hiệu giảm từ 1 lên 0 tại kênh CAPn.3 11 CAP3I Cho phép sinh ra ngắt ngắt xảy ra tại kênh CAPn.3

15:12 - Không dùng

 Thanh ghi so khớp ngoài External Match Register – EMR: TIMER0: T0EMR và TIMER1: T1EMR: Cung cấp cả tín hiệu điều khiển và trạng thái của các chân so khớp ngoài, đảo trạng thái của các chân MAT.

Hoạt động của timer:

-Tốc độ của Timer đƣợc điều khiển bởi giá trị lƣu trữ trong thanh ghi prescaler Reg (TxPR).

Trang 64

- Bộ đếm sẽ tăng lên cho đến khi đạt tới giá trị lƣu trữ trong thanh ghi thanh ghi đếm.

- Khi đạt tới giá trị tối đa, bộ đếm sẽ đƣợc reset lại và trở lại giá trị 0.

- Thanh ghi điều khiển đếm TxTCR chỉ có 2 bít (D1D0), một bít để điều khiển cho phép đếm(D0), một bít để reset bộ đếm(D1).

- Mỗi bộ đếm có 4 kênh cho phép chụp lại giá trị của bộ đếm tại thời điểm khi có tín hiệu đầu vào tác động tạo ra sự dịch chuyển giá trị.

Hình 3.10.

- Thanh ghi điều khiển chụp (TxCCR) có thể đƣợc cấu hình để điều khiển chụp, khi giá trị bộ đếm tăng lên hoặc giảm.

- Khi xảy ra sự kiện chụp, giá trị của bộ đếm đƣợc chuyển vào thanh ghi chụp (TxCRx )và có thể sinh ra một ngắt nếu cần thiết.

Thí dụ sau cấu hình Timer 0 cho phép chụp tại 2, khi có sự kiện chụp thì sẽ sinh ra một ngắt.

int main(void) {

VPBDIV = 0x00000002; //thiet lap pclk co tan so 30 MHz

PINSEL0 = 0x00000020; //cho phep chân P0.2 de chup tai kenh 0 T0PR = 0x00007530; //Toc do cua timer là 1 Msec

T0TCR = 0x00000002; //reset bo dem va prescaler

T0CCR = 0x00000005; //Chup theo suon tăng 0->1 và sinh ra ngắt. T0TCR = 0x00000001; //cho phep timer

VICVectAddr4 = (unsigned)T0isr; //Thiet lap dia chi vecto ngat cho ISR cua time

Trang 65

VICIntEnable = 0x00000010; //Cho phep ngat while(1);

}

void T0isr (void) __irq {

static int value;

value = T0CR0; // Đọc giá trị chụp đƣợc tại kenh 0 T0IR |= 0x00000001; // xoa ngat

VICVectAddr = 0x00000000; //Gia ghi mot tin hieu ket thuc ngat }

- Mỗi kênh của Timer co một thanh ghi so khớp 32 bít, giá trị chụp đƣợc sẽ đƣợc so sánh với giá trị trong thanh ghi so khớp, khi hai giá trị trùng nhau thì Timer sẽ thực hiện một trong các hành động nhƣ: khởi động lại, dừng hoặc sinh ra ngắt và tác động đến chân ngắt ngoài có thể set =1 hoặc xóa bằng 0 hoặc lơ lửng.

Hình 3.11.

- Để cấu hình Timer có sự kiện so khớp và nạp giá trị của thanh ghi so khớp mong muốn. Sự kiện so khớp có thể có thể đƣợc điều khiển bởi thanh ghi điều khiển so

Một phần của tài liệu Lập trình ARM của Ngô Vinh (Trang 51 - 67)

Tải bản đầy đủ (PDF)

(92 trang)