6.2 Các loại thanh ghi : VICIRQStatus Read only 32 bit từ 0-> 31 : bit nào trong thanh ghi này là 1 nó chỉrằng interrupt đó đang hoạt động và loại interrupt là IRQ VD: VICIRQStatus
Trang 1ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA CÔNG NGHỆ THÔNG TIN
-o0o -BÁO CÁO ĐỒ ÁN TIN HỌC
TỔNG QUAN VI XỬ LÝ LPC2378 HƯỚNG DẪN SỬ DỤNG BOARD MCB2300
GVHD: TS Đinh Đức Anh Vũ SVTH:
Đặng Việt Hùng - 50401023 Trần Trung Tín - 50402645
1
Trang 2Tp HCM, Tháng 12/2007
Trang 4MỤC LỤC
1 Tổng quan về đồ án 1
2 Cách sử dụng board MCB2300 2
2.1 Giới thiệu board thực tập MCB2300 2
2.2 Cài đặt board MCB2300 4
2.3 Thiết lập jumper trên board MCB2300 8
3 Cách đánh địa chỉ trong LPC2300 9
3.1 Tổ chức bộ nhớ và địa chỉ của các thiết bị ngoại vi 9
3.2 Phân vùng bộ nhớ 10
3.3 Địa chỉ thiết bị APB 12
3.4 Phần vùng lại bộ nhớ và boot ROM 13
3.5 Điều khiển phân vùng bộ nhớ 14
4 Khối điều khiển hệ thống 16
4.1 Giới thiệu 16
4.2 Chân kết ngối ngoài 17
4.3 Các thanh ghi liên quan 17
4.4 Reset 18
5 Cách thiết lập PIN cho LPC2300 19
6 Interrupt .21
6.1 Giới thiệu 21
6.2 Các loại thanh ghi 21
6.3 Kiến trúc Interrupt 23
Trang 57 Timer 26
7.1 Giới thiệu 26
7.2 Timer hoạt động như thê nào 26
7.3 Thiết lập timer 28
8 UART .30
8.1 Giới thiệu 30
8.2 Các loại thanh ghi trong UART 32
8.3 Khởi động UART 33
9 I2C 39
9.1.Giới thiệu 39
9.2 Nguyên lý hoạt động 39
9.3 Kết nối vật lý 40
9.4 Sơ đồ khối của I2C 41
9.5 Những thanh ghi quan trọng 44
9.6 Các chế độ hoạt động của I2C 45
9.7 Một số ví dụ 49
Phần phụ lục 52
Điều khiển LED 52
Điều khiển màn hình LCD 52
Tập lệnh ARM 7 53
10 Kết luận 80 Tài liệu tham khảo
Kết luận
5
Trang 6CHƯƠNG 1 TỔNG QUAN VỀ ĐỒ ÁN.
LPC2378 là một vi xử lý dựa trên nền tảng ARM và được dùng cho các ứng dụng yêu cầutruyền nhận dữ liệu tuần tự Vi xử lý này tính hợp một giao tiếp 10/100 Ethernet MAC, giaotiếp USB 2.0 Full Speed, 4 giao tiếp UART, 2 kênh CAN, 1 cổng SPI, 2 cổng SSP(Synchronous Serial Ports), 3 giao tiếp I2C, 1 giao tiếp I2S và 1 MiniBus
Thuật ngữ LPC2300 được áp dụng cho toàn bộ họ vi xử lý gồm LPC2364, 2366, 2368 và
2378 Trong khuôn khổ báo cáo này, chúng ta chỉ quan tâm đến LPC2378
Đồ án tin học này sẽ giới thiệu một số đặc điểm chính của kiến trúc LPC2378 cũng như tínhnăng, ứng dụng và các ví dụ dựa trên thí nghiệm với board MCB2300
Trang 7CHƯƠNG 2 CÁCH SỬ DỤNG BOARD MCB2300
2.1 Giới thiệu board thực tập MCB 2300
Board thí nghiệm MCB2300 cho phép tạo ra và chạy những chương trình trên họ thiết bịLPC23xx của NXP Board thí nghiệm có 2 phiên bản khác nhau là MCB2360 và MCB2370
Board MCB 2360 thông dụng với vi điều khiển NXP LPC2368
Board MCB 2370 thông dụng với vi điều khiển NXP LPC2378
Trong phạm vi báo cáo này, chúng ta chỉ đề cập đến board MCB 2370 Khi nói đến boardMCB 2300 tức là bao gồm cả MCD 2368 và MCB 2378
2.1.1 Kit thí nghiệm MCB2300
Bên trong một bộ kit thí nghiệm MCB 2300 bao gồm
_ Board thí nghiệm MCB 2300
_ Hướng dẫn nhanh Vision µIDE
_ Bản giới thiệu tổng quan về công cụ phát triển của ARM
_ Một CD-ROM chứa:
7
Trang 8+ Bản dùng thử chương trình “RealView MDK-ARM Microcontroller Development Kit”.
+ Một số chương trình ví dụ chạy trên board MCB2300
+ File hướng dẫn sử dụng của board MCB2300
_ Chương trình ví dụ chạy trên board MCB2300 có thể tìm thấy ở
KEIL\ARM\RV30\BOARDS\KEIL\MCB2300 trên CD-ROM Tất cả các ví dụ này đều có thể dịch
và chạy trên bản dùng thử
2.1.2 Đặc điểm chính của board MCB2300.
Giao diện USB 2.0 Full Speed
Có hai cổng giao tiếp serial
Có hai cổng giao tiếp CAN
LF Amplifier
Điều khiển điện áp tương tự cho cổng vào ADC
Giao diện JTAG để nạp và chạy debug
2.1.3 Chuẩn bị về phần cứng.
Để sử dụng board MCB2300, chúng ta cần chuẩn bị:
Board thí nghiệm MCB2300
Máy tính chuẩn IBM còn trống:
_ 2 cổng USB : 1 cổng cung cấp nguồn điện và một cổng dùng để download/debug._ 1 cổng COM RS-232 nếu sử dụng cách nạp bằng ISP thông qua cổng giao tiếp serial
Bộ giao tiếp JTAG : bao gồm Adapter JTAG và 2 dây cáp nối USB
Trong TH cần sử dụng tiện ích “Flash Magic Utility” một dây cáp serial, 1 đầu đực/1đầu cái, ngắn hơn 3m
Trang 92.1.4 Chuẩn bị về phần mềm.
Hệ điều hành Microsoft Windows 2000/XP
Phần mềm “Keil µVision”
Phần mềm “RealView MDK-ARM Evaluation Tools”
Các ví dụ viết cho MCB2300 được kèm theo các bộ MDK-ARM, DB-ARM và KeilARM Evalution Toolkits
2.2 Cài đặt board thí nghiệm MCB2300.
Sau khi đã chuẩn bị đầy đủ các yêu cầu về phần cứng và phần mềm, chúng ta có thể tiến hànhcác bước sau đây để cài đặt và sẵn sàng thí nghiệm trên board MCB2300
2.2.1 Cài đặt board.
Board MCB2300 dùng nguồn điện từ cổng USB
Board MCB2300 kết nối trực tiếp đến phần mềm “Keil µVision Debugger” bằng adapter
“Keil ULINK USB-JTAG”, không cần cài đặt thêm bất cứ phần mềm nào trên board
9
Trang 102.2.2 Các thành phần quan trọng trên board MCB2300.
2.2.3 Kết nối với U-LINK.
Bước 1, kết nối U-LINK với PC thông qua cable USB
Bước 2, kết nối U-LINK đến cổng JTAG nằm trên board MCB2300
Bước 3, cấp nguồn cho board MCB2300 bằng cabke USB
Bước 4, thiết lập mức xung JTAG cho adapter U-LINK
_ Cho hoạt động board MCB2300
_ Trong phần mềm µVision, thiết lập bộ Debug trong hộp thoại Project\Options forTarget\Debug
Trang 11_ Chọn “Use: ULINK ARM Debugger” trong danh sách thả xuống.
_ Click lên nút “Setting” để mở hộp thoại “ARM Target Driver Setup”
_ Danh sách thà xuống “Max JTAG Clock” dùng để chỉ định xung JTAG cao nhất
được dùng để giao tiếp với board thí nghiệm Nên chọn giá trị 200 kHz để board
MCB2300 hoạt động tốt nhất
*_ ULINK2 JTAG có thêm chân RTCK (Return Clock) Nếu sử dụng adapter ULINK2,chúng ta có thể thiết lập Max JTAG Clock là 200 kHz hoặc RTCK
2.2.4 Kết nối thông qua giao tiếp Serial
Bước 1, thiết lập jumper trên board MCB2300
_ J9 và J10 : ON
_ J13 : OFF
Bước 2, cấp nguồn cho board MCB2300 bằng cabke USB
Bước 3, Kết nối board MCB2300 vào máy tính qua cổng COM từ cổng COM0 trênboard
Bước 4, Xác nhận kết nối bằng tiện ích “Flash Magic”
_ Chạy “Flash Magic” và thiết lập thông số như sau:
11
Trang 12_ Xác nhận cổng COM bằng lệnh ISP – Read Device Signature.
_ Cừa sổ sau đây sẽ hiển thị thông số kết nối
Trang 132.3 Thiết lập jumper trên board MCB2300.
Các jumper trên board MCB2300, đây cũng là thông số mặc định trong TH kết nối board
thông qua ULINK2
Jumper State Description
J1 - USB (D-) ON Connects USB Line D- to the USB connector.
J2 - USB (D+) ON Connects USB Line D+ to the USB connector.
J3 - AOUT ON Connects AOUT via LF amplifier to the loudspeaker.
J4 - Not used
J5 - UMODE ON Allows soft-connect of the USB device by issuing a software restart via P0.14
J6 - AD0.0 ON Connects POT1 potentiometer to AIN0 for analog input demonstration.
J8 - INT0 ON Enable INT0 Push Button.
J9 - RST ON Enables Reset via COM0.
J10 - ISP OFF Disables In-System Programming via COM0.
J11 - LED ON Enables Port2.0 - Port2.7 LEDs.
J13 - ETM ON Enables the Embedded Trace Macrocell (so that the USB soft-connect and the LED's
can be used)
13
Trang 14CHƯƠNG 3 CÁCH ĐÁNH ĐỊA CHỈ TRONG LPC2300
3.1 Tổ chức bộ nhớ và địa chỉ của các thiết bị ngoại vi.
Bộ xử lý ARM có thể quản lý một không gian địa chỉ bộ nhớ 4 GB Bảng sau đây thể hiện sựphân bố địa chỉ của vùng bộ nhớ trong các thiết bị ARM:
Trang 163.2.1 Phân vùng bộ nhớ cho thiết bị ngoại vi
Cả hai vùng nhớ cho thiết bị AHB và APB để có không gian là 2MB và chia đều cho 128 thiếtbị., mỗi thiết bị được phân 16 KB Điều này đơn giản việc giải mã địa chỉ cho từng thiết bị
Trang 173.3 Địa chỉ thiết bị APB.
Bảng sau thể hiện phân vùng của thiết bị APB
17
Trang 183.4 Phân vùng lại bộ nhớ trong LPC2300 và boot ROM
3.4.1 Nguyên lý và các chế độ hoạt động
Bảng vector ngắt của ARM7 được phân vùng từ 0x000 0000 đến 0x0000 001C, vì thế, mộtphần chia của Boot ROM và SRAM cần được phân vùng lại để có thể hoạt động trong nhữngchế độ khác nhau Việc phân vùng lại vector ngắt liên quan chặt chẽ đến Bộ Điều khiển Phânvùng nhớ
Trang 193.4.2 Phân vùng lại bộ nhớ
Boot ROM được phân vùng trên cùng của bộ nhớ, một chương trình dù chiếm nhiều hay ít bộnhớ đều không ảnh hưởng đến vị trí của Boot ROM hoặc không thay đổi phân vùng của véc
tơ ngắt Boot ROM
Phân vùng bộ nhớ được cấp phát lại cho phép thực hiện quá trình ngắt ở những chế độ khácnhau, áp dụng cho vùng vectơ ngắt (32 bytes) và cả 32 bytes mở rộng Mã điều khiển việcphân vùng được cất giữ ở địa chỉ từ 0x0000 0000 và 0x0000 003F Chương trình trong bộ nhớFlash được có điểu khiển FIQ lưu ở 0x0000 001C Vectơ chứa trong SRAM, bộ nhớ ngoài vàBoot ROM phải chứa địa chỉ đến điều khiển ngắt thật sự một cách trực tiếp hay gián tiếp hôngqua một câu lệnh khác
3.5 Điều khiển phân vùng bộ nhớ
Điều khiển phân vùng bộ nhớ thay đổi phân vùng của những vector ngắt xuất hiện ở địa chỉ0x0000 0000 Mã chương trình sẽ được phép chạy ở những vùng nhớ khác và điều khiểnnhững ngắt
3.5.1 Thanh ghi điều khiển phân vùng bộ nhớ (MEMMAP – 0xE01F C040)
Khi một điều khiển ngoại lệ cần thiết, vi xử lý sẽ nạp câu lệnh điền khiển địa chỉ của ngoại lệcăn cứ vào bảng 2.5 Thanh ghi MEMMAP xác định địa chỉ nguồn của dữ liệu sẽ nạp vàobảng này
19
Trang 21CHƯƠNG 4 KHỐI ĐIỀU KHIỂN HỆ THÔNG
4.1 Giới thiệu.
Khối điều khiển hệ thống bao gồm nhiều đặc tính hệ thống và nó điều khiển những thanh ghicho một số chức năng riêng biệt, không liên quan đến bất cứ thiết bị ngoại vi nào Nhữngchức năng đó là:
Reset
Brown-Out Detection
Ngõ nhập ngoài tạo ngắt
Điều khiển/ Thông số hệ thống
Bảo mật và Tìm lỗi code
AHB configuration
Mỗi chức năng có một hay nhiều thanh ghi của riêng nó Những bit không cần thiết trongthanh ghi sẽ được giữ lại cho những mở rộng về sau Những chức năng không liên quan vớinhau không chia sẽ chung bất cứ thanh ghi nào
21
Trang 224.2 Chân kết nối ngoài của khối điều khiển hệ thống.
Bảng sau đây thể hiện những chân kết nối ngoài liên quan đến những chức năng của khối điềukhiển hệ thống
4.3 Các thanh ghi liên quan.
Bảng sau đây thể hiện những thanh ghi liên quan đến những chức năng của khối điều khiển hệthống
Trang 244.4 Reset
Có 4 cách Reset trên LPC2300
Chân RESET (ngõ nhập Schmitt trigger)
Lệnh Reset của Watchdog
Reset khi mở nguồn
Mạch Brown Out Dectection
Sơ đồ khối điểu khiển Reset
4.5 Các chức năng điều khiển khác.
Tham khảo User Manual – Chapter 3
Trang 25CHƯƠNG 5 CÁCH THIẾT LẬP PIN CHO LPC2378
Mỗi chân trong LPC2378 có thể có nhiều chức năng hoặc input, output hay làm 1 chức năng
cụ thể của 1 phần nào đấy Ví dụ như : P0[1] (port số 0 chân số 1) có thể làm chức năng input,output căn bản hay cũng có thể làm chức năng là chân nhận dữ liệu của Control Area Network
1 (CAN1)
Chi tiết của từng chân tham khảo trong user manual trang 95 Ý tưởng ở đây là chúng ta biếtmỗi chân có nhiều chức năng và khi muốn sử dụng chức năng nào thì ta phải thiết lập 1 số giátrị nhất định cho thanh ghi nào đó
Như vậy ta sẽ phải có 1 thanh ghi để chọn chức năng cho từng chân Thanh ghi đó là PINSEL,
có 10 thanh ghi PINSEL0 -> PINSEL9 Mỗi 1 chân của LPC2378 sẽ tương ứng với 2 bittrong 1 thanh ghi này
Trang 26Lấy ví dụ như ta muốn set chân P0.2 là TXD và P0.3 là RXD còn các chân còn lại giữ nguyênthì ta sẽ dung câu lệnh :
PINSEL0 |=0x50; //set bit 4 và số 6 giữ nguyên các bit còn lại
PINSEL0 &=~0xA0; // xóa bit số 5 và số 7 giữ nguyên các bit còn lại
Trang 27CHƯƠNG 6 INTERRUPT
6.1 Giới thiệu
LPC2378 hỗ trợ 32 vector IRQ interrupt và có 16 mức độ ưu tiên
Có 2 loại interrupt : interrupt request (IRQ) và Fast Interrupt Request (FIQ)
Vectored Interrupt Controller (VIC) hỗ trợ 32 yêu cầu interrupt, ta sẽ lập trình vector
đó tương ứng với loại interrupt nào (IRQ hay FIQ)
Fast Interrupt Request là interrupt có độ ưu tiên cao nhất Nếu có cùng độ ưu tiên thìinterrupt ở vector có chỉ số nhỏ nhất sẽ được làm trước IRQ có độ ưu tiên thấp hơn,cũng tương tự như FIQ nếu có nhiều interrupt cùng độ ưu tiên thì interrupt nào ởvector có chỉ số nhỏ hơn sẽ được thực thi trước
6.2 Các loại thanh ghi :
VICIRQStatus (Read only) (32 bit) từ 0-> 31 : bit nào trong thanh ghi này là 1 nó chỉrằng interrupt đó đang hoạt động và loại interrupt là IRQ
VD: VICIRQStatus = 0x00001003H có nghĩa là Vector interrupt số 0,1,15 đang hoạtđộng và loại interrupt của 3 vector này là IRQ
VICFIQStatus (Read only) (32 bit) từ 0-> 31 : bit nào trong thanh ghi này là 1 nó chỉrằng interrupt đó đang hoạt động và loại interrupt là FIQ
VD: VICIRQStatus = 0x00001003H có nghĩa là Vector interrupt số 0,1,15 đang hoạtđộng và loại interrupt của 3 vector này là FIQ
VICRawIntr(Read only) (32 bit) từ 0-> 31 :
o Bit nào bằng 0 : không có interrupt cả hardware lẫn software cho vectorinterrupt đó
o Bit nào bằng 1 : có interrupt hardware hay software cho vector interrupt đó
VICIntSelect (Read/Write) (32 bit) : thay đổi loại interrupt IRQ hay FIQ
o Bit bằng 0: IRQ
27
Trang 28o Bit bằng 1: FIQ
VICIntEnable (Read/Write) (32 bit) Điều khiển 32 interrupt cả hardware lẫn software.Khi ta đọc thanh ghi này, giá trị 1 nói rằng vector interrupt đó đang được enable (cóthể là FIQ hay IRQ) Khi ta write thanh ghi này, write bit nào trong thanh ghi đó là 1thì nó sẽ cho phép vector đó interrupt (FIQ or IRQ)
VICVectAddr : cho ta biết địa chỉ sẽ nhảy đến khi interrupt xảy ra Nó thường đượcgán với địa chỉ của 1 hàm interrupt trong chương trình
VICVectPriority : nói lên độ ưu tiên của interrupt đó Từ 0 đến 16 (tức chỉ dùng 4 bitđầu từ 0 đến 3) còn bit từ 4-> 31 không dùng (gán cho bằng 0 hết)
Trang 30 Khối priority and generation: có nhiệm vụ chọn interrupt nào sẽ làm, và địa chỉ nào sẽnhảy tới.
LPC2378 hỗ trợ nhiều ngoại vi và 1 số chức năng khác : mỗi 1 chức năng như vậy sẽ đượcgắn với 1 thanh ghi trong vector interrupt Ta muốn sử dụng chức năng interrupt nào thì phảiset thanh ghi đó Muốn biết chức năng mình dùng nằm trong thanh ghi nào thì tham khảotable 79 trang 87 (user manual)
Ví dụ bây giờ ta muốn set interrupt cho timer0
VICVectAdd4 = (unsigned long) Timer_handle0;// set địa chỉ nhảy đến
VicVectCntl4 = 15 //set độ ưu tiên cho interrupt 4 (0-15)
Trang 31VicIntEnable = (1 << 4) //Enable Vector interrupt 4
Vậy để cho tiện lợi thì ta sẽ xây dựng 1 hàm install_IRQ, hàm này có nhiệm vụ cài đặt cácinterrupt , kích hoạt …
Hàm này sẽ nhận vào 3 thông số : IntNumber : vector interrupt số mấy (0-31), *HanderAddr :
là địa chỉ nơi cần nhảy đến khi interrupt xảy ra, và Priority là độ ưu tiên (0 – 15) Hàm này sẽtrả về giá trị false nếu IntNumber >=32 và trả về true nếu cài đặt interrupt thành công
Vậy giờ ta cần set interrupt timer thì ta chỉ cần gọi hàm
Install_IRQ(4, (void *) Timer_handler0, 15);
/* find first un-assigned VIC address for the handler */
//xác định địa chỉ của thanh ghi Vic address cần thiết lập
vect_addr = (unsigned long *)(VIC_BASE_ADDR+ 0x100 +IntNumber*4);
// xác định địa chỉ của thanh ghi priority cần thiết lập
vect_prio = (unsigned long *)(VIC_BASE_ADDR+ 0x100 +IntNumber*4);
*vect_addr = (unsigned long)HandlerAddr;/*set interrupt vector
Trang 32CHƯƠNG 7 TIMER
7.1 Giới thiệu
Có 2 chức năng chính : ta có thể dùng làm đồng hồ để chạy thời gian, có thể đếm số sự kiện(bên trong hay bên ngoài) Sau mỗi khoảng thời gian được quy định trước hay sau 1 số sựkiện thì timer sẽ sinh ra 1 interrupt (chương trình sẽ nhảy đến địa chỉ chứa hàm interrupt vàthực thi hàm đó)
LPC2378 hỗ trợ 4 bộ timer 0,1,2,3 , tất cả đều 32 bit
7.2 Timer hoạt động như thế nào
Thanh ghi TC : là thanh ghi đếm (thời gian hay sự kiện) Cứ sau thời gian hay sự kiện thìthanh ghi TC sẽ tăng lên Tăng đến khi bằng giá trị trong thanh ghi MRn (n = 0-3) thì sẽ sinh
ra 1 interrupt Interrupt này có thể reset TC, stop timer (Tùy vào chúng ta thiết lập giá trị làbao nhiêu cho thanh ghi TnMCR)
Trang 33Nguyên lý hoạt động
Sơ đồ khối :
33
Trang 34Nhìn vào đây ta có thể thấy 1 cách tổng quát hoạt động của timer:
Đầu tiên clock PCLK đưa vào Prescale Counter (thanh ghi này sẽ điều khiển việc chia clockPCLK) cụ thể là mỗi PCLK vào thì thanh ghi Prescale Counter sẽ tăng lên 1, nó tăng lên đếnkhi nào bằng giá trị trong thanh ghi Precale Register thì thanh ghi TC sẽ tăng lên 1 Thanh ghi
TC cứ tăng lên như thế cho đến khi nào bằng với giá trị trong thanh ghi MRn thì sẽ sinh ra 1interrupt
Ngoài ra thì còn có thanh ghi TCR (để điều khiển có cho timer chạy hay không)
Và các thanh ghi Capter Register để load giá trị thanh ghi TC vào khi cần thiết
7.3 Làm thế nào để thiết lập cho timer hoạt động.
a Thiết lập mode (timer or counter) :
Ghi giá trị thích hợp lên thanh ghi TnCTCR (tham khảo trang 471 user manual)
Bit 1 :0 là để thiết lập conter/timer mode
Bit 3 :2 Thiết lập chân input cho timer (chỉ được sử dung trong counter mode)
Lưu ý: Nếu thiết lập mode này cho timer nào thì 3 bit của nó trong thanh ghi TnCCR phảiđược lập trình là 0
Bit 7:4 Không sử dụng (Lưu ý: cái nào không sử dụng cho nó bằng 0 hết)
b Thiết lập thời gian hay số sự kiện để xảy ra 1 lần interrupt
Thiết lập thời gian sinh ra interrupt hay số sự kiện sinh ra interrupt
Ta sẽ ghi giá trị vào thanh ghi MR0 nếu ta dung timer0, MR1 nếu dung
timer1 … (Cứ sau mỗi khoảng thời gian hay số sự kiện này sẽ sinh ra 1 interrupt)
Ghi giá trị vào thanh ghi TMCR, đây là thanh ghi điều khiển việc sinh ra
interrupt.(Reset hay Stop TC) (Tham khảo trang 473)
Trang 35Nếu ở trên ta chọn Counter mode thì phải thiết lập giá trị cho thanh ghi TnCCR Đây là thanhghi điều khiển, nó sẽ chọn cạnh lên hay cạnh xuống hay cả hai xảy ra ở chân input được coi là
1 sự kiện Hay nói cách khác 1 sự kiện là 1 sự thay đổi ở ngõ vào input (Xem chi tiết ở trang475)
Ngoài ra ở chế độ counter mode có 4 thanh ghi CR0-3 (mỗi thanh ghi đước nối với 1 chân)Khi sự kiện xảy ra ở chân này thì nó sẽ load giá trị của thanh ghi TC vào
35
//Khởi động Vecter_interrupt Timer0
VicVectAddr4 = (unsigned long) tên_hàm_interrupt;
VicVectCntl4 = 15; //độ ưu tiên cho Add4 (0-15)
VicIntEnable = (1<<4); //Enable Timer Interrupt
//Khởi động các giá trị đầu cho timer0
T0TCR = 2;// Reset
T0PR = 0;
T0MR0 = (Fpclk / 1000) -1 //delay 1ms, 1000 xung clk Pclk là 1 interrupt
T0IR = 0xFF; //reset interrupt
T0MCR = 0x04; //stop timer
T0TCR = 0x01; //Enable timer
While (T0TCR & 0x01); // delay time 1ms
Trang 36CHƯƠNG 8 UART
8.1 Giới thiệu
Trước hết UART là gì: Universal Asynchronous Receiver Transmitter
Dùng để truyền và nhận dữ liệu nối tiếp LPC2378 hỗ trợ 4 bộ truyền nhận nối tiếp UART0,UART1, UART2 và UART3 (truyền nhận 16 byte với cơ chế FIFO) Tiếp theo chúng ta sẽxem xét đến phần kiến trúc của UART
Kiến trúc :
Mọi sự truyền nhận thông tin giữa CPU và UART đều thông qua APB
Việc nhận tín hiệu của UART : thông qua chân RXD và đi vào thanh ghi dịch(UnRSR) sau đó dữ liệu sẽ được chuyển qua thanh ghi chứa dữ liệu (UART RXBuffer Register FIFO) và dữ liệu sẽ ở đây chờ CPU tới đọc
Việc truyền tín hiệu của UART : cũng tương tự như thế, CPU truyền dữ liệu vào trongbuffer ở trong thanh ghi UnTHR (UART TX Holding Register FIFO), sau đó dữ liệu
từ thanh ghi này được chuyển sang thanh ghi dịch (UnTSR) và từ từ truyền ra ngoàithông qua chân TXD
Về tốc độ truyền dữ liệu UART cho phép cho thiết lập tốc độ baud thông qua cácthanh ghi Và ta phải tự tìm ra tốc độ baud nào hợp lý nhất (tức xác suất lỗi trên đườngtruyền ít nhất) Vấn đề này sẽ được thảo luận trong phần sau
Các sự thiết lập interrupt ở trong thanh ghi UnIER và UnIIR
Thông tin từ việc truyền nhận (2 chân TX và RX) được lưu trong thanh ghi UnLSR
Thông tin điều khiển nằm ở trong thanh ghi UnLCR
Trang 37Sơ đồ khối của UART
UART giao tiếp với bên ngoài qua 2 chân TXD và RXD (mũi tên màu đỏ ở trên hình)
37
Trang 38Nhìn vào sơ đồ khối ta có thể thấy UART gồm có 4 bộ chính :
Bộ Interrupt : điều khiển việc interrupt, lưu trữ status và khi nào có interrupt sẽ đẩy rachân UnINTR
Bộ điều khiển Clock UnBRG điều khiển việc sinh ra CLK từ 2 dữ liệu vào là UnDLL
Phần trên là sơ lược khái niệm về UART, bây giờ ta bắt đầu vào tìm hiểu các thanh ghi củaUART, cách thiết lập các thanh ghi để UART hoạt động
8.2 Các loại thanh ghi UART
(tham khảo trang 330 user manual)
UnRBR (UART Receiver Buffer Register) là thanh ghi chỉ đọc (read only, chứa 8 bitdata) chứa thong tin cũ nhất có thể được đọc bới CPU Để truy xuất được vào thanhghi này thì bit DLAB trong thanh ghi LCR phải là 0
UnTHR (UART Transmit Holding Register) cũng tương tự thanh ghi UnRBR nhưng
nó dùng để truyền dữ liệu nên nó sẽ là thanh ghi chứa dữ liệu mới nhất được truyền.UnTHR là thanh ghi chỉ ghi (write only, 8 bit data) DLAB phải là 0 khi ta truy xuấtvào thanh ghi này
UnIER (UART Interrupt Enable Register) được sử dụng để kích hoạt 3 interrupt (RBRinterrupt, THRE interrupt, RX Line Status Interrupt) và cho phép auto-baud rate vàtime out Chi tiết tham khảo trang 333
Trang 39 UnIIR (UART Interrupt Identification Register) cung cấp cho chúng ta đó là interrupt
gì và độ ưu tiên của nó như thế nào Như có interrupt đang đợi không? Interrupt đó làgì? Có chế độ auto-baud không? Đã kết thúc chưa? Có bị time out không? … (Thamkhảo trang 334)
Về độ ưu tiên interrupt thì có 3 độ ưu tiên:
Receive Line Status (RLS) (ưu tiên cao nhất)
Receive Data available (RDA) (ưu tiên mức 2)
Character Time out Indicator (CTI) (ưu tiên mức 2)
THRE interrupt
UnFCR (UART FIFO Control Register) thanh ghi điều khiển
UnLCR (UART Line Control Register) Thiết lập các định dạng để truyền và nhận
UnLSR (UART Line Status Register) chứa thong tin về việc truyền nhận (lỗi, thanhghi chứa dữ liệu đang rỗng …)
Và còn vài thanh ghi cho các mục đích khác
UART3 (có chân TXD3 là P0.0 hay P4.28 và RXD3 là P0.1 hay P4.29)
Như ta đã biết 1 chân có thể có nhiều chức năng và muốn nó làm chức năng gì ta phải thiết lập cho nó thông qua thanh ghi PINSEL (chi tiết tham khảo trang 115)
39
Trang 40VD : ta thiết lập cho UART0 thì dùng câu lệnh sau :
PINSEL0 |= 0x00000050; /* RxD0 and TxD0 */
PINSEL0 &= ~0xA0;
Tiếp theo thiết lập thanh ghi điều khiển UnLCR (để tạo format cho việc truyền nhận)(Như có sử dụng Parity checking không? Sử dụng bao nhiêu bit Stop bit …)
Set tốc độ baud
Các thanh ghi dùng để set tốc độ baud: UnACR, UnFDR,UnDLL, UnDLM
UnACR để thiết lập mode (Có 2 mode: mode 0 và mode 1), khởi động auto baud, kết thúcauto baud
Mode 0: Baud rate được tính toán dựa trên 2 cạnh xuống của chân RX (1 cạnh xuống
là của Start bit và 1 cạnh xuống là của tín hiệu dữ liệu)