IDE
1) QT Creator
2) Tích hợp vào Visual Studio, Eclipse
Chương trình dịch: qmake
1) Qmake for Windows
2) Qmake for Linux
3) Qmake for Embedded Linux
163 trang |
Chia sẻ: huongthu9 | Lượt xem: 459 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Giáo trình Môn Hệ Nhúng - Chương 3: Vi điều khiển và lập trình Firmware - Phạm Văn Thuận, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Hệ nhúng
81
Nội dung chương 3
Chương 3: Vi điều khiển và lập trình firmware
3.1. Tổng quan vi điều khiển
3.2. Vi điều khiển họ 8051
3.3. Vi điều khiển ARM
Hệ nhúng
82
3.1. Tổng quan vi điều khiển
Vi điều khiển Vi xử lý
Vi điều khiển: Computer On Chip
(bao gồm cả CPU, Bộ nhớ, cổng vào ra)
Hệ nhúng
83
Tổng quan vi điều khiển
Một số dòng vi điều khiển phổ biến hiện nay
• 8051 (AT89C51, AT89S51, AT89S52)
• AVR (ATMEGA8, ATMEGA16)
• PIC (PIC16F877A, PIC18F4550, PIC18F2550)
• ARM (ARM7, ARM9, ARM Cortex-Mx, ARM
Cortex-Ax)
•
Hệ nhúng
84
Lập trình vi điều khiển
Lập trình vào ra các cổng (trên từng cổng hoặc
từng chân của cổng)
Lập trình sử dụng ngắt
Lập trình với các môđun ngoại vi: UART, SPI,
I2C
Hệ nhúng
3.2. Vi điều khiển họ 8051
Kiến trúc vi điều khiển 8051
Lập trình firmware cho vi điều khiển 8051
85
Hệ nhúng
86
3.2.1. Kiến trúc vi điều khiển 8051
Do hãng Intel thiết kế năm
1981
Gồm 40 chân
Có 4 cổng vào ra, mỗi
cổng rộng 8 bit: P0, P1, P2,
P3
Nhóm chân nguồn, dao
động và điều khiển
Ngoại vi: UART
6 nguồn ngắt (2 ngắt ngoài)
2 bộ Timer/Counter
4KB Flash, 128 Byte Ram
Tần số xung nhịp tối đa: 24
MHz
Hệ nhúng
87
Đóng vỏ vi điều khiển 8051
Hệ nhúng
88
Kiến trúc vi điều khiển 8051
Hệ nhúng
89
Các thanh ghi của 8051
Các thanh ghi dùng để lưu tạm thời dữ liệu hoặc
địa chỉ
Các thanh ghi này chủ yếu là thanh ghi 8 bit
Các thanh ghi thường được sử dụng
• Thanh ghi A : thanh ghi tích lũy
• Thanh ghi R0->R7
• Thanh ghi con trỏ dữ liệu DPTR (16 bit)
• Thanh ghi bộ đếm chương trình PC (16bit)
Hệ nhúng
3.2.2. Lập trình vi điều khiển 8051
Giới thiệu về lập trình hợp ngữ
Lập trình C
90
Hệ nhúng
91
Giới thiệu lập trình hợp ngữ
Ngôn ngữ máy:
• Chỉ được biểu diễn bằng số nhị phân.
• Bộ vi xử lý chỉ hiểu được các chương trình mã máy.
• Con người rất khó khăn để tạo lập hay đọc hiểu chương
trình ngôn ngữ máy.
Hợp ngữ (Assembly Language):
• Là ngôn ngữ lập trình bậc thấp (gần ngôn ngữ máy nhất).
• Được xây dựng trên cơ sở ký hiệu tập lệnh của bộ vi xử lý
tương ứng.
• Phụ thuộc hoàn toàn vào bộ vi xử lý cụ thể.
Ngôn ngữ lập trình bậc cao:
• Gần với ngôn ngữ tự nhiên hơn.
• Được xây dựng độc lập với cấu trúc của máy tính.
Hệ nhúng
92
Tập lệnh
Mỗi bộ xử lý/ vi điều khiển có một tập lệnh xác định
(mang tính kế thừa trong cùng một dòng họ).
Tập lệnh thường có hàng chục đến hàng trăm lệnh.
Mỗi lệnh là một chuỗi số nhị phân mà bộ xử lý/ vi điều
khiển hiểu được để thực hiện một thao tác xác định.
Các lệnh được mô tả bằng các kí hiệu gợi nhớ các
lệnh hợp ngữ.
Ví dụ: Lệnh ADD A, #3Ah
0 0 1 0 0 1 0 0 0 0 1 1 1 0 1 0
3Ah
Hệ nhúng
93
Khuôn dạng của một lệnh máy
Mã thao tác (Operation Code - Opcode): mã hóa
cho thao tác mà CPU phải thực hiện.
Tham chiếu toán hạng: mã hóa cho toán hạng
hoặc nơi chứa toán hạng mà thao tác sẽ tác
động.
• Toán hạng nguồn (Source Operand): dữ liệu vào của
thao tác (CPU sẽ đọc)
• Toán hạng đích (Destination Operand): dữ liệu ra của
thao tác (CPU sẽ ghi)
Mã thao tác Tham chiếu toán hạng
Hệ nhúng
94
Các chế độ địa chỉ
Chế độ địa chỉ tức thời
• Toán hạng nguồn là hằng số
• Trước dữ liệu tức thời cần có dấu #
• Ví dụ:
MOV A, #25 ; Nạp giá trị 25 và thanh ghi A
Hệ nhúng
95
Các chế độ địa chỉ
Chế độ định địa chỉ thanh ghi
• Sử dụng thanh ghi để lưu trữ dữ liệu cần thao tác
• Thanh ghi nguồn và đích phải phù hợp về kích
thước
• Không được chuyển dữ liệu giữa các thanh ghi
R0->R7
• Ví dụ:
MOV A, R0 ; Chuyển dữ liệu trong R0 vào A
Hệ nhúng
96
Các chế độ địa chỉ
Chế độ địa chỉ trực tiếp
• Toán hạng (nguồn hoặc đích) là địa chỉ của ô nhớ
• Trước địa chỉ ô nhớ không có dấu #
• Ví dụ:
MOV A, 35h ;Dữ liệu trong ô nhớ có địa chỉ
; 35h được chuyển vào thanh ghi A
Hệ nhúng
97
Các chế độ địa chỉ
Chế độ định địa chỉ gián tiếp thanh ghi
• Địa chỉ ô nhớ chứa dữ liệu được chứa trong
thanh ghi R0 hoặc R1
• Trước thanh ghi R0 hoặc R1 phải chèn thêm ký
tự “@” để biểu thị cho chế độ địa chỉ này
• Ví dụ:
MOV A,@R0 ;chuyển dữ liệu trong ô nhớ có
;địa chỉ được chỉ ra trong thanh
;ghi R0 vào thanh ghi A
Hệ nhúng
98
Tập lệnh vi điều khiển 8051
Lệnh số học
Lệnh truyền dữ liệu
Lệnh logic
Xử lý bit
Lệnh rẽ nhánh
Hệ nhúng
99
Tập lệnh vi điều khiển 8051
Lệnh số học
Lệnh Giải thích
ADD đích, nguồn Đích = đích + nguồn
ADDC đích, nguồn Đích = đích + nguồn + cờ nhớ
SUBB đích, nguồn Đích = đích – nguồn
INC nguồn Đích = đích + 1
DEC nguồn Đích = đích - 1
MUL AB A*B
DIV AB A/B
Hệ nhúng
100
Tập lệnh vi điều khiển 8051
Lệnh truyền dữ liệu
Lệnh Giải thích
MOV đích, nguồn Đích = nguồn (Bộ nhớ trong)
MOVX đích, nguồn Đích = nguồn (Thao tác bộ nhớ
ngoài)
PUSH Đẩy dữ liệu vào đỉnh ngăn xếp
POP Lấy dữ liệu từ đỉnh ngăn xếp
XCH Tráo đổi dữ liệu
XCHD Tráo đổi dữ liệu ( 4 bit thấp)
Hệ nhúng
101
Tập lệnh vi điều khiển 8051
Lệnh logic
Lệnh Giải thích
ANL Lệnh “AND”
ORL Lệnh “OR”
XRL Lệnh “XOR”
CLR Xóa bit
RL, RLC Lệnh quay trái
RR, RRC Lệnh quay phải
Hệ nhúng
102
Tập lệnh vi điều khiển 8051
Lệnh rẽ nhánh
Lệnh Giải thích
ACALL Gọi chương trình con, địa chỉ 11 bit
LCALL Gọi chương trình con, địa chỉ 16 bit
RET Trở về từ chương trình con
JMP Lệnh nhảy không điều kiện
JZ, JNZ, JB, JNB Lệnh nhảy có điều kiện (kiểm tra
bit)
Hệ nhúng
103
Cú pháp của hợp ngữ
Một chương trình hợp ngữ bao gồm một chuỗi
các dòng lệnh hợp ngữ
Một lệnh hợp ngữ có một từ gợi nhớ (ADD,
SUBB, MOV) và tùy vào từng lệnh mà sau đó
không, một hay hai toán hạng
Lệnh hợp ngữ gồm có 4 thành phần
[nhãn:] [từ gợi nhớ] [các toán hạng] [;chú giải]
Ví dụ:
bat_dau: MOV A,#25 ;Khởi gán A=25
Hệ nhúng
104
Dữ liệu của chương trình
Hợp ngữ cho phép biểu diễn dưới dạng:
• Số nhị phân: 1011b, 1011B, ...
• Số thập phân: 35, 35d, 35D, ...
• Số Hexa: 4Ah, 0ABCDh, 0FFFFH, ...
• Kí tự: "A", 'HELLO', "Bach Khoa", ...
Tất cả các kiểu dữ liệu trên sau đó đều được
trình dịch Assembler dịch ra mã nhị phân.
Mỗi kí tự được dịch thành mã ASCII tương ứng
• Chương trình không phân biệt 'A' với 41h hay 65
Hệ nhúng
105
Kiểu dữ liệu
Chỉ có một kiểu dữ liệu là kiểu dữ liệu 8 bit
(Kiểu byte)
Để định nghĩa một dữ liệu kiểu byte, cần sử
dụng chỉ dẫn DB
Hệ nhúng
106
Các chỉ dẫn
ORG: Báo địa chỉ bắt đầu
EQU: dùng để định nghĩa hằng số
• VD: COUNT EQU 25
END: báo kết thúc file mã nguồn
Hệ nhúng
107
Một số lệnh cơ bản
Lệnh ADD: cộng
• Cú pháp:
ADD A,nguồn ;cộng toán hạng
;nguồn vào thanh ghi A
Lệnh MOV: chuyển dữ liệu
• Cú pháp
MOV đích, gốc ;chuyển dữ liệu từ toán hạng
;gốc vào toán hạng đích
Hệ nhúng
108
Dịch và chạy chương trình
Hệ nhúng
109
Ví dụ sử dụng lệnh ADD, MOV
ORG 000 ;Dia chi bat dau cua chuong trinh
MOV R5, #25h ;Nap 25h vao R5
MOV R7, #34h ;Nap 34h vao R7
MOV A, #0 ;Nap 0 vao thanh ghi A
ADD A, R5 ;A=A+R5
ADD A, R7 ;A=A+R7 (A=25h+34h)
HERE: SJMP HERE ;O lai trong vong lap
END
Sử dụng các lệnh ADD, MOV
Hệ nhúng
110
Ví dụ nhấp nháy led
ORG 000 ;Dia chi bat dau cua chuong trinh
AGAIN:
SETB P1.0 ;Nhap nhay led o chan P1.0
ACALL DELAY
CLR P1.0
ACALL DELAY
SJMP AGAIN
DELAY: ;Tao tre
MOV R1,#255
LOOP:
DJNZ R1,LOOP
RET
END
Hệ nhúng
111
2.4.Các cấu trúc lập trình với hợp ngữ
2.4.1. Các lệnh liên quan
2.4.2. Cấu trúc điều kiện
2.4.3. Cấu trúc lặp
Hệ nhúng
112
Các lệnh điều kiện
Lệnh nhảy có điều kiện: JZ, JNZ, DJNZ, JC,
JNC, JB, JNB
Lệnh nhảy không điều kiện: SJMP (nhảy ngắn),
LJMP (nhảy dài)
Ví dụ:
MOV A,R5 ;A=R5
JNZ NEXT ;Nhảy tới NEXT nếu A khác 0
MOV R5,#55h
NEXT:
Hệ nhúng
113
Lệnh lặp
Lệnh DJNZ
• Cú pháp
DJNZ thanh_ghi, nhãn
+ Sau mỗi lần nhảy, giá trị thanh ghi bị giảm đi 1
+ Nếu giá trị thanh ghi vẫn khác 0 thì nhảy tới nhãn
Ví dụ: Xóa thanh ghi A, cộng 3 vào thanh ghi A 10 lần
MOV A,#0
MOV R2,#10
BACK: ADD A,#3
DJNZ R2,BACK ;Lặp 10 lần
MOV R5,A ;Cất A vào R5
Hệ nhúng
114
Các lệnh logic, lệnh quay
Lệnh ANL
ANL đích, nguồn ; đích=đích AND nguồn
Mục đích: che, xóa bit
VD: - Xóa 4 bit thấp của thanh ghi A
ANL A,#0F0h
Lệnh ORL
ORL đích, nguồn ; đích=đích OR nguồn
Mục đích: thiết lập bit
VD: - Thiết lập 4 bit cao của thanh ghi A
ORL A,#0F0h
Hệ nhúng
115
Các lệnh logic, lệnh quay
Lệnh XRL
XRL đích, nguồn ; đích=đích XOR nguồn
Mục đích: - Xóa thanh ghi (XOR với chính nó)
- Đảo bit (XOR với 1)
VD: Xóa thanh ghi A
XRL A,A
Đảo các bit của thanh ghi A
XRL A,#0FFh
Hệ nhúng
116
Các lệnh logic, lệnh quay
Lệnh quay
• Lệnh quay phải: RR A
• Lệnh quay trái: RL A
Hệ nhúng
117
Các lệnh logic, lệnh quay
Lệnh quay
• Lệnh quay phải qua cờ nhớ: RRC A
• Lệnh quay trái qua cờ nhớ: RLC A
Hệ nhúng
118
Cổng vào/ra và lập trình
8051 có 4 cổng vào ra (mỗi cổng 8 bit): P0, P1,
P2, P3
Sau khi reset, các cổng ở chế độ mặc định là
cổng ra
Để các cổng/chân làm việc ở chế độ cổng/chân
vào phải tiến hành ghi các bit 1 ra các cổng/chân
tương ứng
• Ví dụ: MOV P1,#0FF ; Cổng 1 thành cổng vào
SETB P1.0 ; Chân P1.0 làm chân vào
MOV P1,#03 ; Chân P1.0 và P1.1 làm chân vào
; các chân còn lại làm chân ra
Hệ nhúng
119
Nguyên lý bit cổng
Sơ đồ nguyên lý của một bit cổng
Hệ nhúng
120
Nguyên lý bit cổng
Đọc dữ liệu:
• Đọc tín hiệu từ chân IO:
Read Pin =0: Đệm 3 trạng
thái thông, tín hiệu từ IO pin
được truyền tới Data bus
Hệ nhúng
121
Nguyên lý bit cổng
Ghi dữ liệu: ?
Write=1:Q=Data(i).
• Data(i)=0:
/Q=1
Gate=1
Rds nhỏ, IO pin =0
• Data(i)=1:
/Q=0
Gate=0
Rds >>, IO pin =1
Hệ nhúng
122
Lập trình xuất dữ liệu ra cổng/chân
Xuất dữ liệu ra cổng ra
MOV tên_cổng, giá trị
• Ví dụ:
MOV P1, #55h
Xuất dữ liệu ra từng chân
• Đưa chân lên mức cao:
SETB bit
Ví dụ: SETB P1.0
• Đưa chân xuống mức thấp:
CLR bit
Ví dụ: CLR P1.0
Hệ nhúng
123
Ví dụ
MOV P0,#30h
Hệ nhúng
124
Lập trình đọc dữ liệu từ cổng vào
Bước 1: Thiết lập cổng làm việc ở chế độ cổng
vào
Bước 2: Đọc dữ liệu trên cổng
Ví dụ:
MOV P1, #0FFh
MOV A, P1 ; Đọc giá trị tại
; cổng P1, lưu vào A
MOV P2, A ; Xuất ra cổng P2
Hệ nhúng
125
Ví dụ
MOV P3,#0FFh
MOV A,P3
MOV P0,A
MOV P2,A
Hệ nhúng
Lập trình C cho VĐK 8051
Lập trình cổng vào,ra
Lập trình hiển thị led 7 thanh
Lập trình xử lý ngắt
Lập trình bộ đếm và định thời (Timer/Counter)
Lập trình ghép nối bàn phím
Lập trình điều khiển LCD
Lập trình bảng quang báo
126
Hệ nhúng
127
Lập trình C cho 8051
Tuân thủ các cú pháp của ngôn ngữ lập trình C chuẩn
ANSI C
Hỗ trợ thêm một số kiểu dữ liệu/từ khóa mới
• sfr: định nghĩa một thanh ghi đặc biệt (Special Function
Register)
VD: sfr P1=0x90; //Từ đây có thể truy xuất cổng P1
//ở địa chỉ 0x90 thông qua biến P1
• sbit: định nghĩa từng bit trong thanh ghi đặc biệt
VD: sbit Led_pin=P1^1; //Từ đây có thể truy xuất chân 1 của
//cổng P1 thông qua biến Led_pin
• bit: kiểu dữ liệu mang hai giá trị 0 hoặc 1
Ví dụ: xem file AT89X51.h
Tham khảo:
Hệ nhúng
128
Chương trình Hello World
(Nhấp nháy led chân P1_0)
#include
void delay(int interval){
int i,j;
for(i=0;i<255;i++){
for(j=0;j<interval;j++);
}
}
void main(){
while(1){
P1_0=1;
delay(100); //Tre mot khoang thoi gian
P1_0=0;
delay(100); //Tre mot khoang thoi gian
}
}
Hệ nhúng
129
Lập trình cổng vào,ra
Lập trình xuất dữ liệu ra cổng hoặc chân ra
• Ghi dữ liệu ra cổng: Tên cổng=dữ liệu
VD: P1=0xff;
• Ghi dữ liệu ra chân: Tên chân ra=bit (0/1)
VD: P1_0=1;
Lập trình đọc dữ liệu từ cổng hoặc chân vào
• Thiết lập chân hoặc cổng vào(ghi ra các bit 1)
• Đọc dữ liệu từ cổng: Tên biến=Tên cổng
VD: unsigned char value;
P1=0xff; //Chuyển cổng sang chế độ cổng vào
value=P1; //Đọc dữ liệu từ cổng P1
• Đọc dữ liệu từ chân: Tên biến=Tên chân
VD: bit value;
P1_0=1; //Chuyển chân P1_0 thành chân vào
value=P1_0; //Đọc dữ liệu từ chân P1_0
Hệ nhúng
130
Ví dụ
Ví dụ 1: Xuất dữ liệu ra cổng ra
• Xuất dữ liệu điều khiển 8 led trên cổng P0 nhấp
nháy so le.
Ví dụ 2: Đọc dữ liệu từ chân vào
• Thêm một nút bấm vào chân P1_0, nếu nút bấm
ở trạng thái mở, 8 led trên cổng P0 sáng nhấp
nháy so le, nếu nút bấm được nhấn thì 8 led dữ
nguyên trạng thái.
Hệ nhúng
131
Ví dụ 1: xuất dữ liệu ra cổng
Hệ nhúng
132
xuất dữ liệu ra cổng
#include
void delay(int interval){
int i,j;
for(i=0;i<255;i++){
for(j=0;j<interval;j++);
}
}
void main(){
while(1){
P0=0x55;
delay(100);
P0=0xAA;
delay(100);
}
}
Hệ nhúng
133
Ví dụ 2: đọc dữ liệu từ chân vào
Hệ nhúng
134
đọc dữ liệu từ chân vào
#include
void delay(int interval){
int i,j;
for(i=0;i<255;i++){
for(j=0;j<interval;j++);
}
}
void main(){
while(1){
//Kiem tra trang thai chan P1_0 (dau voi cong tac)
if(P1_0 == 1){
P0=0x55;
delay(100);
P0=0xAA;
delay(100);
}
}
}
Hệ nhúng
135
Hiện tượng nảy phím (key bounce)
Khi sử dụng các phím bấm cơ khí sẽ có hiện
tượng này phím, đó là hiện tượng tín hiệu thay
đổi mức liên tục trong một khoảng thời gian ngắn
trước khi chuyển sang trạng thái ổn định.
Lý tưởng
Thực tế
Hệ nhúng
136
Hiện tượng nảy phím (key bounce)
Hậu quả của này phím
• Thay vì đọc một ký tự A từ bàn phím thì đọc
thành nhiều ký tự A: AAAAAA
• Đếm số lần bấm phím sẽ không còn chính xác
• Giữa thời điểm nhấn phím và nhả phím sẽ xuất
hiện nhiều lần “giả” bấm và nhả phím
Chống nảy phím
Hệ nhúng
137
Chống nảy phím
Chống nảy phím bằng phần mềm
• Thêm một khoảng trễ (tùy thuộc vào từng loại nút
bấm, thông thường khoảng 20ms) sau khi nhận
sự kiện nhấn phím đầu tiên -> bỏ qua thời gian
nảy phím
Chống nảy phím bằng phần cứng
• Đấu thêm tụ điện song song với công tắc
• Sử dụng trigger smith
Hệ nhúng
138
Chống nảy phím bằng phần mềm
void main(){
int count=0;
P1_0=1; //Chan P1_0 lam chan vao
while(1){
if(P1_0==0){
count++;
}
delay(10); //Tạo trễ chống nảy phím
}
}
Hệ nhúng
139
Lập trình hiển thị led 7 thanh
Nguyên tắc hoạt động của led 7 thanh
• Led đơn
Hệ nhúng
140
Led 7 thanh
Cấu thành từ các led đơn
Phân loại:
• Anode chung
• Cathode chung
Hệ nhúng
141
Phân loại led 7 thanh
Hệ nhúng
142
Ví dụ
Liên tục hiển thị lần lượt các số 0,1,2
Hệ nhúng
143
Ví dụ
#include
void delay(int interval){
int i,j;
for(i=0;i<255;i++){
for(j=0;j<interval;j++);
}
}
void main(){
while(1){
P0=0x40; //Hien thi so 0
delay(100);
P0=0x79; //Hien thi so 1
delay(100);
P0=0x24; //Hien thi so 2
delay(100);
}
}
Hệ nhúng
144
Phương pháp ngắt và thăm dò
Phương pháp thăm dò: bộ vi điều khiển liên tục
kiểm tra yêu cầu của các thiết bị để phục vụ.
Quá trình phục vụ diễn ra tuần tự nếu có nhiều
thiết bị cùng yêu cầu
Phương pháp ngắt: mỗi khi thiết bị yêu cầu phục
vụ, thiết bị gửi tín hiệu yêu cầu tới chân ngắt của
vi điều khiển. Vi điều khiển sẽ xử lý yêu cầu ngắt
đó. Chương trình xử lý ngắt gọi là trình phục vụ
ngắt (ISR-Interrupt Service Routine)
Hệ nhúng
145
Trình phục vụ ngắt
Mỗi ngắt luôn có một trình phục vụ ngắt
Khi một ngắt được kích hoạt thì vi điều khiển
thực thi trình phục vụ ngắt
Trình phục vụ ngắt của mỗi ngắt có một vị trí cố
định trong bộ nhớ
Tập hợp các ô nhớ lưu giữ địa chỉ của tất cả các
trình phục vụ ngắt gọi là bảng vector ngắt
(Interrupt Table)
Hệ nhúng
146
Chu trình xử lý ngắt
Được thêm vào cuối chu trình lệnh
Sau khi hoàn thành một lệnh, CPU kiểm tra xem có yêu
cầu ngắt gửi đến hay không
• Nếu không có tín hiệu yêu cầu ngắt thì CPU nhận lệnh kế
tiếp
• Nếu có yêu cầu ngắt và ngắt đó được chấp nhận thì:
CPU cất ngữ cảnh hiện tại của chương trình đang thực hiện
(các thông tin liên quan đến chương trình bị ngắt)
CPU chuyển sang thực hiện chương trình con phục vụ ngắt
tương ứng
Kết thúc chương trình con đó, CPU khôi phục lại ngữ cảnh
và trở về tiếp tục thực hiện chương trình đang tạm dừng
Hệ nhúng
147
Trình tự phục vụ ngắt của 8051
1. Kết thúc lệnh hiện tại, lưu địa chỉ của lệnh kế
tiếp (PC) vào ngăn xếp
2. Nhảy đến vị trí cố định trong bảng vector ngắt
3. Nhận địa chỉ của trình phục vụ ngắt, nhảy tới
địa chỉ đó và bắt đầu thực thi chương trình con
phục vụ ngắt cho đến lệnh cuối cùng là lệnh
RETI
4. Kết thúc chương trình con phục vụ ngắt, bộ vi
điều khiển trở về thực thi tiếp lệnh nơi nó đã bị
ngắt
Hệ nhúng
148
Hoạt động ngắt (tiếp)
Hệ nhúng
149
Xử lý với nhiều tín hiệu yêu cầu ngắt
Xử lý ngắt tuần tự:
• Khi một ngắt đang được thực hiện, các ngắt khác
sẽ bị cấm
• Bộ xử lý sẽ bỏ qua các ngắt tiếp theo trong khi
đang xử lý một ngắt
• Các ngắt vẫn đang đợi và được kiểm tra sau khi
ngắt đầu tiên được xử lý xong
• Các ngắt được thực hiện tuần tự
Hệ nhúng
150
Xử lý ngắt tuần tự (tiếp)
Hệ nhúng
151
Xử lý với nhiều tín hiệu yêu cầu ngắt
Xử lý ngắt ưu tiên:
• Các ngắt được định nghĩa mức ưu tiên khác nhau
• Ngắt có mức ưu tiên thấp hơn có thể bị ngắt bởi
ngắt ưu tiên cao hơn ngắt xảy ra lồng nhau
Hệ nhúng
152
Xử lý ngắt ưu tiên
Hệ nhúng
153
Các ngắt của 8051
8051 có 6 nguồn ngắt
• Ngắt RESET
• 2 ngắt cho bộ đếm và định thời
• 2 ngắt ngoài (INT0, INT1)
• 1 ngắt cho bộ truyền thông nối tiếp UART
Hệ nhúng
154
Bảng vector ngắt
Bảng vector ngắt của 8051
Hệ nhúng
155
Lập trình xử lý ngắt
Dưới góc nhìn của ngôn ngữ C
• Chương trình con xử lý ngắt cũng là một chương
trình con.
• Điểm khác biệt: chương trình con xử lý
ngắt được gọi bởi bộ vi điều khiển.
Hệ nhúng
156
Khung chương trình con xử lý ngắt
void Tên_chương_trình_con() interrupt Số_hiệu
• Tên chương trình con ngắt: do người lập trình đặt, tuân
thủ các quy tắc giống như chương trình con thông thường
• Số hiệu ngắt: số hiệu vector ngắt (Xem trong file
at89x51.h)
#define IE0_VECTOR 0 /* External Interrupt 0 */
#define TF0_VECTOR 1 /* Timer 0 */
#define IE1_VECTOR 2 /* External Interrupt 1 */
#define TF1_VECTOR 3 /* Timer 1 */
#define SIO_VECTOR 4 /* Serial port */
Hệ nhúng
157
Các nguồn ngắt
Ngắt phần cứng ngoài (0 và 1)
• Tín hiệu yêu cầu ngắt được gửi đến chân INT0
(P3_2) và chân INT1 (P3_3)
• 8051 có thể nhận ngắt theo 2 kiểu
Ngắt theo mức thấp: ngắt được kích hoạt khi có tín
hiệu mức thấp đưa đến chân ngắt (Đây là chế độ
mặc định)
Ngắt theo sườn âm: ngắt được kích hoạt khi có
sườn âm (chuyển từ mức cao xuống mức thấp)
đưa đến chân ngắt
• Thiết lập chế độ kích hoạt ngắt qua thanh ghi
TCON (bit IT0 cho INT0 và IT1 cho INT1)
Hệ nhúng
158
Thanh ghi TCON
Hệ nhúng
159
Lập trình xử lý ngắt ngoài
Bước 1: Thiết lập thanh ghi IE để cho phép ngắt
ngoài
Bước 2: Chọn chế độ ngắt (theo sườn hay theo
mức): thiết lập bit IT0 và IT1 cho thanh ghi
TCON
• Bit IT0 cho ngắt ngoài 0 và IT1 cho ngắt ngoài 1
• ITx=0-> ngắt theo mức, ITx=1->ngắt theo sườn
Bước 3: Viết chương trình con xử lý ngắt
Hệ nhúng
160
Ví dụ 1
Viết chương trình xử lý ngắt ngoài 0 theo chế độ
ngắt theo mức
void IEX0_Process() interrupt 0 {
//Chương trình
}
void main(){
IE=0x81; //Cho phép ngắt ngoài 0
IT0=0; //Chế độ ngắt theo mức
while(1){
//Chương trình
}
}
Hệ nhúng
161
Ví dụ 2
Viết chương trình xử lý ngắt ngoài 1 theo chế độ
ngắt theo sườn
void IEX0_Process() interrupt 2 {
//Chương trình
}
void main(){
IE=0x84; //Cho phép ngắt ngoài 1
IT1=1; //Chế độ ngắt theo sườn
while(1){
//Chương trình
}
}
Hệ nhúng
162
Demo
Hệ nhúng
163
Lập trình bộ đếm/định thời
8051 có hai bộ đếm và định thời
• Timer/Counter 1 và Timer/Counter 0
Ứng dụng
• Bộ định thời (Timer): tạo độ trễ thời gian chính
xác
• Bộ đếm (Counter): đếm xung
Hệ nhúng
164
Cấu tạo và nguyên tắc hoạt động
Cả hai bộ định thời đều có độ dài 16 bit, được
chia thành hai thanh ghi 8 bit
Bộ định thời 0:
• Thanh ghi TH0: 8 bit cao
• Thanh ghi TL0: 8 bit thấp
Bộ định thời 1:
• Thanh ghi TH1: 8 bit cao
• Thanh ghi TL1: 8 bit thấp
Hệ nhúng
165
Cấu tạo và nguyên tắc hoạt động
Hoạt động ở chế độ bộ định thời (xét chế độ bộ
định thời 16 bit)
• Giá trị trong thanh ghi bộ định thời tự động tăng
lên 1 sau 12 chu kỳ dao động
• Sau khi đạt giá trị tối đa (65535), cờ TF0/TF1 báo
tràn bộ định thời sẽ được phát sinh
• VD: chu kỳ dao động đồng hồ là 12MHz -> cứ mỗi
us giá trị thanh ghi bộ định thời sẽ tăng lên 1->
chúng ta có thể tính toán để đưa ra thời gian
trễ chính xác
Hệ nhúng
166
Các bước lập trình bộ định thời
Tính toán giá trị ban đầu cho thanh ghi bộ định
thời
Nạp giá trị này vào thanh ghi bộ định thời
Khởi động bộ định thời
Thanh ghi bộ định thời sẽ tự động tăng cho đến
giá trị tối đa và thiết lập cờ TF báo tràn.
Hệ nhúng
167
Các thanh ghi điều khiển Timer/Counter
Thanh ghi TCON
• TR1/TR0: bit khởi động/tắt bộ đếm/định thoài
• TF1/TF0: cờ báo tràn bộ đếm/định thời
• IE1, IT1, IE0, IT0: liên quan tới ngắt phần cứng
ngoài
Hệ nhúng
168
Các thanh ghi điều khiển Timer/Counter
Thanh ghi TMOD
• Gate: sử dụng cho bộ đếm
• C/T: chọn chế độ (bộ đếm hay bộ định thời)
C/T=0: bộ định thời
C/T=1: bộ đếm
• M1,M0: chọn chế độ làm việc. Có hai chế độ thông dụng
M1=0, M0=1: chế độ 1, bộ Timer/Counter 16 bit
M1=1, M0=0: chế độ 2, bộ Timer/Counter 8 bit tự động nạp
lại
Hệ nhúng
169
Ví dụ: tạo trễ 50ms (với tần số 12MHz)
Bước 1: tính toán giá trị ban đầu cho thanh ghi
bộ định thời:
• 65535 – 50000 + 1=15536 (0x3CB0)
Bước 2: nạp giá trị vào thanh ghi bộ định thời
• Với Timer 0: TH0=0x3C, TL0=0xB0
• Với Timer 1: TH1=0x3C, TL1=0xB0
Bước 3: Khởi động bộ định thời
• Với Timer 0: TR0=1
• Với Timer 1: TR1=1
Bước 4: Chờ cờ tràn được thiết lập (TF0=1 hoặc
TF1=1)
Hệ nhúng
170
Lập trình ghép nối bàn phím
Cấu trúc bàn phím ma trận
Hệ nhúng
171
Hoạt động của ma trận phím
Tín hiệu mức thấp được đưa tới tất cả các hàng
Bình thường, tín hiệu tại các cột là mức cao
Khi có nút được bấm trên cột nào thì tín hiệu đọc
tại cột đó sẽ ở mức thấp
Để xác định được chính xác nút ở hàng nào, cột
nào được bấm thì phải thực hiện thủ tục quét
phím
• Mỗi thời điểm chỉ đưa tín hiệu mức thấp tới 1
hàng, các hàng còn lại đưa tín hiệu mức cao
• Kiểm tra tín hiệu tại các cột
Hệ nhúng
172
Demo
Hệ nhúng
173
Ghép nối vi điều khiển với ma trận phím
Khi có phím bấm, có tín hiệu yêu cầu ngắt gửi tới chân
ngắt ngoài 0
Hệ nhúng
174
Lập trình điều khiển LCD
LCD LM016L
• 2 hàng, 16 cột
Hệ nhúng
175
Sơ đồ khối
Hệ nhúng
176
Sơ đồ chân
Hệ nhúng
177
Các bước lập trình điều khiển LCD
Bước 1: Thiết lập cấu hình làm việc cho LCD
• Sử dụng phương thức ghi (0-> R/W)
• Thao tác thanh ghi lệnh (0-> RS)
Bước 2: Gửi dữ liệu hiển thị trên LCD
• Chọn vị trí hiển thị (nếu cần)
• Sử dụng phương thức ghi (0-> RW)
• Thao tác thanh ghi dữ liệu (1-> RS)
• Dữ liệu gửi tới LCD là mã ASCII của ký tự cần
hiển thị
• Gửi đến chân E 1 xung cao xuống thấp để chốt
dữ liệu
Hệ nhúng
178
Tập lệnh điều khiển LCD
Hệ nhúng
179
Hàm gửi lệnh điều khiển tới LCD
void LCD_Send_Command(unsigned char x)
{
LCD_DATA=x;
RS=0; //Chon thanh ghi lenh
RW=0; //De ghi du lieu
EN=1;
Delay_ms(1);
EN=0;
Wait_For_LCD(); //Doi cho LCD san sang
EN=1;
}
Hệ nhúng
180
Hàm gửi 1 ký tự tới LCD
void LCD_Write_One_Char(unsigned char c)
{
LCD_DATA=c; //Dua du lieu vao thanh ghi
RS=1; //Chon thanh ghi du lieu
RW=0;
EN=1;
Delay_ms(1);
EN=0;
Wait_For_LCD();
EN=1;
}
Hệ nhúng
181
Hàm khởi tạo LCD
void LCD_init()
{
//Chon che do 5x7 bit, 2 hang cho LCD
LCD_Send_Command(0x38);
//Bat hien thi, nhap nhay con tro
LCD_Send_Command(0x0E);
LCD_Send_Command(0x01); //Xoa man hinh
LCD_Send_Command(0x80); //Ve dau dong
}
Hệ nhúng
182
Ví dụ
Hệ nhúng
183
Lập trình bảng quang báo
Ví dụ bảng quang báo: bảng quảng cáo, thông
báo
Hệ nhúng
184
Nguyên tắc hoạt động của bảng quang báo
Bảng quang báo hoạt động dựa trên hiện tượng
lưu ảnh trên mắt người
Các hàng/cột của bảng quang báo được quét với
tốc độ rất nhanh và do hiện tượng lưu ảnh mà
mắt người không cảm nhận được sự thay đổi
Hệ nhúng
185
Linh kiện làm bảng quang báo
Bảng quang báo kích thước nhỏ: một hoặc một
vài module led 8x8
Hệ nhúng
186
Linh kiện làm bảng quang báo
Bảng quang báo kích thước lớn: hàng chục/hàng
trăm module led được ghép nối với nhau
Mỗi một cụm module led sẽ có vi điều khiển
Các vi điều khiển tại các cụm sẽ được kết nối với
nhau theo các chuẩn truyền tin
• RS485
• CAN
• I2C
•
Hệ nhúng
187
Cấu tạo module led
Mỗi module led sẽ bao gồm các chân điều khiển
hàng và điều khiển cột
VD: module led 8x8 có 8 chân điều khiển hàng
và 8 chân điều khiển cột
Hệ nhúng
188
Các bước làm ứng dụng quang báo
Tạo font chữ mong muốn
Thiết kế mạch ghép nối các module led với nhau
và với vi điều khiển
Thực hiện thuật toán quét led phù hợp
Hệ nhúng
189
Ví dụ
Để hiển thị chữ A trên
module led 8x8
• Bước 1: Tạo font chữ
(thường có kích thước
5x8 – chiều rộng 5 pixel
và cao 8 pixel)
0 0 1 0 0 0 0 0
0 1 0 1 0 0 0 0
1 0 0 0 1 0 0 0
1 0 0 0 1 0 0 0
1 1 1 1 1 0 0 0
1 0 0 0 1 0 0 0
1 0 0 0 1 0 0 0
1 0 0 0 1 0 0 0
Hệ nhúng
190
Font chữ B
Hệ nhúng
191
Font chữ C
Hệ nhúng
192
Font chữ D
Hệ nhúng
193
Font chữ E
Hệ nhúng
194
Font số 0
Hệ nhúng
195
Font số 1
Hệ nhúng
196
Font số 2
Hệ nhúng
197
Font số 3
Hệ nhúng
198
Font số 4
Hệ nhúng
3.2. Vi điều khiển họ ARM
Kiến trúc tổng quan lõi vi xử lý ARM
Kiến trúc vi điều khiển lõi ARM920T (S3C2440)
Lập trình ứng dụng trên hệ điều hành Linux
nhúng
199
Hệ nhúng
Kiến trúc tổng quan lõi vi xử lý ARM
ARM là dòng vi xử lý 32 bit được thiết kế theo
kiến trúc tập lệnh RISC (Reduced Instruction Set
Computer)
ARM viết tắt của
• Advanced RISC Machine
• Acorn RISC Machine
ARM là kiến trúc được sử dụng rộng rãi trong
các hệ thống nhúng: Mobile phones, PDAs, thiết
bị điện tử gia dụng
200
Hệ nhúng
Kiến trúc tổng quan vi xử lý lõi ARM
Kế thừa các đặc điểm của kiến trúc tập lệnh
RISC
• Số lượng thanh ghi lớn và có kích thước giống nhau
• Tập lệnh load/store, không cho phép các thao tác xử lý dữ
liệu trực tiếp trên bộ nhớ
• Chế độ địa chỉ đơn giản (ít chế độ địa chỉ hơn kiến trúc
CISC)
Phát triển các đặc trưng mới của ARM
• Các lệnh có kết hợp với lệnh dịch hoặc các lệnh logic
• Chế độ địa chỉ tự động tăng-giảm để tối ưu hóa các vòng
lặp
• Nạp và lưu (load/store) nhiều lệnh cùng lúc cho phép
nâng cao thông lượng
201
Hệ nhúng
Kiến trúc tổng quan lõi vi xử lý ARM
202
Kiến trúc các dòng ARM
Hệ nhúng
203
Thumb Instruction Set: tập lệnh 16 bit cho phép
tăng mật độ lệnh
Jazelle: công nghệ cho phép tăng tốc các ứng
dụng viết bằng Java
SIMD, NEON: công nghệ nâng cao hiệu năng
cho các ứng dụng Video/Audio
TrustZone: công nghệ nâng cao tính bảo mật
Công nghệ đặc trưng
Hệ nhúng
So sánh hiệu năng các dòng ARM
204
Phân nhóm theo hiệu năng và tính hữu dụng
Hệ nhúng
Kiến trúc tổng quan vi xử lý lõi ARM
ARM được rất nhiều hãng phát triển và sản xuất,
ở Việt Nam phổ biến chip ARM của các hãng
• ATMEL: AT91SAM7, AT91SAM9
• NXP: LPC2138, LPC2148, LPC2300
• TI (Texas Instrument): TMS470, TMS570
• SAMSUNG: S3C2440
•
205
Hệ nhúng
Kiến trúc vi điều khiển S3C2440
Đặc điểm của chip S3C2440
• Core:
ARM920T core , 16 Kbytes Data Cache, 16 Kbytes
Instruction cache
Xung nhịp tối đa: 400 MHz
• Memories
Giao diện bus AMBA (Advanced Micro controller
Bus Architecture)
4 KByte SRAM nội
206
Hệ nhúng
Lõi vi xử lý ARM920T
207
Hệ nhúng
Kiến trúc vi điều khiển S3C2440
Đặc điểm của chip S3C2440 (tiếp)
• Ngoại vi (Peripherals)
USB Host/Device
10/100 Mbps Ethernet MAC Controller
SPI, I2C
32 bit Timer/Counter
3 USARTs
Multimedia Card Interface
ADC 10 bit 8 kênh
Giao tiếp cảm biến ảnh (Image Sensor)
Điều khiển LCD
Điều khiển AC97 audio codec
208
Hệ nhúng
Kiến trúc vi điều khiển S3C2440
Đặc điểm của chip S3C2440(tiếp)
• Hệ thống
4 kênh DMA (Direct Memory Access)
Boot hệ thống từ NOR Flash, NAND Flash,
SDCard, Ethernet
Bộ điều khiển ngắt nâng cao AIC(Advanced
Interrupt Controller)
• Vào ra
130 chân vào ra lập trình được
209
Hệ nhúng
210
Hệ nhúng
Tập thanh ghi và chế độ hoạt động
211
R0->R12: thanh ghi
công dụng chung
R13: Stack Pointer
R14: Link Register
R15: Program Counter
CPSR: Current
Program Status
Register
SPSR_SVC: Saved
Program Status
Register
Hệ nhúng
Thanh ghi trạng thái chương trình
212
Các cờ kết quả hoạt động của ALU
Điều khiển cho phép/cấm ngắt
Thiết lập chế độ hoạt động
Hệ nhúng
Mode bits
213
Hệ nhúng
214
Tập lệnh của S3C2440
Tập lệnh ARM chia thành các nhóm lệnh
• Lệnh rẽ nhánh (Branch)
• Lệnh xử lý dữ liệu (Data Processing)
• Trao đổi thanh ghi trạng thái (Status Register
Transfer)
• Nạp và lưu (Load and Store)
• Phát sinh ngoại lệ (Exception-Generating)
Hệ nhúng
215
Bản đồ bộ nhớ
Bus địa chỉ 32 bit
• Địa chỉ bắt đầu: 0x00000000
• Địa chỉ kết thúc: 0x40000000
• Chia thành nhiều bank nhớ, mỗi bank 128 MB, tổng không
gian bộ nhớ 1GB
6 bank nhớ cho ROM, SRAM
2 bank nhớ cho ROM, SRAM, SDRAM, .
Hỗ trợ cả hai kiểu lưu trữ: little endian, big endian
Hệ nhúng
216
Hệ nhúng
Bản đồ bộ nhớ
Hỗ trợ hai chế độ khởi động chính
Với chế độ khởi động từ Nand Flash, 4 Kbytes
BootSram được ánh xạ vào vùng nhớ chọn bởi
nGCS0.
Với chế độ khởi động từ Nor Flash, Nor Flash
được ánh xạ vào vùng nhớ chọn bởi nGCS0.
Vùng nhớ cho SDRAM bắt đầu tại địa chỉ
0x30000000 và kết thúc ở địa chỉ 0x34000000.
217
Hệ nhúng
Giới thiệu KIT nhúng mini2440
218
Hệ nhúng
Giới thiệu KIT nhúng mini2440
219
Hệ nhúng
Giới thiệu KIT nhúng mini2440
Thông số kỹ thuật
220
Hệ nhúng
Giới thiệu KIT nhúng mini2440
221
Hệ nhúng
Môi trường phát triển ứng dụng
Phần mềm
• Hệ điều hành Linux
• Cross toolchains (gcc 4.3.2)
• TFTP (client/server)
• USB push
222
Hệ nhúng
Môi trường phát triển ứng dụng
223Môi trường phát triển ứng dụng theo nhóm
Hệ nhúng
Quy trình phát triển ứng dụng
Chạy ứng dụng ở chế độ Stand-alone
• Biên dịch chương trình
• Nạp chương trình lên SDRAM và chạy trực tiếp (sử dụng
SuperVivi, USB push)
Chạy ứng dụng trên nền hệ điều hành
• Biên dịch chương trình
• Chạy chương trình trên nền hệ điều hành Linux nhúng
Trên KIT cài TFTP client
Trên máy phát triển, cài TFTP server
Trên KIT dùng lệnh TFTP để download chương trình
224
Hệ nhúng
225
Demo
Hệ nhúng
226
Thảo luận
Hệ nhúng
Lập trình ứng dụng trên Linux
Cài đặt môi trường phát triển
Xây dựng chương trình HelloWorld
Lập trình vào ra căn bản
Lập trình xử lý ngắt
Lập trình giao tiếp cổng COM
Lập trình ứng dụng đồ họa
227
Hệ nhúng
Cài đặt môi trường phát triển
Môi trường phát triển
• Hệ điều hành Linux (Ubuntu 9.04)
• Trình biên dịch chéo: ARM Linux GCC 4.3.2
Phần mềm hỗ trợ
• TFTP Server client/server
• GFTP Server
Cấu hình mạng sử dụng
• Linux host: 192.168.1.30
• Linux target: 192.168.1.230
228
Hệ nhúng
Xây dựng chương trình Hello World
Bước 1: viết code chương trình
Bước 2: dịch chương trình
-Cách 1: dùng lệnh make
-Cách 2: dùng lệnh tường minh
arm-linux-gcc –o OutputFile Source.c
Bước 3: dùng tftp download chương trình xuống
dưới KIT
tftp –l localfile –r remotefile –g ServerIP
Bước 4: chạy chương trình trên KIT
229
Hệ nhúng
Lập trình giao tiếp cổng COM
Khởi tạo: Khai báo thư viện
Bước 1: Mở cổng
Bước 2: Thiết lập tham số
Bước 3: Đọc, ghi cổng
Bước 4: Đóng cổng
230
Hệ nhúng
Khai báo thư viện
#include
#include
#include
#include // UNIX standard function
#include // File control definitions
#include // Error number definitions
#include // POSIX terminal control
#include // time calls
231
Hệ nhúng
Bước 1: Mở cổng
Sử dụng lệnh mở file
int fd = open ("/dev/ttyUSB0", O_RDWR);
Fd >0 nếu mở file thành công
Fd<0 nếu mở file thất bại
232
Hệ nhúng
Bước 2: Thiết lập tham số
Sử dụng cấu trúc termios
struct termios port_settings;
Thiết lập tham số (9600, 8, n, 1)
cfsetispeed(&port_settings, B9600);
cfsetospeed(&port_settings, B9600);
port_settings.c_cflag &= ~PARENB;
port_settings.c_cflag &= ~CSTOPB;
port_settings.c_cflag &= ~CSIZE;
port_settings.c_cflag |= CS8;
tcsetattr(fd, TCSANOW, &port_settings);
233
Hệ nhúng
Bước 3: Đọc, ghi cổng
Đọc cổng: sử dụng lệnh đọc file
n=read(fd,&result,sizeof(result));
N: số ký tự đọc được
Result: chứa kết quả
Ghi cổng: sử dụng lệnh ghi file
n=write(fd,“Hello World\r",12);
N:số ký tự đã ghi
Fd: file id (có được từ thao tác mở file thành
công)
234
Hệ nhúng
Bước 4: Đóng cổng
Đóng cổng: sử dụng lệnh đóng file
close (fd);
Fd: file ID (có được từ thao tác mở file thành công)
235
Hệ nhúng
Lập trình ứng dụng đồ họa
Sử dụng nền tảng QT của Nokia
• Ứng dụng đa nền: Desktop, mobile, embedded
computer
• Viết code 1 lần duy nhất, chạy trên nhiều nền
tảng khác nhau
• Sử dụng ngôn ngữ C/C++
• Hỗ trợ các nền tảng: Windows, Linux, Embedded
Linux, Win CE, Symbian, Maemo
• Có thể tích hợp với các IDE thông dụng: Visual
Studio, Eclipse
• Tham khảo: qt.nokia.com; qtcentre.org 236
Hệ nhúng
Ứng dụng QT
237
Hệ nhúng
Kiến trúc QT SDK
238
Hệ nhúng
Cơ chế Signals and Slot của QT
Signals: tương tự Event
Slot: tương tự Event Handler
connect(sender, SIGNAL(signal), receiver, SLOT(slot));
VD: đồng bộ hai điều khiển trên QT
239
Hệ nhúng
Môi trường phát triển
IDE
1) QT Creator
2) Tích hợp vào Visual Studio, Eclipse
Chương trình dịch: qmake
1) Qmake for Windows
2) Qmake for Linux
3) Qmake for Embedded Linux
240
Hệ nhúng
QT Creator
241
Hệ nhúng
242
Demo
Hệ nhúng
243
Thảo luận
Các file đính kèm theo tài liệu này:
- giao_trinh_mon_he_nhung_chuong_3_vi_dieu_khien_va_lap_trinh.pdf