Hướng dẫn này là về ngắt trong LPC2148 ARM7 vi điều khiển. Như trong bài trước, chúng tôi đã lập trình bộ đếm thời gian trong LPC2148 để tạo ra độ trễ chính xác . Ở đây chúng tôi sẽ tạo ra gián đoạn để thực hiện nhiệm vụ tương tự. Trong suốt loạt bài hướng dẫn này, chúng tôi sẽ sử dụng ngắt với một số thiết bị ngoại vi của LPC2148 ARM7. Trước khi chúng ta tiến hành thêm nữa, hãy làm mới khái niệm ngắt và sau đó chúng ta sẽ xem xét ngắt thời gian trong LPC2148.
Interrupt hoặc ISR là gì?
Nói chung, một ngắt là một tín hiệu từ thiết bị gắn vào một máy tính hoặc từ một chương trình trong bộ điều khiển gây ra chương trình chính để dừng lại và tìm ra những việc cần làm tiếp theo. ISR (gián đoạn dịch vụ thường xuyên) được thực hiện khi một gián đoạn xảy ra. Một phần của chương trình kiểm soát khi nhận được ngắt và thực hiện các thao tác cần thiết để phục vụ ngắt.
Làm thế nào gián đoạn hoạt động?
- Bất cứ khi nào bất kỳ thiết bị nào cần dịch vụ của vi điều khiển, thiết bị sẽ thông báo cho vi điều khiển bằng cách gửi tín hiệu ngắt.
- Khi nhận được tín hiệu ngắt, bộ vi điều khiển dừng hoặc ngắt dòng chương trình chính và lưu địa chỉ của lệnh tiếp theo (PC) trên con trỏ ngăn xếp (SP).
- Nó nhảy đến một vị trí cố định trong bộ nhớ, được gọi là bảng vectơ ngắt giữ địa chỉ của ISR (gián đoạn dịch vụ thường xuyên). Mỗi ngắt có ISR riêng. Bộ vi điều khiển nhận địa chỉ của ISR từ bảng vectơ ngắt và nhảy tới nó.
- Nó bắt đầu thực thi Routing Service Interrupt cho đến khi nó đạt đến lệnh cuối cùng của chương trình con là RETI (Return from Interrupt). RETI không được sử dụng trong C Mã hóa. (Hình: Liên kết gián đoạn và ISR)
- Khi thực hiện lệnh cuối cùng trong chế độ ngắt dịch vụ gián đoạn, bộ vi điều khiển trả về nơi nó bị tắt hoặc bị gián đoạn trước đó. Và đầu tiên, nó nhận địa chỉ truy cập chương trình (PC) từ con trỏ ngăn xếp bằng cách popping hai byte trên cùng của ngăn xếp vào PC.
- Sau đó, nó bắt đầu thực hiện từ địa chỉ đó và tiếp tục thực hiện chương trình chính.
Gián đoạn trong vi điều khiển LPC2148 ARM7
Trong LPC2148 ARM7 Vi điều khiển, VIC là một thành phần từ phạm vi ô ARM nguyên tố của mô-đun đó là bộ điều khiển ngắt được tối ưu hóa cao. VIC được sử dụng để xử lý tất cả các nguồn gián đoạn trên chip từ các thiết bị ngoại vi. Mỗi nguồn ngắt được kết nối với VIC trên một kênh cố định. Phần mềm ứng dụng của chúng tôi có thể kết nối các kênh này với các dòng ngắt CPU (FIQ, IRQ)
- Tổng cộng, ARM hỗ trợ đầu vào yêu cầu 32-ngắt
- Trong ARM, bộ điều khiển đặc biệt được kết hợp để xử lý ngắt được gọi là VECTORED INTERRUPT CONTROLLER (VIC)
- Các AMBA ( Một dvance H Performance igh B chúng ta) được sử dụng cho giao diện điều khiển vector ngắt cho ARM7 Core (LPC2148) trong trường hợp của chúng tôi.
Bộ điều khiển ngắt vector (VIC) nhận đầu vào yêu cầu 32-ngắt và gán chúng lập trình thành 3 loại, được liệt kê dưới đây:
FIQ | Yêu cầu ngắt nhanh: Để xử lý ngắt nhanh, chậm trễ. FIQ có mức ưu tiên cao nhất theo sau là vector ngắt 0-31. Chỉ có một nguồn FIQ tại một thời điểm thường được sử dụng trong một hệ thống |
IRQ được Vector | Vectored Interrupt Request: VIRQ có mức ưu tiên trung bình. Vectored Interrupt Controller có 32 khe cắm ngắt vector trong đó có 16 khe được sử dụng để định địa chỉ vectơ. Mỗi khe chứa đăng ký địa chỉ vector và đăng ký điều khiển vector |
IRQ không được Vector | Yêu cầu không được Vector: IRQ không được Vector có mức độ ưu tiên thấp nhất. VIC có khả năng xử lý 16 thiết bị ngoại vi như một ngắt vectơ và ít nhất một thiết bị như một ngắt FIQ. Nếu trong trường hợp có nhiều hơn 17 nguồn ngắt trên chip, bất kỳ ngắt thêm nào cũng có thể được phục vụ như là một ngắt không có Vector. |
QUAN TRỌNG: Bộ điều khiển ngắt có véc-tơ có khe cắm ngắt 23 bit trong đó 16 khe được sử dụng trong LPC2148. Mỗi khe có bộ thanh ghi như kiểm soát & đăng ký địa chỉ. Nếu bất kỳ khe nào được sử dụng thì các thanh ghi này phải được lập trình. Vị trí 0 sẽ có mức độ ưu tiên cao nhất và vị trí 15 sẽ có mức độ ưu tiên thấp nhất .
ĐĂNG KÝ: INTERRUPT trong LPC2148 ARM7
Có rất nhiều thanh ghi gián đoạn mà chúng ta sẽ sử dụng để thiết lập ngắt trong Bộ vi xử lý LPC2148 ARM7. Chúng tôi khuyên người đọc nên giữ biểu dữ liệu trong tay. Chúng tôi sẽ khám phá một vài trong số những người đăng ký trong khi giải thích mã chương trình. Vui lòng theo dõi bảng dữ liệu [Chương: 7.4 Trang No: 66-74]
BƯỚC: Để ngắt chương trình trong LPC2148 vi điều khiển ARM7
- Bật ngắt
- Chọn loại ngắt nghĩa là IRQ hoặc FIQ
- Nếu FIQ thì ISR nên được viết là:
- Nếu Vectored IRQ thì chúng ta phải truy cập vào thanh ghi của đăng ký kiểm soát tức thời IRQ và đăng ký địa chỉ và viết ISR như sau:
- Nếu nó là Non-Vectored IRQ thì truy cập Default Address Register:
Dự án E xample: Để sử dụng ngắt trong dự án ví dụ của chúng tôi. Chúng tôi sẽ sử dụng Bộ hẹn giờ để hiển thị việc sử dụng ngắt trong Bộ vi điều khiển LPC2148 ARM7. Như chúng ta đã thấy Timer trong bài trước. Tôi tin rằng bộ não của chúng ta vẫn còn ấm áp với nó. Để duy trì sự đơn giản trong dự án ví dụ của chúng tôi, chúng tôi sẽ nhấp nháy LED khi ngắt được tạo sau mỗi 0.5 giây.
GIẢI THÍCH MÃ:
Hãy chia nhỏ mã thành từng phần để giải thích chi tiết. Chúng tôi sẽ cố gắng hiểu những gì mỗi dòng là viết tắt của. Bạn có thể thấy, chúng tôi chỉ thêm một chức năng bổ sung vào chương trình ví dụ thời gian trước đó.
Trong hàm này, chúng ta đã cấu hình tính năng Timer0 và Interrupt. Khi chúng tôi sẽ chạy PCLK ở 60 MHz, chúng tôi sẽ đặt giá trị prescale là 60000-1 = 59999 vào thanh ghi T0PR sao cho sau mỗi chu kỳ đồng hồ 60000 chúng tôi tăng thanh ghi T0TC (60000 chu kỳ đồng hồ ở 60 MHz cho phép tạo 1 độ phân giải ms). Bây giờ thiết lập 500-1 = 499 vào thanh ghi T0MR0 , kích hoạt ngắt ở mỗi 500 mili giây. Chúng tôi cũng phải đặt bit 0 và 1 vào thanh ghi T0MCR để ngắt và đặt lại Thanh ghi Bộ đếm Timer ( TC ) trong Đăng ký Kết hợp ( MR0 ). VICVectAddr4 = (không dấu) timer0IS R, được sử dụng để thiết lập con trỏ để làm gián đoạn dịch vụ thường xuyên (Trong trường hợp của chúng tôi timer0ISR). Về cơ bản, Vector Address Register lưu trữ địa chỉ của hàm ISR và được sử dụng để gán hoặc cho phép khe IRQ vector. Chúng tôi cũng phải bật ưu tiên vị trí và đặt cho gián đoạn. VICVectCntl4 = (1 << 5) | 4 , ở đây thiết lập bit 5 trong Vector Control Register4 sẽ cho phép slot đã gán bởi VICVectCntl 4 ie ở đây trong trường hợp này là '4'. Viết số thập phân 4 sẽ đặt nguồn ngắt tức là Timer0 làm gián đoạn. Sau khi thiết lập tất cả các thanh ghi liên quan ngắt, chúng ta phải bật ngắt Timer0 bằng cách thiết lập VICVectIntEnable = (1 << 4) và Reset Timer0 bằng cách thiết lập bit 1 thành HIGH thành đăng ký T0TCR .
NGUỒN LÃI ĐỐI VỚI ĐIỀU KHIỂN TƯƠNG LAI VECTORED (VIC)
Để biết thêm chi tiết về các nguồn ngắt, vui lòng truy cập bảng dữ liệu [Chương 7.5 Nguồn ngắt, Trang số: 73-74]
Đây là một thói quen dịch vụ gián đoạn (ISR). Như chúng ta đã sử dụng Timer0 như một nguồn ngắt. Sự kiện phù hợp với MR0 làm tăng IRQ ( I nterrupt R e Q uest). Bởi vì chúng ta đều biết Timer 0 là nguồn ngắt để đọc giá trị hiện tại T IMER 0 ‘s Tôi nterrupt R egister tức T0IR . Khi sự kiện kết hợp MR0 xảy ra, chúng tôi sẽ chuyển đổi LED được kết nối với Pin P0.10.
Không có nhận xét nào:
Đăng nhận xét