1. Trang chủ
  2. » Thể loại khác

Chapter9 TruyXuatBoNho GT V2q

30 141 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 30
Dung lượng 821,08 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

CHƯƠNG 9: TRUY XUẤT BỘ NHỚ Trong chương này, chúng ta sẽ thảo luận về cách thức truy xuất dữ liệu đã được lưu trữ và cách thức ghi dữ liệu của các bộ nhớ Flash và EEPROM của PIC18F.. Tro

Trang 1

CHƯƠNG 9: TRUY XUẤT BỘ NHỚ

Trong chương này, chúng ta sẽ thảo luận về cách thức truy xuất dữ liệu đã được lưu trữ

và cách thức ghi dữ liệu của các bộ nhớ Flash và EEPROM của PIC18F

Mục tiêu chính của chương này cho người tham khảo:

 Hiểu rõ cấu trúc các bộ nhớ ROM, RAM

 Nhận dạng và phân loại được chip bộ nhớ thông dụng

 Biết cách tính dung lượng các bộ nhớ

 Hiểu rõ về cơ chế đọc/ghi bảng của bộ nhớ chương trình

 Có khả năng lập trình truy xuất bộ nhớ chương trình, bộ nhớ EEPROM trong vi điều khiển

9.1 BỘ NHỚ BÁN DẪN

Trong phần này sẽ giới thiệu các loại bộ nhớ bán dẫn và các đặc tính như là dung lượng,

sự tổ chức và thời gian truy xuất Các bộ nhớ bán dẫn được sử dụng để lưu trữ chủ yếu dữ liệu và mã chương trình Các bộ nhớ bán dẫn được sử dụng rộng rãi nhất là ROM và RAM

Có bao nhiêu vị trí tồn tại bên trong chip nhớ? Điều đó phụ thuộc vào số các chân địa chỉ Số các vị trí bên trong chip nhớ luôn luôn bằng 2 luỹ thừa của số các chân địa chỉ Vì thế, tổng số các bit mà chip nhớ có thể lưu trữ thì tương đương với số lần các vị trí số các bit dữ liệu trên một vị trí

Tổng quát cách tính:

(1) Một chip nhớ chứa 2 x vị trí, trong đó x là các chân địa chỉ

(2) Mỗi vị trí lưu trữ được y bits, với y là số các chân dữ liệu trên chip

(3) Toàn bộ chip sẽ chứa được là 2 x *y bits

Trang 2

Bảng 9.1: tính dung lượng địa chỉ

kỹ thuật được sử dụng để thiết kế và quy trình chế tạo

Ví dụ 9.1: cho một chip nhớ có 12 chân địa chỉ và 4 chân dữ liệu Tìm:

ROM là loại bộ nhớ không mất dữ liệu khi mất nguồn điện cung cấp Vì lý do này, ROM

còn được gọi là bộ nhớ không bốc hơi (nonvolatile memory) ROM có nhiều loại như PROM,

EPROM, EEPROM, flash EPROM, mask ROM

PROM

PROM là bộ nhớ có thể lập trình bởi người sử dụng để ghi thông tin vào trong nó Đối với mỗi bit của PROM tương ứng có một cầu chì PROM được lập trình bằng cách đốt cháy

Trang 3

cầu chì bên trong nó đã bị thổi chảy không thể nối lại Vì lý do này, PROM được xem là bộ nhớ chỉ lập trình được một lần duy nhất Để lập trình cho nó, nó cần thiết bị đặc biệt được gọi

là bộ đốt cháy (burner) ROM hoặc bộ lập trình ROM

EPROM

EPROM đã được sáng chế để cho phép thay đổi nội dung của PROM sau khi nó đã đốt cháy Với EPROM, người dùng có thể lập trình chip nhớ và xoá nó hàng ngàn lần Để xoá

nội dung trong EPROM sẽ dùng thiết bị là UV-EPROM, với UV (ultraviolet) là ánh sáng cực

tím, thời gian để xoá dữ liệu có thể lên tới 20 phút Tất cả các chip EPROM đều có một cửa

sổ trên lưng của nó để người lập trình có thể chiếu bức xạ cực tím để xoá dữ liệu của nó và khi xoá sẽ thực hiện xoá toàn bộ dữ liệu Vì vậy, EPROM còn được gọi là UV-EPROM Hiện tại, độ tin cậy số chu kỳ ‘lập trình/xoá’ của bộ nhớ EPROM là 10,000 lần

Để lập trình cho EPROM phải thực hiện theo các bước trình tự sau:

(1) Các nội dung của nó phải được xoá Để xoá chip, đưa nó vào trong bộ thực hiện xoá

và chiếu bức xạ UV qua cửa sổ của nó trong khoảng 15-20 phút

(2) Lập trình chip Để lập trình chip, đặt nó vào socket trên bộ đốt cháy (bộ lập trình)

Bộ đốt cháy ROM sử dụng điện áp 12.5 V hoặc cao hơn, tuỳ thuộc vào loại EPROM Điện áp này được gọi là VPP trong ký hiệu thông số kỹ thuật của EPROM

(3) Sau khi lập trình xong, lấy EPROM gắn vào thiết bị đã thiết kế

VPP (V)

Trang 4

Ví dụ 9.3: tìm số chân dữ liệu và địa chỉ của ROM 27128

Giải pháp:

ROM 27128 có dung lượng địa chỉ 128K bits và có tổ chức 16Kx8 Vì vậy, ROM này có

8 chân dữ liệu và 214 = 16K, nên nó 14 chân địa chỉ

Hình 9.1: các cấu hình chân của họ ROM 27xx

EEPROM

EEPROM có nhiều ưu điểm hơn EPROM, việc xoá dữ liệu trong nó được thực hiện bằng xung điện trong thời gian rất nhỏ Hơn nữa, có thể lựa chọn byte nào đó trong nó để xoá

Ưu điểm chính của EEPROM là có thể lập trình hoặc xoá dữ liệu trong board hệ thống mà nó

đang hoạt động (không cần phải tháo rời nó ra như EPROM) Để thực hiện được điều này,

người thiết kế phải tổng hợp mạch cho phép lập trình vào board hệ thống

Hiện tại, độ tin cậy số chu kỳ ‘lập trình/xoá’ của bộ nhớ EEPROM là 100,000 lần

Bảng 9.3: một số EEPROM thực tế

Flash EPROM

EEPROM Dung lượng

địa chỉ Dung lượng dữ liệu

Thời gian truy xuất Số chân

VPP (V)

Trang 5

hoặc có thể nói chỉ diễn ra như ánh sáng loé lên nên nó có tên là flash và gọi chung là bộ nhớ

flash Sự khác nhau chủ yếu giữa EEPROM là dữ liệu bộ nhớ flash được xoá (hoặc được ghi vào), toàn bộ dữ liệu sẽ được xoá Trong khi đối với EEPROM, người lập trình có thể xoá

một phần hoặc byte được chọn Sau này, nội dung trong bộ nhớ flash được phân chia thành

các khối, vì vậy việc xoá (hoặc ghi) được thực hiện trên từng khối

Hiện tại, độ tin cậy số chu kỳ ‘lập trình/xoá’ của bộ nhớ flash là 100,000 lần

Bảng 9.4: một số Flash EEPROM thực tế

Mask ROM

Mask ROM là loại ROM mà nội dung trong nó được lập trình bởi nhà chế tạo IC Nói theo cách khác, nó không phải là ROM được lập trình bởi người dùng ROM này cũng chỉ lập trình được một lần duy nhất

Flash

EPROM

Dung lượng địa chỉ Dung lượng dữ liệu

Thời gian truy xuất Số chân

VPP (V)

Trang 6

Hình 9.2: các chân của SRAM 2Kx8

Trong hình 9.2, chân 𝑊𝐸̅̅̅̅̅ là chân cho phép ghi dữ liệu và Chân 𝑂𝐸̅̅̅̅ cho phép ngõ ra cho việc đọc và ghi dữ liệu tương ứng

Bảng 9.5: một số SRAM thực tế

SRAM Dung lượng

địa chỉ Dung lượng dữ liệu

Thời gian truy xuất

Số chân

VPP (V)

Đây là kiểu RAM không bốc hơi Nó cho phép CPU thực hiện đọc và ghi dữ liệu vào

nó, nhưng khi nguồn điện bị cắt thì nội dung trong NVRAM không bị mất NV-RAM là tổ hợp tốt nhất của RAM và ROM: khả năng đọc và ghi của RAM, cộng thêm khả năng không

Trang 7

mất dữ liệu của ROM Để không mất dữ liệu, mỗi chip NV-RAM được thiết kế bên trong có các thành phần sau:

(1) Nó sử dụng các tế bào SRAM hiệu suất cực cao (tiêu thụ công suất rất thấp) được

chế tạo bằng CMOS

(2) Nó sử dụng pin li-ti bên trong để làm nguồn điện dự phòng

(3) Nó sử dụng mạch điện điều khiển thông minh Nhiệm vụ chính của mạch điều khiển này để giám sát chân VCC liên tục để phát hiện nguồn điện cung cấp bên ngoài bị mất Nếu điện áp chân VCC rơi dưới điều kiện ngưỡng, mạch điều khiển tự động đóng mạch để sử dụng nguồn điện bên trong chip

Chính vì thế, RAM đắc hơn nhiều so với SRAM Khả năng lưu trữ dữ liệu của RAM khi không mất nguồn điện ngoài có thể lên đến 10 năm

Số chân

VPP (V)

DRAM

Vào năm 1970, Intel đã giới thiệu DRAM đầu tiên có khả năng lưu trữ 1024 bits và nó

sử dụng tụ điện để ghi nhớ từng bit Tuy nhiên, tụ đòi hỏi sự làm tươi liên tục do sự rĩ điện của tụ Việc sử dụng các tụ điện làm các tế bào nhớ trong DRAM sẽ làm cho kích thước tế bào nhớ mạng nhỏ hơn nhiều so với SRAM

Ưu điểm của DRAM: dung lượng cao, chi phí cho 1 bit rẻ hơn, công suất cho một bit thấp hơn so với SRAM

Nhược điểm DRAM: nó cần làm tươi định kỳ, trong thời gian làm tươi thì không thể truy xuất dữ liệu

Sau năm 1970, dung lượng lưu trữ của DRAM được bùng nổ: DRAM có 4K-bit (1973); 16K (1976); 64K, 256K, 1M và 4M (trong những năm của 1980); các chip theo tiêu chuẩn là 2G-bit (vào những năm của 2000)

Đóng gói DRAM

DRAM có một vấn đề về đóng gói một lượng lớn các tế bào bên trong chip với số chân thông thường để chỉ định địa chỉ Ví dụ chip 64Kx1 phải có 16 đường địa chỉ và 1 đường dữ liệu Vì vậy, nó cần 16 chân để định địa chỉ theo phương pháp truyền thống, hai chân nguồn

VCC và GND, các chân điều khiển đọc/ghi Nên việc sử dụng phương pháp truyền thống để truy xuất dữ liệu cần số lượng lớn các chân Vì thế, để giảm bớt số chân cần thiết cho địa chỉ,

Trang 8

người ta sử dụng phương pháp dồn kênh/phân kênh Phương pháp này được sử dụng để tách địa chỉ thành hai nửa và gửi mỗi nửa của địa chỉ trên cùng các chân địa chỉ Về cấu trúc bên trong DRAM, nó được phân chia thành ma trận vuông của hàng và cột Nửa đầu tiên của địa chỉ được gọi là hàng và nửa thứ hai được gọi là cột

Ví dụ về sự tổ chức của DRAM 64Kx1, nửa đầu tiên của địa chỉ được gửi thông qua 8 chân A0-A7 và được kích hoạt bằng chân 𝑅𝐴𝑆̅̅̅̅̅̅ (Row Address Strobe), các mạch chốt bên

trong DRAM sẽ chốt nửa đầu tiên của địa chỉ Sau đó, nửa thứ hai của địa chỉ được gửi cũng qua A0-A7 và được kích hoạt bằng chân ̅̅̅̅̅ (Column Address Strobe), tương tự thì mạch 𝐶𝐴𝑆chốt bên trong sẽ chốt nửa thứ hai của địa chỉ Điều này dẫn đến chỉ sử dụng 8 chân cho địa chỉ và thêm hai chân 𝑅𝐴𝑆̅̅̅̅̅̅ và 𝐶𝐴𝑆̅̅̅̅̅, nên tổng số chân địa chỉ chỉ là 10 (thay vì 16 chân)

Hình 9.3: sơ đồ chân của DRAM 256Kx1

Bảng 9.7: một số DRAM được sử dụng phổ biến

địa chỉ Dung lượng dữ liệu Số chân

Ví dụ 9.4: tìm số chân cấu hình riêng cho địa chỉ đối bộ chip DRAM 16Kx4 và SRAM 16Kx4

Giải pháp:

Vì 214 = 64K

Trang 9

Nên đối với DRAM, ta có 7 chân địa chỉ (A0 đến A6) và thêm hai chân khác là RAS và

CAS

Đối với SRAM, ta có 14 chân địa chỉ (A0 đến A13)

9.2 TRUY XUẤT BỘ NHỚ CHƯƠNG TRÌNH TRONG PIC18

PIC18F chứa 3 loại bộ nhớ: SRAM, flash và EEPROM SRAM sử dụng cho mục đích tổng quát bao gồm cả các thanh ghi chức năng EEPROM chỉ để sử dụng lưu trữ dữ liệu

Trong khi đó bộ nhớ flash được sử dụng chủ yếu để lưu trữ chương trình (mã chương trình),

nó cũng có thể lưu dữ liệu cố định như là các bảng tra Trong phần này, chúng ta sẽ nghiên cứu cách ghi vào bộ nhớ flash và truy xuất EEPROM trong PIC18

Có hai cách để lưu thông tin (mã hoặc dữ liệu) vào bộ nhớ flash hoặc xoá nội dung của

nó: sử dụng bộ lập trình bên ngoài như là PICKIT2; sử dụng các lệnh như là TBLWR

Bộ nhớ chương trình Flash là bộ nhớ có thể ghi, đọc và xóa trong quá trình hoạt động bình thường của VĐK Quá trình đọc bộ nhớ chương trình được thực thi một byte mỗi lần, hoạt động ghi vào bộ nhớ được thực hiện theo khối 32 byte mỗi lần Xóa bộ nhớ chương trình cũng được thực hiện theo khối 64 byte mỗi lần

Việc ghi hoặc xóa bộ nhớ chương trình sẽ dừng quá trình tìm lệnh cho đến khi quá trình hoàn tất Bộ nhớ chương trình cũng không thể truy cập trong quá trình ghi hoặc xóa, do

đó mã chương trình không thể thực thi Một bộ timer chương trình bên trong sẽ làm nhiệm vụ giới hạn thời gian cho việc ghi và xóa này

Các cấu trúc lệnh được ghi vào bộ nhớ chương trình không nhất thiết phải đúng, khi

đó trong quá trình thực thi, khi thấy có lệnh không hợp lệ thì VĐK sẽ thay thế chúng bằng lệnh NOP

Bộ nhớ chương trình có độ rộng 16 bit, trong khi bộ nhớ RAM chỉ có độ rộng 8 bit, do

đó bảng đọc và bảng ghi sẽ di chuyển dữ liệu giữa hai bộ nhớ này thông qua một thanh ghi 8

bit (TABLAT) Thanh ghi chốt bảng TABLAT nằm trong vùng SFR sẽ giữ các data 8 bit

trong quá trình di chuyển dữ liệu này

Bảng đọc sẽ lấy lại dữ liệu ra khỏi bộ nhớ chương trình và đặt nó vào trong bộ nhớ RAM Hoạt động này được mô tả trong hình 9.4

Trang 10

Hình 9.4: hoạt động bảng đọc

Chú thích 1: thanh ghi con trỏ bảng chỉ tới byte trong bộ nhớ chương trình

Bảng ghi sẽ lưu dữ liệu lấy từ RAM vào thanh ghi giữ data trong bộ nhớ chương trình thông qua một thủ tục ghi Hình 9.5 mô tả quá trình này

Hình 9.5: hoạt động bảng ghi

9.2.2 Các thanh ghi điều khiển

Các thanh ghi điều khiển được sử dụng để kết hợp với quá trình ghi bảng và đọc bảng Các thanh ghi này bao gồm:

 Thanh ghi EECON1

 Thanh ghi EECON2

 Thanh ghi TABLAT

 Thanh ghi TBLPTR

Trang 11

Thanh ghi EECON1 và EECON2

Thanh ghi EECON1 điều khiển việc truy cập vào bộ nhớ, trong khi đó thanh ghi EECON2 không phải là thanh ghi vật lý, nó được dùng riêng cho hoạt động ghi và xóa bộ nhớ Khi đọc thanh ghi EECON2 sẽ trả về giá trị là 0

Hình 9.6: thanh ghi EECON1

Bit 7 – EEPGD: bit chọn bộ nhớ chương trình flash hay EEPROM

1 = Truy cập bộ nhớ flash

0 = Truy cập bộ nhớ EEPROM

Bit 6 – CFGS: bit chọn thanh ghi cấu hình hay flash/EEPROM

1 = Truy cập các thanh ghi cấu hình bất chấp trạng thái EEPGD

0 = Truy cập bộ nhớ flash hoặc EEPROM

Bit 5 – không sử dụng, được đọc như bit ‘0’

Bit 4 – FREE: bit xóa bộ nhớ flash theo hàng

1 = Xóa hàng bộ nhớ Flash được đánh địa chỉ bởi TBLPTR khi có hoạt động WR kế

tiếp (tự động xóa khi quá trình xóa hoàn tất)

0 = Chỉ cho phép ghi dữ liệu

Bit 3 – WRERR: bit cờ báo lỗi flash/EEPROM

1 = Hoạt động ghi bị hủy đột ngột (có reset trong khi đang hoạt động hoặc khi quá trình ghi không đúng) Bit này được set bằng phần cứng

0 = Hoạt động ghi đã hoàn tất

Bit 2 – WREN: bit cho phép ghi flash/EEPROM

1 = Cho phép ghi theo chu kỳ vào flash/EEPROM

0 = Cấm ghi theo chu kỳ vào flash/EEPROM

Bit 1 – WR: bit điều khiển ghi

1 = Bắt đầu một chu kỳ ghi/xóa EEPROM hoặc một chu kỳ ghi hoặc xóa bộ nhớ

chương trình (Bit này được set bằng phần mềm và xóa bằng phần cứng khi hoạt động ghi hoàn tất)

0 = Chu kỳ ghi EEPROM hoàn tất

Bit 0 – RD: bit điều khiển đọc

Trang 12

1 = Bắt đầu đọc EEPROM (quá trình đọc thực hiện trong một chu kỳ Bit này được set bằng phần mềm và xóa bằng phần cứng khi hoạt động ghi hoàn tất RD không thể được set khi EEPGD = 1 hoặc CFGS = 1)

0 = Sẽ không bắt đầu đọc EEPROM

Thanh ghi con trỏ bảng (TABLE POINTER REGISTER - TBLPTR)

Thanh ghi con trỏ này sẽ đánh địa chỉ từng byte trong bộ nhớ chương trình, thanh ghi này bao gồm 3 thanh ghi nằm trong vùng SFR: Table Pointer Upper Byte, Table Pointer High

Byte và Table Pointer Low Byte (TBLPTRU:TBLPTRH:TBLPTRL) Ba thanh ghi này kết hợp

với nhau để tạo ra một con trỏ 22-bit : 21 bit thấp cho phép đánh địa chỉ lên đến 2 Mbyte bộ nhớ chương trình, bit thứ 22 cho phép truy cấp vào ID của linh kiện, ID của người dùng và các bit cấu hình

Thanh ghi con trỏ TBLPTR được sử dụng bởi các quá trình ghi TBLWT và đọc bảng

TBLRD Các quá trình này có thể cập nhật giá trị cho TBLWT theo một trong bốn cách (bảng 9.8) phụ thuộc vào hoạt động của bảng, quá trình cập nhật sẽ chỉ tác động đến 21 bit thấp của

TBLWT

Bảng 9.8: hoạt động của con trỏ bảng với các lệnh TBLRD và TBLWT

TBLPTR tăng trước khi đọc/ghi

Cấu trúc của con trỏ bảng

Khi TBLRD được thực thi, tất cả 22 bit của TBLPTR sẽ xác định byte nào trong bộ nhớ chương trình được đọc và đưa vào trong TABLAT

Khi TBLWT thực thi, 5 bit của TBLPTR (TBLPTR<4:0>) sẽ xác định thanh ghi nào

trong 32 thanh ghi dùng để lưu giữ dữ bộ nhớ chương trình được ghi vào Khi thời gian ghi

Trang 13

vào bộ nhớ chương trình bắt đầu (nhờ bit WR) thì 16 bit MSb của TBLPTR (TBLPTR<21:6>)

sẽ xác định khối 32 byte nào của bộ nhớ chương trình được ghi

Khi hoạt động xóa bộ nhớ chương trình thực thi, 16 bit MSb của TBLPTR (TBLPTR<21:6>) sẽ trỏ tới khối 64 byte nào trong bộ nhớ chương trìn sẽ được xóa, 6 bit LSb của TBLPTR (TBLPTR<5:0>) sẽ được bỏ qua

Hình 9.7 mô tả cấu trúc của TBLPTR theo hoạt động của bộ nhớ chương trình FLASH

Hình 9.7: cấu trúc của TBLPTR theo hoạt động của bộ nhớ chương trình

9.2.3 Đọc bộ nhớ chương trình

TBLRD sẽ lấy dữ liệu từ bộ nhớ chương trình và đặt nó vào trong RAM, bảng đọc sẽ thực hiện đọc 1 byte mỗi lần TBLPTR sẽ trỏ đến địa chỉ 1 byte trong vùng nhớ chương trình,

và đặt byte này vào TABLAT

Do bộ nhớ chương trình được tổ chức theo word (2 byte), do đó bit LSb củaTBLPTR đang chứa địa chỉ sẽ có vai trò chọn byte thấp hay cao trong word để đưa vào TABLAT

Hình 9.8: quá trình đọc bộ nhớ chương trình

Trang 14

Ví dụ 9.5: viết đoạn chương trình để đọc một word của bộ nhớ flash

Giải pháp:

MOVLW CODE_ADDR_UPPER ; Load TBLPTR with the base

MOVLW CODE_ADDR_HIGH MOVWF TBLPTRH

MOVLW CODE_ADDR_LOW MOVWF TBLPTRL

READ_WORD

MOVF TABLAT, W ; get data MOVWF WORD_EVEN

MOVF TABLAT, W ; get data MOVF WORD_ODD

9.2.4 Xóa bộ nhớ chương trình

Dung lượng bộ nhớ tối thiểu mà hoạt động này có thể xóa là 32 word hay 64 byte Khi

VĐK yêu cầu xóa, 16 bit MSb TBLPTR<21:6> sẽ trỏ đến khối cần xóa, các bit TBLPTR<5:0> của TBLPTR được bỏ qua

Thanh ghi EECON1 sẽ điều khiển hoạt động xóa Bit EEPGD được set để bộ nhớ chương trình được chọn, bit WREN được set để cho phép hoạt động ghi và bit FREE được

set để thực hiện hoạt động xóa

Trình tự xóa bộ nhớ chương trình như sau:

- Lấy địa chỉ của hàng cần xóa trong thanh ghi con trỏ bảng

- Thiết lập thanh ghi EECON1 cho hoạt động xóa:

Set bit EEPGD để chọn bộ nhớ chương trình

Clear bit CFGS để truy cập bộ nhớ chương trình

Set bit WREN để cho phép ghi

Set bit FREE để cho phép xóa

Trang 15

- Ghi nội dung 55h vào thanh ghi EECON2

- Ghi nội dung 0AAh vào thanh ghi EECON2

- Set bit WR, bắt đầu chu kỳ xóa hàng

- CPU sẽ ngừng chạy trong suốt chu kỳ xóa (khoảng 2 ms dùng timer nội)

- Cho phép ngắt trở lại

Ví dụ 9.6: viết đoạn chương trình để xoá một hàng bộ nhớ flash

Giải pháp:

Chương trình xóa như sau:

MOVLW CODE_ADDR_UPPER ; lấy nội dung TBLPTR

BSF EECON1, FREE ; cho phép xóa theo hàng

BSF EECON1, WR ; bắt đầu xóa (CPU ngừng chạy)

9.2.5 Ghi vào bộ nhớ chương trình

Đối với hoạt động ghi thì khối chương trình tối thiểu được ghi là 16 word hay 32 byte Khối chương trình theo từng byte hay từng word không được áp dụng trong quá trình này

Ngày đăng: 21/12/2017, 12:20

TỪ KHÓA LIÊN QUAN

w