Bộ nhớ flash chương trình vi điều khiển có thể được sử dụng để lưu trữ cấu hình người dùng không?


9

Nhiều bộ vi điều khiển, ví dụ PIC18F , có bộ nhớ chương trình flash: "Bộ nhớ chương trình Flash có thể đọc và ghi được trong quá trình hoạt động bình thường". Điều này có nghĩa là tôi có thể lưu trữ một số cấu hình người dùng trong bộ nhớ chương trình?

Câu trả lời:


12

Vâng, bạn có thể. Tôi đã làm việc này nhiều lần rồi.

Tuy nhiên, có một số nhược điểm liên quan đến việc sử dụng EEPROM riêng biệt:

  1. Số lượng ghi trọn đời vào bộ nhớ flash chương trình ít hơn đáng kể so với EEPROM dữ liệu.

  2. Bộ xử lý sẽ ra ngoài ăn trưa trong thời gian xóa và viết.

  3. Flash chương trình bị xóa trong các khối. Bạn không thể chỉ cập nhật một byte đơn. Tôi thường sử dụng một sơ đồ bộ nhớ cache khối để đối phó với điều này.


Hoàn hảo, dường như bạn bằng cách nào đó biết rằng câu hỏi của tôi thực sự là "tại sao cần EEPROM trong khi bạn có thể sử dụng bộ nhớ chương trình cho cả dữ liệu người dùng và chương trình" :)
student1

Olin, tất cả các Flash có bị xóa khi phiên bản phần sụn mới được ghi vào PIC không? Có cách nào tốt để ngăn cấu hình người dùng (hoặc dữ liệu hiệu chuẩn) trong Flash bị xóa trong quá trình tải xuống phần sụn không? Đây là về sự thuận tiện trong quá trình phát triển phần sụn. Tôi sẽ tưởng tượng rằng cấu hình người dùng sẽ được lưu trữ trong khối hoặc Flash cuối cùng.
Nick Alexeev

6
@Nick: Đó là tùy thuộc vào lập trình PIC bạn đang sử dụng. Nhiều người, bao gồm tất cả của tôi, thực hiện xóa hàng loạt, do đó dữ liệu hiệu chuẩn sẽ bị xóa sạch. Đôi khi tôi đã viết một ứng dụng lập trình đặc biệt đọc dữ liệu hiệu chuẩn, xóa số lượng lớn, sau đó viết dữ liệu hiệu chuẩn trở lại như một phần của quy trình lập trình thông thường. Một số lập trình viên Microchip có thể chỉ cập nhật các phần của bộ nhớ chương trình. Lưu ý rằng nếu bạn bật bảo vệ mã, lập trình viên phải xóa hàng loạt.
Olin Lathrop

Trên các bộ xử lý không thuộc Harvard (tôi đang nghĩ đến MSP430), bạn có thể sao chép mã vào RAM, nhảy vào RAM và chạy trong khi quá trình ghi / xóa flash diễn ra. Tôi đã sử dụng điều này cho bộ tải khởi động, để đồng thời ghi và nhận dữ liệu mới từ radio.
đánh dấu

@mark: Có, điều này cũng hoạt động trên PIC32, nơi cũng có thể thực thi từ RAM. Trong thực tế, đó là nhanh hơn.
Olin Lathrop

6

Nhiều PIC18 có bộ nhớ EEPROM, kích thước lên tới 1K. Thật không may, PIC18F46J50 bạn tham khảo không. Nếu EEPROM khả dụng, nó là lựa chọn tốt hơn nhiều nếu nó đủ lớn cho dữ liệu của bạn, vì EEPROM có tối thiểu 1.000.000 chu kỳ xóa / ghi và đèn flash chỉ 10.000.

PIC18, giống như hầu hết các bộ vi điều khiển khác, sử dụng kiến ​​trúc được gọi là kiến ​​trúc Harvard, nghĩa là có khu vực địa chỉ riêng biệt cho các chương trình và dữ liệu (nghĩa là bạn có thể có địa chỉ chương trình 4 và địa chỉ dữ liệu 4 và chúng không giống nhau). Do đó, bạn không thể đọc hoặc ghi bộ nhớ flash bằng các phương thức thông thường bằng ngôn ngữ C hoặc ngôn ngữ lắp ráp.

Thay vào đó, trong họ PIC18, bạn thiết lập một địa chỉ bắt đầu trong một thanh ghi 22 bit có tên TBLPTR. Để đọc byte từ flash, bạn sử dụng lệnh TBLRD. Có một tùy chọn để tự động tăng hoặc giảm địa chỉ sau khi đọc bạn không phải thực hiện thủ công.

Để ghi vào bộ nhớ flash, trước tiên bạn phải xóa một hoặc nhiều khối bộ nhớ flash 64 byte sẽ được ghi lại. Sau khi thiết lập lại địa chỉ bắt đầu trong TBLPTR và các giá trị trong một số thanh ghi khác để khởi tạo thao tác xóa, các ngắt bị vô hiệu hóa và sau đó bạn phải ghi 0x55 ngay sau 0xAA vào một thanh ghi; điều này mở khóa lệnh xóa và cần thiết để ngăn chặn mã errant vô tình xóa sạch bộ nhớ. Cuối cùng, lệnh thực sự xóa được thực thi, tiếp theo là kích hoạt lại các ngắt.

Ghi vào bộ nhớ flash tương tự như xóa, ngoại trừ kích thước khối nhỏ hơn. Việc ghi thực sự được thực thi bằng cách sử dụng lệnh TBLWT, cũng cho phép tăng / giảm tự động như lệnh TBLRD.

Ngoài việc lưu dữ liệu cấu hình, ghi vào bộ nhớ flash cho phép một người cập nhật chương trình cơ sở của họ trong trường bằng cách sử dụng "chương trình cơ sở qua không trung". Bạn cần có một khối chương trình cơ sở cố định, thường là khi bắt đầu bộ nhớ chương trình, có thể nhận được bản cập nhật từ mô-đun Bluetooth, Wi-Fi, mô-đun di động hoặc thậm chí là kết nối có dây và cập nhật đèn flash trên một điểm nhất định trong chương trình (ví dụ "hàng rào") với mã mới. Sau khi cập nhật hoàn tất, thiết lập lại được bắt đầu và mã mới được đưa vào sử dụng.

Nhiều bộ vi điều khiển khác ngoài họ PIC có khả năng cập nhật bộ nhớ flash; hầu hết sử dụng một số kết hợp các thanh ghi cấu hình, một con trỏ địa chỉ và các hướng dẫn đặc biệt để thực hiện tác vụ.


Phương pháp "firmware over the air" trông rất thú vị. Nó có loại bỏ sự cần thiết của Lập trình hệ thống (ISP) không?
student1

@ student1 Nó không loại bỏ nhu cầu lập trình chip ban đầu thông qua giao diện ISP, bởi vì bạn phải đặt một số phần sụn trên chip để có thể xử lý các bản cập nhật sau này. Các bộ vi điều khiển ATmega được sử dụng trên bo mạch Arduino đã có loại phần sụn này trên chúng, được gọi là Bootloader, đó là lý do tại sao bạn không cần sử dụng giao diện ISP để tải xuống bản phác thảo cho Arduino. Tuy nhiên, nếu bạn muốn tự cập nhật Bootloader, điều đó đòi hỏi phải có giao diện ISP. Bootloader này chỉ xử lý các bản cập nhật qua USB, vì vậy nó không thực sự là "firmware qua mạng".
tcrosley
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.