GIAO TIẾP VỚI MÁY TÍNH THÔNG QUA JTAG UART
Sinh viên thực hiện:
1. Họ và tên: ... MSSV: ... 2. Họ và tên: ... MSSV: ... Thời gian thực hiện: 4 tiết.
Mục tiêu
Bài thực tập này nhằm mục đích giúp sinh viên tìm hiểu về phương thức giao tiếp UART giữa máy tính và hệ thống nhúng.
Yêu cầu
Dựa vào các ngoại vi, chức năng hỗ trợ của board DE2-115 đã được tìm hiểu ở lab1 kết hợp với các phương thức giao tiếp giữa hệ thống và máy tính được thông qua JTAG UART để thiết kế một hệ thống có khả năng:
1. Nhận một dãy số gồm có 8 chữ số được nhập từ bàn phím vào Terminal.
2. Giải mã và hiển thị dãy số vừa nhập ra LED 7 đoạn.
Các bước thực hiện 4.4.3.1 Sơ đồ hệ thống
67
4.4.3.2 Các bước thực hiện
Bước 1: Tạo hệ thống mới
Sinh viên tiến hành tạo project mới tương tự như đã tiến hành ở các bài thực tập trước.
Sinh viên có thể đặt tên thư mục và tên project tương tự như Hình 4.4.2
Hình 4.4.2 Tạo project mới
Hình 4.4.3 Chọn dòng vi xử lý và chip
Bước 2: Xây dựng hệ thống trên QSys
Ở bước này ta tiến hành xây dựng hệ thống giống như hệ thống ở lab1, chỉ cần thêm thêm IP core JTAG_UART.
Hệ thống QSys bao gồm:
o CPU: cấu hình sử dụng core Nios II processor Nios II/s, JTAG Debug Module lever 2.
o RAM (On-Chip Memory (RAM or ROM)): 32 kB.
o JTAG_UART (Interface Protocols Serial JTAG UART). o SW (PIO): 16 bit – input.
o LEDR (PIO): 16 bit – output. o HEX3_0 (Parallel Port): 3 to 0.
68 o HEX7_4 (Parallel Port): 7 to 4.
Hình 4.4.4 Thêm JTAG_UART
69
Hình 4.4.6 Hệ thống hoàn chỉnh
Bước 3: Gán chân hệ thống
Việc gán chân cũng tương tự như ở lab1.
Sau khi gán chân cho hệ thống ta tiến hành biên dịch và nạp hệ thống xuống board DE2-115 như các bìa thực tập trước đã làm.
Hình 4.4.7 Hệ thống sau khi gán chân
70
Việc viết chương trình ứng dụng cho hệ thống cũng đã được hướng dẫn ở những bài trước. Ta chỉ thay đổi đoạn code điều khiển của hệ thống.
Đoạn code điều khiển:
#include <system.h>
char text_string[] = "Nhap so:\n> \0"; char chr_string[] = {}; char code_7seg[] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07, 0x7F, 0x67, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71 }; char buffer_7seg[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; void Hex(char number, char order_7seg )
{
volatile int * HEX3_0 = (int *) HEX3_0_BASE; volatile int * HEX7_4 = (int *) HEX7_4_BASE;
71
buffer_7seg[order_7seg] = code_7seg[number]; *(HEX3_0) = *(int *) (buffer_7seg);
*(HEX7_4) = *(int *) (buffer_7seg+4); }
void Clear_Display() { char count;
for (count=0; count <8; count++) {
Hex(0, count); }
}
void put_jtag( volatile int * JTAG_UART_ptr, char c ) { int control; control = *(JTAG_UART_ptr + 1); if (control & 0xFFFF0000) { *(JTAG_UART_ptr) = c; } } void Hex_display(char j) { int i; for(i=0;chr_string[i]!=0;++i) {Hex (chr_string[i],j--); chr_string[i]=0; } }
72 int main(void)
{
volatile int * JTAG_UART_ptr = (int *) JTAG_UART_BASE;
int data, i,j=0, seg7;
for (i = 0; text_string[i] != 0; ++i) put_jtag (JTAG_UART_ptr, text_string[i]); //printf("Nhap so: \n >"); while(1) { data = *(JTAG_UART_ptr); if (data & 0x00008000) {
data = data & 0x000000FF; if (data!=10) { if(j<=7) chr_string[j]=data-48; j++; } if (data==10) { Clear_Display(); Hex_display(j-1); j=0; }
put_jtag (JTAG_UART_ptr, (char) data & 0xFF ); }
} }
Biên dịch lỗi và tiến hành nạp phần mềm xuống hệ thống. Cách thực hiện tương tự các bài lab trước.
73
Hình 4.4.8 Kết quả biên dịch thành công
Bước 5: Demo hệ thống
Sau khi đã biên dịch và nạp thành công tất cả các quá trình trên, tiến hành chạy thử để kiểm tra chương trình.
Nhập dãy số 1234567 từ Terminal (Hình 4.4.9), sau khi nhấn phím Enter thì số vừa nhập sẽ được hiển thị lên LED 7 đoạn (Hình 4.4.10), các giao tiếp giữa hệ thống và máy tính được thông qua JTAG.
74
Hình 4.4.10 Kết quả hiển thị lên LED 7 đoạn
Kết quả đạt được
Qua bài thực tập này, sinh viên củng cố được các kiến thức đã được vận dụng ở các bài thực tập trước, đồng thời xây dựng được hệ thống nhúng hoàn chỉnh có khả năng giao tiếp với máy tính thông qua JTAG_UART để có thể nhập dãy số, giải mã và hiển thị dãy số đã nhập ra thiết bị ngoại vi là LED 7 đoạn.
75