You are on page 1of 11

Bo mon: Dien tu may tinh

Lab 4: GPIO Interrupt

Ngắt (interrupt) là quá trình dừng chương trình chính đang chạy để ưu tiên
thực hiện một chương trình khác, chương trình này được gọi là chương trình phục
vụ ngắt (ISR –Interrupt Service Routine).

Trong các quá trình ngắt, ta phân biệt thành 2 loại: ngắt cứng và ngắt mềm
Ngắt mềm là ngắt được gọi bằng một lệnh trong chương trình ngôn ngữ máy
Khác với ngắt mềm, ngắt cứng không được khởi động bên trong máy tính mà do
các linh kiện điện tử tác đông lên hệ thống

Hoạt động: Khi thực hiện lệnh gọi ngắt, CPU sẽ tìm kiếm trong bảng vector
ngắt địa chỉ của chương trình phục vụ ngắt. Người sử dụng cũng có thể xây dựng
môt chương trình cơ sở như các chương trình xử lý ngắt. Sau đó, các chương trình
khác có thể gọi ngắt ra để sử dụng. Một chương trình có thể gọi chương trình con
loại này mà không cần biết địa chỉ của nó.

Trong phạm vi bài thực hành này chúng ta sẽ cùng học học cách thực hiện
ngắt bởi AXI GPIO.

4.1. Tổng quan

Trước khi thực hành, chúng ta cần hiểu lõi IP của AXI INTC, AXI INTC tên
đầy đủ là AXI Interrupt Controller (Bộ điều khiển ngắt AXI). Lõi Bộ điều khiển
ngắt AXI (INTC) có thể tập trung nhiều đầu vào ngắt từ các thiết bị ngoại vi thành
một đầu ra ngắt duy nhất, sau đó truyền ngắt đến bộ xử lý hệ thống. Các thanh ghi
được sử dụng để kiểm tra, kích hoạt và xác nhận các ngắt được truy cập thông qua
giao diện slave của đặc tả AXI cho giao thức AMBA (Giao diện mở rộng nâng cao
kiến trúc bus vi điều khiển nâng cao). AXI INTC (bộ điều khiển ngắt) có các tính
năng sau: Lõi IP AXI INTC có thể được truy cập thông qua giao diện AXI4-Lite
và hỗ trợ tối đa 32 ngắt. Bộ điều khiển ngắt có thể được xếp tầng để tạo ra các tín
hiệu ngắt khác và hỗ trợ chế độ ngắt nhanh. Mỗi đầu vào hoặc đầu ra của bộ điều
khiển ngắt có thể được cấu hình theo mức hoặc độ nhạy sườn. Mức độ ưu tiên giữa
các tín hiệu ngắt được xác định bởi các bit của vectơ, với bit có trọng số thấp nhất
(LSB, trong trường hợp này là bit 0) có mức ưu tiên cao nhất. Bộ điều khiển ngắt
chứa một thanh ghi cho phép ngắt có thể kích hoạt có chọn lọc các đầu vào ngắt

Edit: Thanh Ngoc


Bo mon: Dien tu may tinh

riêng lẻ. IP cũng có thể được cấu hình với chức năng ngắt phần mềm và lồng ghép
ngắt.

Hình 4.1.1 là sơ đồ khối cấp cao nhất của lõi IP AXI INTC. Chức năng chính
của lõi IP AXI INTC là nhận tín hiệu ngắt đầu vào bên ngoài, sau khi phát hiện
ngắt, nó sẽ phát ra tín hiệu yêu cầu ngắt và hệ thống xử lý có thể định cấu hình lõi
IP AXI INTC thông qua giao diện AXI. Dưới đây sẽ giới thiệu ngắn gọn ba mô-
đun chính của lõi IP AXI INTC.

Hình 4.1.1. Sơ đồ khối lõi IP AXI INTC

Khối Regs: Mô-đun này chứa các thanh ghi điều khiển và thanh ghi trạng
thái. Tất cả chúng đều được truy cập thông qua giao diện slave AXI4-Lite và mỗi
thanh ghi có bốn byte.

 Int Det (Phát hiện ngắt): Mô-đun này được sử dụng để phát hiện đầu vào
ngắt. Nó có thể cấu hình mỗi đầu vào ngắt được kích hoạt theo mức hoặc sườn.
 Irq Gen (Tạo ngắt): Mô-đun này có các chức năng sau:

1) Tạo ngắt đầu ra cuối cùng từ bộ điều khiển ngắt.

2) Độ nhạy ngắt được xác định bởi các tham số cấu hình.

Edit: Thanh Ngoc


Bo mon: Dien tu may tinh

3) Kiểm tra các điều kiện cho phép tạo ngắt trong các thanh ghi điều khiển
(MER và IER).

4) Đặt lại ngắt sau khi xác nhận.

5) Ghi địa chỉ vectơ của ngắt hoạt động vào thanh ghi IVR (vectơ ngắt) và
kích hoạt thanh ghi IPR cho các ngắt đang chờ xử lý.

4.2. Mục tiêu

Thực hiện chương trình ngắt trên GPIO, chương trình ngắt được thực hiện khi
có phát hiện trạng thái nút bấm và tạo tín hiệu ngắt thông qua AXI GPIO. Sau khi
bộ điều khiển ngắt phát hiện ngắt, sẽ gửi yêu cầu ngắt tới bộ xử lý. Bộ xử lý điều
khiển đèn LED để bật và tắt thông qua ngắt nhận được.

4.3. Nội dung thực hiện

4.3.1. Thiết kế khối phần cứng

Trong sơ đồ khối hệ thống, nút KEY được sử dụng làm đầu vào của AXI
GPIO và đèn LED được sử dụng làm đầu ra của AXI GPIO. Khi AXI GPIO phát
hiện sự thay đổi trạng thái nút (button), AXI GPIO sẽ tạo tín hiệu ngắt và chuyển
nó đến bộ điều khiển ngắt. Bộ điều khiển ngắt tạo ra tín hiệu đầu ra ngắt và chuyển
nó đến bộ xử lý MicroBlaze. Bộ xử lý MicroBlaze nhận được Tín hiệu ngắt điều
khiển đèn LED. Bộ điều khiển ngắt được kết nối với MicroBlaze thông qua AXI
Interconnect và MicroBlaze có thể định cấu hình bộ điều khiển ngắt thông qua giao
diện AXI.

Hình 4.3.1. Sơ đồ khối hệ thống

Edit: Thanh Ngoc


Bo mon: Dien tu may tinh

Sinh viên tự thực hiện các thao tác mở project mới với khối vi xử lý mềm
Microblaze như các bài thực hành trước đây.

Trong bài thực hành cần thêm AXI lõi IP GPIO được kết nối với nút bấm
cùng với lõi IP AXI GPIO của đèn LED, và thêm lõi IP AXI INTC là bộ điều
khiển ngắt.

Mở Block Design và thêm hai lõi IP AXI GPIO như hình dưới, trong đó
“axi_gpio_0” (tùy ý đặt tên) đặt độ rộng bit thành 1 (chỉ cần 1 nút)

Hình 4.3.2. Cài đặt khối axi_gpio_0

Và khối hiển thị Led như hình 4.3.3.

Edit: Thanh Ngoc


Bo mon: Dien tu may tinh

Hình 4.3.3: Cài đặt khối hiển thị Led

Sau đó nhấp vào nút Tiếp tục "+", nhập "intc" vào hộp tìm kiếm bật lên và
nhấp đúp vào "AXI Interrupt Controller" để thêm IP, như trong Hình 4.3.4:

Hình 4.3.4: Thêm lõi IP AXI INC

Sau khi thêm IP click đúp vào IP để vào trang cấu hình, trong thử nghiệm này
chúng ta không cần thực hiện bất kỳ cấu hình nào chỉ cần nhấn “OK”. Hình 4.3.5
là sơ đồ trang Basic của AXI Lõi IP GPIO:

Edit: Thanh Ngoc


Bo mon: Dien tu may tinh

Hình 4.3.5: Thiết lập lõi IP AXI INTC

Tóm tắt ngắn gọn các chức năng của từng tùy chọn cấu hình:

Number of Peripheral Interrupts (Auto): Số lượng thiết bị ngắt ngoại


vi. Tùy chọn này cho phép lựa chọn số lượng đầu vào ngắt ngoại vi. Trong IP
Integrator, giá trị này được xác định tự động bởi số lượng tín hiệu ngắt kết nối.

Enable Fast Interrupt Logic: Cho phép nhanh ngắt logic. Tùy chọn này cho
phép AXI INTC hoạt động ở chế độ ngắt nhanh. Ở chế độ này, AXI INTC sử
dụng interrupt_address để cung cấp địa chỉ vectơ ngắt và bộ xử lý xác nhận ngắt
bằng tín hiệu processor_ack. Khi chọn đầu ra ngắt tín hiệu đơn, chế độ ngắt nhanh
sẽ không khả dụng.

Peripheral Interrupts Type: Loại ngắt thiết bị bên ngoài, tùy chọn này được
sử dụng để đặt tín hiệu ngắt đầu vào.

Interrupts type – Edge or Level: Loại ngắt – sườn hoặc cấp độ. Tùy chọn
này đặt ngắt đầu vào thành loại sườn hoặc mức. 0 biểu thị loại cấp độ, 1 biểu thị
loại sườn.

Edit: Thanh Ngoc


Bo mon: Dien tu may tinh

Level type – High or Low: Loại cấp độ – cấp độ cao hoặc cấp độ thấp. 0 có
nghĩa là mức độ thấp, 1 có nghĩa là mức độ cao.

Edge type – Rising or Falling: Loại sườn – sườn tăng hoặc sườn giảm. 0 có
nghĩa là sườn giảm, 1 có nghĩa là sườn tăng. Cần lưu ý rằng các giá trị của
Interrupts type – Edge or Level, Level type – High or Low và Edge type –
Rising or Falling thường được xác định tự động bởi tín hiệu ngắt được kết nối,
nhưng chúng cũng có thể được đặt thủ công nếu cần.

Processor Interrupt Type and Connection: Thư mục này được sử dụng để
đặt tín hiệu đầu ra của bộ điều khiển ngắt. Trong thư mục này, bạn có thể đặt loại
ngắt thành loại theo mức hoặc loại theo sườn và chế độ kích hoạt. Tùy chọn
Interrupt Output Connection được sử dụng để đặt xem đầu ra tín hiệu ngắt của
bộ điều khiển ngắt là tín hiệu đơn hay tín hiệu loại bus.

Kết nối giao diện "interrupt" tín hiệu đầu ra của AXI Interrupt Controller
với giao diện "INTERRUPT" của MicroBlaze và kết nối giao diện "ip2intc_irpt"
của AXI GPIO mới được thêm vào giao diện intr[0:0] của AXI Interrupt
Controller. Như thể hiện trong hình 4.3.6:

Hình 4.3.6: Kết nối với ngắt

Sau đó nhấp vào nút “Run Connection Automation”, chọn nhâp vào tất cả các
tín hiệu, nhấp “OK”, hiển thị như hình 4.3.7:

Edit: Thanh Ngoc


Bo mon: Dien tu may tinh

Hình 4.3.7: Lựa chọn tín hiệu

Sau khi kết nối xong chúng ta chọn “Regenerate Layout” trên thanh menu
của trang Diagram để bố trí lại như hình 4.3.8:

Hình 4.3.8: Tạo lại bố cục

Cuối cùng, đổi tên giao diện “axi_gpio_ 0” thành “key” và tên giao diện
“axi_gpio_1” thành “led”. Sơ đồ kết nối thiết kế phần cứng cuối cùng được thể
hiện trong Hình 4.3.9:

Hình 4.3.9: Sơ đồ kết nối kiến trúc hệ thống tổng thể

Tại thời điểm này, nhấp đúp vào lõi AXI Interrupt Controller IP để mở trang
cấu hình. Chúng ta có thể thấy rằng đầu vào ngắt của lõi AXI Interrupt Controller

Edit: Thanh Ngoc


Bo mon: Dien tu may tinh

IP đã được đặt ở mức độ nhạy cao, như trong Hình 4.3.10. Điều này là do tín hiệu
ngắt do AXI GPIO tạo ra. Đây là tín hiệu mức cao.

Hình 4.3.10: Cài đặt tự động ngắt đầu vào

Tiếp theo tiến hành gán chân cho key, và thực hiện Generate Bitstream

4.4. Thiết kế phần mềm:

Sau khi xuất phần cứng sang Vitis và mở môi trường phát triển Vitis, các
bước tạo dự án ứng dụng đều giống với các bài thực hành trước. Dự án ứng dụng
trống mới tạo có tên là "key_interrupt".

Sinh viên tạo ứng dụng “hello world” và paste đoạn mã chương trình dưới đây
kiểm tra.
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xintc.h"
#include "xgpio.h"
#include "xparameters.h"

Edit: Thanh Ngoc


Bo mon: Dien tu may tinh

#include "xil_exception.h"

XGpio_Config *gpio_config;
XGpio gpio;

XIntc intc;
void gpioHandler(){
XIntc_Acknowledge(&intc,XPAR_INTC_0_GPIO_0_VEC_ID);

XGpio_InterruptDisable(&gpio,XGPIO_IR_CH1_MASK);

u32 Read = XGpio_DiscreteRead(&gpio, 1);


xil_printf("Interrupt Occur , Value Read : %0d\n",Read);

XGpio_InterruptClear(&gpio,XGPIO_IR_CH1_MASK);
XGpio_InterruptEnable(&gpio,XGPIO_IR_CH1_MASK);
}

void intc_init(){
int status = XIntc_Initialize(&intc, XPAR_AXI_INTC_0_DEVICE_ID);

if(status == XST_SUCCESS)
xil_printf("INTC INIT SUCCESSFUL\n");
else
xil_printf("INTC INIT FAILED\n");

status = XIntc_SelfTest(&intc);

if(status == XST_SUCCESS)
xil_printf("INTC SELF TEST SUCCESSFUL\n");
else
xil_printf("INTC SELF TEST FAILED\n");

///////////////////////////////////////////
/////////////Initialize and Enable Exception Handler(1)
Xil_ExceptionInit();
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
(Xil_ExceptionHandler)XIntc_InterruptHandler, &intc);
Xil_ExceptionEnable();
//////Specify Interrupt type -> Handler

XIntc_Connect(&intc, XPAR_INTC_0_GPIO_0_VEC_ID,
(XInterruptHandler)gpioHandler,0);

////////Closing Switch 1
XIntc_Enable(&intc, XPAR_INTC_0_GPIO_0_VEC_ID);

/////////Closing Switch 2
XGpio_InterruptGlobalEnable(&gpio);
XGpio_InterruptEnable(&gpio,XGPIO_IR_CH1_MASK);

///////////Start Operation in Real Mode


XIntc_Start(&intc, XIN_REAL_MODE);
}

void gpio_init(){
gpio_config = XGpio_LookupConfig(XPAR_AXI_GPIO_0_DEVICE_ID);

Edit: Thanh Ngoc


Bo mon: Dien tu may tinh

int status = XGpio_CfgInitialize(&gpio, gpio_config, gpio_config-


>BaseAddress);

if(status == XST_SUCCESS)
xil_printf("GPIO INIT SUCCESSFUL\n");
else
xil_printf("GPIO INIT FAILED\n");

XGpio_SetDataDirection(&gpio, 1, 0xff);

int main()
{
init_platform();
gpio_init();
intc_init();
while(1){

}
cleanup_platform();
return 0;
}
4.5. Bài tập:

1. Sử dụng ngắt trên GPIO. Thiết kế mạch đếm số lần nhấn phím BTNC. Kết
quả đếm hiển thị dạng nhị phân trên LED đơn.

2. Sử dụng ngắt trên GPIO. khi nhấn BTN0: LED0 sáng nhấp nháy 5 lần rồi
tắt, khí nhấn BTN1: LED0 sáng nhấp nháy 7 lần rồi tắt, khi nhấn BTN2: LED0
sáng nhấp nháy 3 lần rồi tắt.

3. Sử dụng ngắt trên GPIO. Khi nhấn BTN0, 8 LED sáng lần lượt từ trái qua
phải rồi tắt, Khi nhấn BTN2, 8 LED sáng lần lượt từ phải qua trái rồi tắt.

4. Sử dụng ngắt trên GPIO. Viết chương trình đọc giá trị từ button. Nếu
BTN0 nhấn, Led sáng lan từ giữa sang 2 bên. Nếu BTN1 nhấn, led sang lan từ 2
bên về giữa. Nếu BTN2 nhấn, led sang lan từ trái qua phải. Nếu BTN2 nhấn, LED
sang lan từ phải qua trái.

Edit: Thanh Ngoc

You might also like