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 1CHƯƠ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 2Bả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 3cầ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 4Ví 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 5hoặ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 6Hì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 7mấ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 8ngườ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 9Nê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 10Hì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 11Thanh 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 121 = 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 13và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 14Ví 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