BAÙo caùO ĐỒ Án tin học tổng quan VI xử LÝ lpc2378



tải về 336.68 Kb.
trang1/3
Chuyển đổi dữ liệu15.08.2016
Kích336.68 Kb.
  1   2   3
ÑAÏI HOÏC QUOÁC GIA THAØNH PHOÁ HOÀ CHÍ MINH

TRÖÔØNG ÑAÏI HOÏC BAÙCH KHOA

KHOA COÂNG NGHEÄ THOÂNG TIN

---------------o0o---------------






BAÙO CAÙ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

Traàn Trung Tín - 50402645

Tp HCM, Thaùng 12/2007

MỤC LỤC

Đề mục Trang

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

7. 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.



CHƯƠ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ầu truyề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, giao tiế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ính năng, ứng dụng và các ví dụ dựa trên thí nghiệm với board MCB2300.



CHƯƠ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 board MCB 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:

+ 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.

2.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à Keil ARM 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ành cá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.



2.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 for Target\Debug.

_ 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ên board.

  • 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:

_ 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.





2.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)

CHƯƠ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:





3.2 Phân vùng bộ nhớ

LPC2300 quản lý chặt chẽ từng vùng nhớ riêng biệt. Bảng sau thể hiện toàn bộ không gian địa chỉ. Vùng nhớ chứa địa chỉ vector ngắt phục vụ cho việc đánh lại địa chỉ nhớ, vấn đề này sẽ được đề cập trong phần sau.





3.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ết bị., 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ị.





3.3. Địa chỉ thiết bị APB.

Bảng sau thể hiện phân vùng của thiết bị APB.





3.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ột phần chia của Boot ROM và SRAM cần được phân vùng lại để có thể hoạt động trong những chế độ 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ân vùng nhớ.







3.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ác nhau, áp dụng cho vùng vectơ ngắt (32 bytes) và cả 32 bytes mở rộng. Mã điều khiển việc phâ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ông qua 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ển nhữ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ào bảng này.







CHƯƠ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 ghi cho 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ững chứ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 trong thanh 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ới nhau không chia sẽ chung bất cứ thanh ghi nào.

4.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ều khiể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.





4.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

CHƯƠ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ết mỗ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 bit trong 1 thanh ghi này.



PINSEL

Chức năng

00

Chức năng input,output căn bản

01

Chức năng số 1

10

Chức năng số 2

11

Chức năng số 3

Mọi chân đều có thể làm input,output, tùy vào từng chân mà chức năng số 1,2,3 sẽ là gì.

Chi tiết chức năng của từng chân xem user manul trang 115



Lấ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ên thì 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



CHƯƠ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 :

    • Bit nào bằng 0 : không có interrupt cả hardware lẫn software cho vector interrupt đó

    • 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

    • Bit bằng 0: IRQ

    • 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à 1 thì 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 được gá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)

6.3 Kiến trúc Interrupt

Nhìn vào sơ đồ khối ta có thể thấy : Phần interrupt của LPC2378 có 4 khối: phần interrupt request, khối status interrupt, khối priority, khối vecto interrupt

Trong đó thì


  • Khối interrupt request : có vai trò khi bất cứ interrupt nào được bật lên thì nó sẽ cập nhật lại khối status interrupt.

  • Khối status interrupt có vai trò : chứa các thông tin về các interrupt hiện tại và sinh ra FIQ

  • Khối vectored interrupt chứa thông tin về vector IRQ và địa chỉ cần nhảy tới khi có interrupt

  • 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ẽ được gắn với 1 thanh ghi trong vector interrupt. Ta muốn sử dụng chức năng interrupt nào thì phải set thanh ghi đó. Muốn biết chức năng mình dùng nằm trong thanh ghi nào thì tham khảo table 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)

VicIntEnable = (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ác interrupt , 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);

CHƯƠ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)



: nonghocbucket -> UploadDocument server07 id190496 229274
UploadDocument server07 id190496 229274 -> Báo cáo thực tập tốt nghiệp LỜi mở ĐẦU
UploadDocument server07 id190496 229274 -> I. objectives
UploadDocument server07 id190496 229274 -> Kieåm tra hoïc kì I moân: hoùa hoïc khoái 11 (2011-2012) Thôøi gian 45’ ÑEÀ 1 Caâu 1
UploadDocument server07 id190496 229274 -> Chuyên đề: VI sinh vậT Ứng dụng trong xử LÝ phế thải I. Nguồn gốC phế thảI 1/ Phế thải là gì ?
UploadDocument server07 id190496 229274 -> Ngaøy soaïn : Ngaøy daïy : I
UploadDocument server07 id190496 229274 -> Noäi dung cô baûn cuûa cuoäc Duy taân Minh Trò Về chính trị
UploadDocument server07 id190496 229274 -> Giáo án sử 8 Tuần: 12 Ngày soạn: 06/11/2011
UploadDocument server07 id190496 229274 -> 200 câu hỏi về môi trường (Phần 4) (03-07-2096 15: 37)
UploadDocument server07 id190496 229274 -> 1. Cn b ng c¸c ph­¬ng tr×nh ph¶n øng sau
UploadDocument server07 id190496 229274 -> TỔ HÓa trưỜng thpt lê quý ĐÔn tam kỳ CÂu hỏI Ôn tập hoá chưƠng đIỆn ly. LỚP 11


  1   2   3


Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2019
được sử dụng cho việc quản lý

    Quê hương