Flash và EEPROM


14

Bảng dữ liệu Atmega16 nói rằng nó có

a) 16 Kbyte bộ nhớ chương trình Flash tự lập trình trong hệ thống và b) 512 Byte EEPROM.

Một vi điều khiển có thể có hai ROM riêng biệt có thể được lập trình thông qua công nghệ EEPROM và công nghệ Flash không?

Hoặc suy luận của tôi (như đã nêu ở trên) từ bảng dữ liệu là sai?

Tôi biết rằng chương trình của chúng tôi được lưu trữ trong bộ nhớ flash hơn tại sao mọi người sẽ cần EEPROM? Công dụng của nó là gì nếu chúng ta có bộ nhớ flash cho chương trình?

Ngoài ra, bất kỳ ai cũng có thể giải thích thuật ngữ "Tự lập trình trong hệ thống" là gì

Những gì tôi biết: Công nghệ Flash có thể ghi chương trình theo các khối dữ liệu trong khi EEPROM có thể ghi dữ liệu theo byte.

Câu trả lời:


21

Ngày nay, bộ nhớ Flash được sử dụng để giữ mã chương trình và EEPROM (Bộ nhớ chỉ đọc có thể xóa bằng điện) được sử dụng để giữ dữ liệu liên tục. Quay trở lại khoảng 30 năm trước, trước khi Flash xuất hiện, EEPROM đã được sử dụng để giữ mã chương trình.

Trên thực tế, ROM (Bộ nhớ chỉ đọc) xuất hiện đầu tiên, sau đó là PROM (ROM có thể lập trình, chỉ một lần), EPROM (PROM có thể xóa bằng đèn UV), EEPROM và cuối cùng là Flash. ROM vẫn được sử dụng cho các ứng dụng có khối lượng rất lớn, chi phí thấp (ví dụ: thiệp chúc mừng nói chuyện).

Sự khác biệt quan trọng với các bộ vi điều khiển hiện tại là bạn thường không thể thực thi mã ra khỏi EEPROM và thật khó xử khi các chương trình lưu trữ dữ liệu trong flash. (Dữ liệu được lưu trữ trong flash khi ví dụ bạn sử dụng từ khóa "const" trong khai báo dữ liệu hoặc xác định chuỗi, nhưng được trình biên dịch và trình liên kết xử lý phía sau hậu trường.)

Vùng EEPROM có thể được sử dụng để giữ cấu hình hoặc dữ liệu khác mà bạn muốn có sẵn trên các lần khởi động lại, kể cả nếu vi điều khiển bị mất nguồn và sau đó được cấp nguồn trở lại. Về mặt chức năng, bạn có thể nghĩ về EEPROM như một ổ cứng hoặc thẻ SD rất nhỏ.

Trên các bộ vi điều khiển không có EEPROM, có thể lưu trữ dữ liệu liên tục trong bộ nhớ flash, nhưng điều này trở nên khó khăn vì các bộ vi điều khiển không thực sự được thiết kế cho điều này và bạn phải tìm một vị trí đặc biệt sẽ không can thiệp vào mã chương trình và đặt nó sang một bên với các liên kết. Ngoài ra, như được đề cập dưới đây, bạn thường có thể cập nhật EEPROM nhiều lần hơn so với đèn flash.

Nếu bạn thực hiện dữ liệu chương trình trong flash, điều đó không có nghĩa là bạn có thể truy cập dữ liệu dưới dạng các biến trong chương trình C của mình, vì không có cách nào để nói với trình biên dịch nơi các biến này nằm trong mã của bạn (nghĩa là bạn không thể liên kết một const biến thành vùng flash này.) Vì vậy, việc đọc chúng phải được thực hiện thông qua bộ thanh ghi đặc biệt được sử dụng để ghi chúng. Lưu ý hạn chế này cũng áp dụng cho dữ liệu trong EEPROM, vì vậy nó không có lợi thế trong vấn đề này.

Để lập trình flash hoặc EEPROM, trước tiên phải xóa một khối bộ nhớ. Sau đó, nó được lập trình. Đối với flash, viết thường được thực hiện một khối tại một thời điểm cũng có. Đối với EEPROM, nó có thể được thực hiện bằng các khối hoặc một byte tại một thời điểm, tùy thuộc vào vi điều khiển.

Đối với cả flash và EEPROM, có số lần tối đa bạn có thể cập nhật chúng trước khi bạn sử dụng hết bộ nhớ. Con số này được đưa ra trong biểu dữ liệu dưới dạng giá trị được bảo đảm tối thiểu . EEPROM thường cao hơn nhiều so với bộ nhớ flash. Đối với flash, tôi đã thấy các số thấp tới 1000. Đối với EEPROM, tôi đã thấy các số cao tới 1.000.000.

Một lợi thế của EEPROM so với flash, là bạn có thể xóa chúng nhiều lần hơn bạn có thể xóa flash.

"Tự lập trình trong hệ thống" đơn giản là vi điều khiển có thể cập nhật đèn flash của chính nó trong khi chạy. Tính năng này thường được sử dụng để cập nhật mã trong trường. Mẹo nhỏ là bạn cần để lại một số mã trong hệ thống trong khi chương trình chính đang được cập nhật, được gọi là bộ nạp khởi động. Sơ đồ này được sử dụng trong hệ thống Arduino để lập trình chip.


Cảm ơn bạn đã phản hồi của bạn thưa ông. Vì vậy, để nhập dữ liệu vào EEPROM tôi sẽ cần một lập trình viên EEPROM như trong một lập trình viên USBASP để kết xuất chương trình bên trong bộ nhớ flash? Tôi có đúng không thưa ngài.
Jasser

1
@ Jasser Không, bạn không cần một lập trình viên bên ngoài. Bạn sẽ truy cập EEPROM từ trong chương trình của bạn. Sẽ có một bộ các thanh ghi bên trong ATmega, bằng cách viết cho chúng, sẽ cho phép bạn cập nhật EEPROM. Bạn cũng sẽ cần sử dụng các thanh ghi này để đọc ra khỏi EEPROM, vì nó sẽ không hiển thị trong bản đồ địa chỉ thông thường. Thông tin về cách xóa, viết và đọc EEPROM sẽ có trong biểu dữ liệu cho chip.
tcrosley

Vì chúng ta có thể viết hoặc đọc từ EEPROM bên trong vi điều khiển hơn vi điều khiển nên có một mạch để lưu trữ dữ liệu bên trong EEPROM và điều đó tương tự như lập trình EEPROM. Điều này một lần nữa dẫn tôi đến một câu hỏi khác là vì EEPROM có thể được kéo dài khoảng 100.000 lần so với sau đó nên chúng tôi không thể lưu trữ dữ liệu bên trong EEPROM thông qua các thanh ghi. Những tuyên bố này có ý nghĩa? @tcrosley
Jasser

1
@Jasser Đúng, có giới hạn về số lần bạn có thể cập nhật EEPROM. Điều này thường cao hơn nhiều (đôi khi là một thứ tự cường độ lớn hơn) so với số lần bạn có thể cập nhật đèn flash. Tôi nên đã đề cập rằng trong câu trả lời của tôi, và sẽ cập nhật nó. Số lượng bạn trích dẫn là tối thiểu được đảm bảo bởi nhà sản xuất chip; Tôi đã thực hiện một số thử nghiệm một lần với một con chip được chỉ định cho 100.000 lần ghi và nó đã vượt quá 500.000 trước khi phát hiện ra bất kỳ lỗi nào.
tcrosley

1
@ Jasser Vâng, khó hơn một chút để thiết lập dữ liệu trong flash. Ngoài ra, như đã thảo luận trong bản cập nhật của tôi cho câu trả lời của tôi, bạn có thể xóa và lập trình lại EEPROM nhiều lần (thường là 10 lần) so với đèn flash.
tcrosley

4

Tôi sẽ thêm một số thông tin vào câu trả lời xuất sắc của @tcrosley.

ATmega16 thực hiện một kiến trúc Harvard , tức là một cấu trúc liên kết hệ thống trong đó bộ nhớ dữ liệu được tách ra khỏi bộ nhớ chương trình. Trích dẫn đoạn có liên quan từ bảng dữ liệu Atmega16 (trang 8):

Để tối đa hóa hiệu suất và tính song song, AVR sử dụng kiến ​​trúc Harvard - với các bộ nhớ và xe buýt riêng cho chương trình và dữ liệu. Các hướng dẫn trong bộ nhớ chương trình được thực hiện với một đường ống cấp đơn. Trong khi một lệnh đang được thực thi, hướng dẫn tiếp theo được tìm nạp trước từ bộ nhớ chương trình. Khái niệm này cho phép các hướng dẫn được thực hiện trong mỗi chu kỳ đồng hồ. Bộ nhớ chương trình là bộ nhớ Flash có thể lập trình lại trong hệ thống.

Kiến trúc Harvard có lợi thế là không có sự tranh chấp giữa các chu kỳ tìm nạp lệnh và chu trình truy cập dữ liệu, vì dữ liệu và hướng dẫn không chia sẻ cùng một bus, như trong kiến ​​trúc PC thông thường của bạn.

Do đó, bộ nhớ flash được sử dụng làm bộ nhớ chương trình, trong khi bộ nhớ dữ liệu được phân chia giữa SRAM (đối với dữ liệu nhất thời, như ngăn xếp cuộc gọi hàm và heap - ví dụ: nếu bạn đang lập trình trong C) và EEPROM (để lưu trữ vĩnh viễn) .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.