Bài giảng Hệ nhúng - Chương 3: Vi điều khiển và lập trình firmware - Phạm Văn Thuận

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

pdf 163 trang phuongnguyen 6760
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Hệ nhúng - Chương 3: Vi điều khiển và lập trình firmware - Phạm Văn Thuận", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Hệ nhúng - Chương 3: Vi điều khiển và lập trình firmware - Phạm Văn Thuận

Bài giảng Hệ nhúng - Chương 3: Vi điều khiển và lập trình firmware - Phạm Văn Thuậ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 ... để 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

File đính kèm:

  • pdfbai_giang_he_nhung_chuong_3_vi_dieu_khien_va_lap_trinh_firmw.pdf