2
Đồ Án Kỹ Thuật Lập Trình
ĐỒ ÁN KỸ THUẬT LẬP TRÌNH
MỤC LỤC
Mở đầu : Mụclục, lời nói đầu, đề bài tr.1
Chương I. TỔNG QUAN VỀ ARM LPC2103. tr.2
I.1 : GIỚI THIỆU TỔNG QUAN VỀ ARM tr.
I.2 : ARM CORTEX VÀ ARMv7 tr.
I.3 : GIỚI THIỆU TỔNG QUAN VỀ ARM tr.
Chương II. CẤU TRÚC VÀ BỘ NHỚ VÀ CHỨC NĂNG PIN LPC 2103 tr.6
II.1 PINSEL0 và
PINSEL
tr.7
II.2
IOPIN
tr.8
II.3
IODIR
tr.8
II.4 IOSET/
IOCLR
tr.9
II.5 CẤU TRÚC CÁC PIN LPC2103 tr.10
II.6 CÁC CHỨC NĂNG PORT 0 tr.13
Chương III. PLL Control Register (PLL0CON & PLL1CON) tr.19
III.1 PLLCON tr.
III.2 PLL Status Register (PLL0STAT & PLL1STAT): tr.
III.3 PLL Feed Register (PLL0FEED & PLL1FEED) tr.
III.4 Pulse Width Modulator (PWM): tr.
III.5 PWM tr.
Chương IV. CHỌN PHẦN MỀM LẬP TRÌNH CHO CHÍP tr.23
Em xin chân thành cảm ơn.
Người thực hiện
NGUYỄN HỮU MINH
LÊ ANH KHOA
_____________________________________________________________________________
GVHD : Th.S Hà Ngọc Nguyên SVTH : Lê Anh Khoa
Nguyễn Hữu Minh
2
Đồ Án Kỹ Thuật Lập Trình
PHẦN I: TỔNG QUAN VỀ ARM LPC2103.
I.1 : GIỚI THIỆU TỔNG QUAN VỀ ARM
1. 1ARM = Acorn RISC Machine. Sau này, do có thêm nhiều công ty cùng phát
triển và một số lý do khác, người ta thống nhất gọi ARM=Advance RISC Machine.
1.2ARM được dùng trong Iphone của Apple (ARM Cortex A5)
1.3ARM sử dụng kiến trúc RISC:
• Kích thước 1 lệnh là cố định <32bit> với chỉ một vài định dạng
• Sử dụng kiến trúc load-store , các lệnh xử lý dữ liệu chỉ ở trong thanh ghi
( toán hạng chỉ được nằm trong thanh ghi,phải dùng lênh truy cập để load nội dung
từ bộ nhớ vào rồi mới thực hiện cộng trừ v v )
• Giải mã các lệnh logic bằng phần cứng
• Thực thi theo pipeline
1.4ARM nhanh hơn, tiết kiệm năng lượng hơn và nhỏ gọn hơn
1.5Thích thì chọn, có làm sao ko?
I.2 ARM CORTEX VÀ ARMv7
- Trước hết ARM không phải là 1 bộ vi điều khiển kiểu như 8051, AVR … Nó
chỉ là một cái lõi (core) chuyên xử lý dữ liệu, và kiến trúc của lõi này được công ty
ARM thiết kế, bán cho các hãng khác theo dạng cấp phép sở hữu trí tuệ (Intellectual
Property), các hãng sản xuất khác sẽ lắp thêm các thành phần ngoại vi vào cái core
này để tạo ra 1 sản phẩm hoàn thiện. Để đơn giản , các bạn hãy tưởng tượng core
ARM chính là cái chíp core-i5, core-i7 thậm chí là core-9. Các công ty sẽ làm
từ bộ nhớ vào thanh ghi.<load-store>
+ Chỉ lệnh điều khiển dòng lệnh: Bình thường, ta thực thi các chỉ lệnh chứa
trong một vùng nhớ liên tiếp, chỉ lệnh điều khiển dòng lệnh cho phép chuyển sang
các địa chỉ khác nhau khi thực thi lệnh, tới những nhánh cố định, <lệnh rẽ nhánh>
hoặc là lưu và trở lại địa chỉ để phục hồi chuỗi lệnh ban đầu <chỉ lệnh rẽ nhánh và
kết nối> hay là đè lên vùng code của hệ thống <gọi giám sát-ngắt phần mềm>.
Một số đặc điểm riêng biệt của tập lệnh :
_____________________________________________________________________________
GVHD : Th.S Hà Ngọc Nguyên SVTH : Lê Anh Khoa
Nguyễn Hữu Minh
2
Đồ Án Kỹ Thuật Lập Trình
+ Để tăng tính mềm dẻo và giảm kích thước chương trình, ARM đưa ra một
loại lệnh gọi là THUMB chỉ có 16 bit. Với lệnh 16bit này tốc độ thực thi của
chương trình sẽ giảm tuy nhiên bộ nhớ lưu trữ của chương trình sẽ tiết kiệm hơn.
Theo như datasheet của LPC2148 thì :
+ Mọi câu lệnh trong ARM đều có thể viết thành “câu lệnh có điều kiện” ví
dụ: EQMOV R1, #0x02FE0302 ; có nghĩa là move giá trị #0x02FE0302 vào R1
nếu kết quả của câu lệnh trước = R1 và sẽ set cờ Z lên 1(EQ được thêm vào trước
MOV và người ta gọi thể loại bựa nhân này là Suffix, có thể tra datasheet cái bảng
Suffix này) . Điều này làm cho một số câu lệnh rẽ nhánh được thực hiện rất nhanh.
Phần II : CẤU TRÚC VÀ BỘ NHỚ VÀ CHỨC NĂNG PIN
LPC 2103
Các tính năng được hỗ trợ trong
LPC2103
_____________________________________________________________________________
GVHD : Th.S Hà Ngọc Nguyên SVTH : Lê Anh Khoa
Nguyễn Hữu Minh
2
Đồ Án Kỹ Thuật Lập Trình
vector ngắt có thể lập trình địa chỉ “Vectored IRQ”, các ngắt còn
lại
“Non-
Vectored IRQ” bạn có thể định danh nguồn gây ra ngắt sau khi
vào
chế độ
ngắt.
- 32 chân ngõ xuất nhập công dụng chung
5V
- 13 chân có khả năng làm chân ngắt
ngoài
- Có bộ nhân tầng giúp VĐK hoặt động ở 70Mhz với tần số ngõ vào từ
1
đến
25Mhz.
- Có chế độ Idle,
Power-down.
- Thức dạy trong chế độ Power-down hoặt Idle thông qua ngắt ngoài
hoặt
định giờ trong
RTC.
- Có khả năng tắt hoặc mở từng phần các module ngoại vi giúp tối ưu
hóa
lượng
điện năng tiêu
thụ.
- Có chế độ Thump dùng tập lệnh 16bit thay vì 32bit và có khả năng
phối
hợp
cả 2 chế độ, giúp tối ưu thời gian thực hiện cũng như chi phí bộ
Bên cạnh đó thì ARM còn có một bộ chia tần số gọi là bộ VPB divider. Clock
sinh
ra
thông qua bộ chia VPB sẽ quyết định tốc độ của VPB bus và có tên là Pclk.
Bus
này
thường được dùng để giao tiếp với các thiết bị ngoại vi (nhằm tránh gây
hiện
tượng nghẽn
cổ chai do tốc độ của các thiết bị ngoại vi chậm hơn tốc độ của
VĐK). Bên
cạnh đó
còn dùng để điều khiển Timer (nếu dùng nguồn clock nội thì
cứ mỗi xung của Pclk
sẽ
tăng timer count lên 1, còn nếu dùng xung ngoài thì cứ
mỗi cạnh lên của Pclk thì VĐK
sẽ
kiểm tra tín hiệu ở ngõ Capture). Bộ VPB được
quyết định bởi thanh ghi VPBDIV.
Ví dụ,
nếu bạn cho VPBDIV = 0x00000002 thì
tức là Pclk sẽ có tần số bằng ½ tần số
của Cclk
II.1 PINSEL0 và
PINSEL1
- Đây là hai thanh ghi chọn chức năng cho chân của vi điều khiển.
Riêng
con
LPC2103 chỉ có một Port 0 duy nhất gồm 32 chân đánh dấu từ
dụng.
Các chức năng cũng nhưng thứ
tự chức năng của mỗi chân các bạn có
thể
tham khảo trong phần User manual rất
hoàn chỉnh. Ở các Tuts sau
mình
sẽ cố gắng trình bày đầy đủ các chức năng mà
bạn có được từ
một
con
LPC2103.
_____________________________________________________________________________
GVHD : Th.S Hà Ngọc Nguyên SVTH : Lê Anh Khoa
Nguyễn Hữu Minh
2
Đồ Án Kỹ Thuật Lập Trình
II.2.
IOPIN
- Đây là thanh ghi dùng để đọc trạng thái của các chân, không cần
biết
chân đó
đang là Input hay Output. Mỗi bit trong thanh ghi IOPIN
sẽ
tương ứng trạng thái
của một chân trong
P0.
- Bạn có thể ghi thẳng vào thanh ghi này các giá trị cần xuất ra cho
các
thanh ghi IOSET thì tại vị trí tương ứng chân đó sẽ có logic mức
cao.
Còn nếu bạn
ghi bit 1 vào thanh ghi IOCLR thì tại vị trí tương ứng
chân
đó sẽ có logic mức thấp
(chú ý ghi 1 vào IOCLR, ghi 0 vào sẽ không
có
tác
dụng).\
E. Các thanh ghi FastGPIO : (Khi SCS = 0x00000000 (mặc định) bạn ở chế
độ GPIO
còn
nếu SCS = 0x00000001 bạn vào chế độ FastGPIO). Thanh ghi tương
đương như
các
thanh ghi GPIO nhưng tốc độ cải thiện 3.5 lần (Giúp bạn có thể
sinh ra những tín hiệu
có
tần số cao
hơn).
- Tương tự với các thanh ghi FIODIR, FIOMASK, FIOPIN,
FIOSET,
FIOCLR.Sự khác biệt lớn nhất giữ Fast GPIO và Slow GPIO là tốc
độ
đáp ứng
chênh nhau khoảng 3.5 lần, tức là tần số bạn có khả năng sinh
ra
ở các chân có thể
cao lên gấp 3.5 lần. Và điều khác biệt thứ hai là khi
bổ sung nhằm giúp tối ưu hóa
quá trình xuất nhập, các bạn có thể
tra thêm
trong User manua
II.5 : CẤU TRÚC CÁC PIN LPC2103
2.5.1 : Sơ đồ khối của ARM LPC 2103.
_____________________________________________________________________________
GVHD : Th.S Hà Ngọc Nguyên SVTH : Lê Anh Khoa
Nguyễn Hữu Minh
2
Đồ Án Kỹ Thuật Lập Trình
2.5.2 : Thứ tự chân trên chíp trên chip LPC 2103.
_____________________________________________________________________________
GVHD : Th.S Hà Ngọc Nguyên SVTH : Lê Anh Khoa
Nguyễn Hữu Minh
2
Đồ Án Kỹ Thuật Lập Trình
2.5.3: Chức năng và nhiệm vụ của từng chân.
- Vi điều khiển LPC 2103 có 48 chân .
- Gồm 32 chân từ P0.0 tới P0.31 với chức năng I/O .
- Chân số 7,19,43 nối GND.
- Chân số 42, 17, 40 nối VCC(3,3V)
- Chân số 5 nối VCC(1,8V)
_____________________________________________________________________________
GVHD : Th.S Hà Ngọc Nguyên SVTH : Lê Anh Khoa
Nguyễn Hữu Minh
2
Đồ Án Kỹ Thuật Lập Trình
- Tổng cộng có 32 chân của Port 0 có thể được sử dụng như mục đích chung hai
chiều vừa có thể là tín hiệu đầu ra vừa có thể là tín hiệu đầu vào.Riêng Port 0.31 chỉ
+ MAT3.2 - PWM ra 2 cho Timer 3.
- P0.2 : chân 18 của LPC 2103.
+ Tổng giám mục đích đầu vào / đầu ra kỹ thuật số pin. Kết quả là cống được mở.
+ SCL0 : C0 đồng hồ đầu vào / đầu ra.
+ CAP0.0 : Bắt đầu vào cho Timer 0, kênh 0.
- P0.3 : chân 21 của LPC 2103.
+ Tổng giám mục đích đầu vào / đầu ra kỹ thuật số pin. Kết quả là cống được mở.
+ SDA0 : C0 dữ liệu đầu vào / đầu ra.
+MAT0.0 : PWM đầu ra cho 0 Timer, kênh 0
- P0.4 : chân 22 của LPC 2103.
+ Tổng giám mục đích đầu vào / đầu ra kỹ thuật số pin. Kết quả là cống được mở.
+ SCK0 : Serial đồng hồ cho SPI0. SPI đồng hồ đầu ra từ chủ hoặc đầu vào cho
thiết bị.
+ CAP0.1 : Bắt đầu vào cho Timer 0, kênh 1.
- P0.5 : chân 23 của LPC 2103.
+ Tổng giám mục đích đầu vào / đầu ra kỹ thuật số pin. Kết quả là cống được mở.
+ MISO0 : Dữ liệu đầu vào cho SPI chủ hoặc dữ liệu đầu ra từ SPI thiết bị.
+MAT0.1 :PWM đầu ra cho Timer 0, kênh 1
- P0.6 : chân 24 của LPC 2103.
+ Tổng giám mục đích đầu vào / đầu ra kỹ thuật số pin. Kết quả là cống được mở.
_____________________________________________________________________________
GVHD : Th.S Hà Ngọc Nguyên SVTH : Lê Anh Khoa
Nguyễn Hữu Minh
2
Đồ Án Kỹ Thuật Lập Trình
+ MOSI0 : Dữ liệu đầu ra từ SPI chủ hoặc dữ liệu đầu vào từ SPI thiết bị.
+ CAP0.2 - Bắt đầu vào cho Timer 0, kênh 2 .
- P0.7 : chân 28 của LPC 2103.
+ Tổng giám mục đích đầu vào / đầu ra kỹ thuật số pin. Kết quả là cống được mở.
+ SSEL0 : Thiết bị ngoài chọn SPI 0.Chọn giao diện SPI là một thiết bị bên
- P0.13 : chân 41 của LPC 2103.
+Tổng giám mục đích đầu vào / đầu ra kỹ thuật số pin.
+DTR1 : Data Terminal Ready đầu ra cho UART1.
+MAT1.1 :-PWM đầu ra cho Timer 1, kênh 1
- P0.14 : chân 44 của LPC 2103.
+Tổng giám mục đích đầu vào / đầu ra kỹ thuật số pin.
+DCD1 ; Phát hiện nhà cung cấp dữ liệu đầu vào cho UART1.
+ SCK1 : SPI đồng hồ đầu ra từ chủ hoặc đầu vào cho thiết bị .
+EINT1 : ngắt ngoài gián đoạn 1 đầu vào .
- P0.15 : chân 45 của LPC 2103.
+Tổng giám mục đích đầu vào / đầu ra kỹ thuật số pin.
+RI1: Ring Chỉ số đầu vào cho UART1.
+EINT2 : ngắt ngoài gián đoạn 2 đầu vào.
- P0.16 : chân 46 của LPC 2103.
+Tổng giám mục đích đầu vào / đầu ra kỹ thuật số pin.
+EINT0 - ngoài ngắt 0 đầu vào.
+ MAT0.2 - PWM đầu ra cho Timer 0, kênh 2
- P0.17 : chân 47 của LPC 2103.
_____________________________________________________________________________
GVHD : Th.S Hà Ngọc Nguyên SVTH : Lê Anh Khoa
Nguyễn Hữu Minh
2
Đồ Án Kỹ Thuật Lập Trình
+Tổng giám mục đích đầu vào / đầu ra kỹ thuật số pin.
+ CAP1.2 - Bắt đầu vào cho Timer 1, kênh 2.
+ SCL0 : C1 đồng hồ đầu vào / đầu ra.
- P0.18 : chân 48 của LPC 2103.
+Tổng giám mục đích đầu vào / đầu ra kỹ thuật số pin.
+ CAP1.3 - Bắt đầu vào cho Timer 1, kênh 3.
+SDA1 :C1 dữ liệu đầu vào / đầu ra. pin này là một cống mở ra nếu chức năng
+ AD0.6– ADC0, ngõ vào 6.
- P0.26 : chân 39 của LPC 2103.
+Tổng giám mục đích đầu vào / đầu ra kỹ thuật số pin.
+ AD0.7 – ADC0, ngõ vào 7
- P0.27 : chân 8 của LPC 2103.
+Tổng giám mục đích đầu vào / đầu ra kỹ thuật số pin.
+ TRST - Test thiết lập lại cho giao diện JTAG. Nếu DBGSEL là cao, chân này là
tự động cấu hình để sử dụng với EmbeddedICE (Debug chế độ).
+ CAP2.0 - Bắt đầu vào cho 2 Timer, kênh 0.
- P0.28 : chân 9 của LPC 2103.
+Tổng giám mục đích đầu vào / đầu ra kỹ thuật số pin.
+ TMS - Chọn chế độ thử nghiệm cho giao diện JTAG . Nếu DBGSEL là cao,
chân này là ) tự động cấu hình để sử dụng với EmbeddedICE (Debug chế độ).
+ CAP2.1- Bắt đầu vào cho 2 Timer, kênh 1.
- P0.29 : chân 10 của LPC 2103.
+Tổng giám mục đích đầu vào / đầu ra kỹ thuật số pin.
+TCK - Kiểm tra đồng hồ cho giao diện JTAG. Đồng hồ này phải được chậm hơn
1/6 lần của CPU đồng hồ (CCLK) cho giao diện JTAG để hoạt động. Nếu DBGSEL
_____________________________________________________________________________
GVHD : Th.S Hà Ngọc Nguyên SVTH : Lê Anh Khoa
Nguyễn Hữu Minh
2
Đồ Án Kỹ Thuật Lập Trình
là cao, điều này pin được tự động cấu hình để sử dụng với EmbeddedICE (Debug
chế độ).
+ CAP2.2 - Bắt đầu vào cho 2 Timer, kênh 2.
- P0.30 : chân 15 của LPC 2103.
+Tổng giám mục đích đầu vào / đầu ra kỹ thuật số pin.
+TDI - Kiểm tra dữ liệu nhập cho giao diện JTAG. Nếu DBGSEL là cao, chân này
là tự động cấu hình để sử dụng với EmbeddedICE (Debug chế độ).
và kết nối.
10 PLOCK bit = 0: PLL chưa được khóa 0
bit = 1: PLL đã được khóa với tần số yêu cầu
15:11 - Reserved n/a
III.3 : PLL Feed Register (PLL0FEED & PLL1FEED)
Sau khi bộ PLL đã được kết nối, mọi thay đổi trong 2 thanh ghi PLLCON &
PLLCFG sẽ
không có tác dụng. Để thay đổi cấu hình PLL đã chọn, phải ghi vào thanh ghi
PLLFEED
theo 1 thứ tự xác định:
- Ghi 0xAA vào PLLFEED
- Ghi 0x55 vào PLLFEED
Thao tác ghi phải theo đúng thứ tự, và liền kề nhau.
_____________________________________________________________________________
GVHD : Th.S Hà Ngọc Nguyên SVTH : Lê Anh Khoa
Nguyễn Hữu Minh
2
Đồ Án Kỹ Thuật Lập Trình
*******************************************************
Ví Dụ: tính toán tần số PLL: giả sử tần số thạch anh là 12MHz và tần số chip CCLK
là 60MHz, không sử dụng USB.
Fosc: tần số dao động thạch anh
Fcco: tần số dao động của PLL CCO
CCLK: ngõ ra PLL, đồng thời là xung hệ thống
Ta có:
CCLK = Fosc x M => M = 5
Fcco = CCLK x 2 x P
156 MHz < Fcco < 320 MHz => 1.3 < P < 2.7 => P = 2
Bảng giá trị của MSEL & PSEL:
PSEL bits 6:5 của PLLCFG P
edge cũng có tần số được điều khiển bởi Match register 0.
PWM2 & PWM4: double edge
PWM5: single edge
Bảng các kênh PWM:
Kênh Single Edge Double Edge
Set by Reset by Set by Reset by
1 Match 0 Match 1 - -
_____________________________________________________________________________
GVHD : Th.S Hà Ngọc Nguyên SVTH : Lê Anh Khoa
Nguyễn Hữu Minh
2
Đồ Án Kỹ Thuật Lập Trình
2 Match 0 Match 2 Match 1 Match 2
3 Match 0 Match 3 Match 2 Match 3
4 Match 0 Match 4 Match 3 Match 4
5 Match 0 Match 5 Match 4 Match 5
6 Match 0 Match 6 Match 5 Match 6
PHẦN IV : CHỌN PHẦN MỀM LẬP TRÌNH CHO CHÍP
Hiện nay có nhiều phần mềm lập trình cho LPC2103 như “Keil uVision4” for
ARM đây là phần mềm thông dụng được sử dụng nhiều nhất hiện nay. Bên cạnh đó
còn có “Raisonance Tools” hay còn gọi là Ride7 dành riêng cho ARM, phần mềm
này hỗ trợ khá đầy đủ cho việc lập trình IO,PPL,ADC,PWM cho ARM với việc khai
báo sẵn trong file thư viện (.h), các ví dụ đơn giản trong phần Example. Ngoài ra
người sử dụng có thể khai báo những thanh gi khác mà không có sẵn trong file thư
viện để sử dụng cho những ứng dụng khác.
Ở đây chúng ta sử dụng Raisonance Tools để lập trình cho LPC2103.
GIAO DIỆN VÀ LẬP TRÌNH CƠ BẢN VỚI “RAISONANCE TOOLS”
Biểu tượng Raisonance Tools
_____________________________________________________________________________
GVHD : Th.S Hà Ngọc Nguyên SVTH : Lê Anh Khoa
#define MYFIOSET IOSET }
#define MYFIOCLR IOCLR }
#define MYOUTPUTSHIFT 16 void donothing() {;}
#define MYOUTPUTMASK (0x00FF0000) void Delay(unsigned int cnt)
main() {
{ dcnt=cnt;
_____________________________________________________________________________
GVHD : Th.S Hà Ngọc Nguyên SVTH : Lê Anh Khoa
Nguyễn Hữu Minh
2
Đồ Án Kỹ Thuật Lập Trình
Delay(0x1000); while(dcnt )
MYFIODIR = MYOUTPUTMASK; donothing();
MYFIOSET = MYOUTPUTMASK; }
IODIR = 0x00FF0000;
Viết bằng Keil uVision4
#include <LPC210x.H>
#include <LPC21xx.h>
void delay(int time)//Ham delay
{
unsigned int count;
for (count = 0; count<time; count++)
{;}
}
int main(void)
{
unsigned int flasher = 0x00010000;
IODIR = 0x00FF0004;
IOSET = 0x00000040;
while(1)