Tham nhũng bộ nhớ flash AVR


11

Câu hỏi này có liên quan đến việc tự lập trình AVR .

Thông tin dự án:
Chúng tôi có một sản phẩm chạy bằng pin sử dụng ATMEGA644P. Ứng dụng chạy vĩnh viễn trong chế độ ngủ và chỉ thức dậy một lần một giây (RTC) hoặc khi một trong hai dòng ngắt bên ngoài được kích hoạt.

Thiết bị có bộ tải khởi động khá đơn giản, giao tiếp qua UART (sử dụng IC giao diện RS232). Nó chỉ phục vụ như một phương pháp thuận tiện để cập nhật chương trình cơ sở để không yêu cầu lập trình viên ISP phần cứng. (Trình tải khởi động dự kiến ​​telegram bảo mật tổng kiểm tra)

Các thiết bị được thiết kế với DISABLED bên trong màu nâu vì nó tăng gấp đôi mức tiêu thụ năng lượng và thời lượng pin dài là bắt buộc (tôi đoán rằng nên sử dụng phát hiện ra bên ngoài màu nâu - thiết kế lại đang hoạt động).

Vấn đề:
Cứ sau vài tháng, một thiết bị chỉ dừng hoạt động, KHÔNG có bản cập nhật firmware nào được thực hiện trên các thiết bị đó. Tuy nhiên, sau khi kiểm tra thêm, nội dung flash của các thiết bị đó dường như bị hỏng. Hơn nữa, pin của một số thiết bị đó vẫn còn tốt, nhưng tôi không muốn loại trừ một số tình huống dưới điện áp.

Đây là so sánh nội dung flash ban đầu (trái) với nội dung bị hỏng (phải):

So sánh flash

Một số quan sát:

  • Một khối bị hỏng luôn bao gồm ít nhất một trang flash (256 byte) và được căn chỉnh trang. Nói cách khác: Chỉ toàn bộ trang bị ảnh hưởng, không phải byte đơn.
  • Nội dung bị hỏng đọc 0xFF hầu hết thời gian, nhưng cũng có thể chứa một số giá trị khác hoặc hoàn toàn "ngẫu nhiên".
  • Thanh nhỏ ở bên trái của hình ảnh cho thấy tất cả các khu vực bị ảnh hưởng. Đối với thiết bị này, nó chiếm khoảng một phần mười của tổng số nội dung flash.
  • Chúng tôi có một thiết bị chỉ có một trang bị ảnh hưởng.

Điều hoàn toàn hợp lý là tình trạng dưới điện áp trong khi ghi bộ nhớ flash có thể làm hỏng nội dung flash. Tuy nhiên, điều này có nghĩa là một số lệnh nhạy cảm flash phải được thực thi.

Có thể bộ điều khiển đang khởi động lại ngẫu nhiên do điện áp thấp và mã bộ tải khởi động hoạt động hoàn toàn không thể đoán trước trong thời gian này. Để trích dẫn một số người từ một diễn đàn khác liên quan đến điện áp thấp:

"Không chỉ các lệnh ngẫu nhiên từ flash được thực thi, mà là thời gian hướng dẫn ngẫu nhiên (không có gì đảm bảo rằng mã từ flash sẽ được đọc và giải thích chính xác). Cùng với các phần khác của mcu có thể không hoạt động như được thiết kế, bao gồm cả bảo vệ cơ chế. "

Câu hỏi:
Bạn có nghĩ rằng "hành vi ngẫu nhiên trong khi điện áp thấp và thực hiện một số hướng dẫn thay đổi dữ liệu trong các trang flash" - giải thích là âm thanh? Nếu đó là trường hợp, tại sao chúng ta không thấy loại lỗi này mọi lúc chỉ là nguyên nhân của một số vấn đề phần mềm (tràn ngăn xếp, con trỏ không hợp lệ).

Bạn có ý tưởng nào khác có thể gây ra loại tham nhũng này không? Điều này có thể được gây ra bởi EMI / ESD?


Trong khối thứ hai trong ví dụ của bạn, có bit nào đi từ 1-> 0 hoặc tất cả chúng đều chuyển tiếp 0-> 1 không? Tôi có một tập lệnh tính toán điều này, nhưng tôi sẽ không nhập tất cả các số từ ảnh chụp màn hình của bạn.
đánh dấu

@markrages: Từ việc nhìn vào nó, chỉ 0-> 1. Một câu trả lời cũng chỉ ra rằng, nó trông giống như một phần xóa trong đó không phải tất cả các bit được lật lên 1. Cảm ơn đã quan sát.
Rev1.0

Câu trả lời:


11

Bạn nên chú ý rằng đèn flash không được ghi, nó bị xóa. Một đèn flash bị xóa có đầy 0xFF. 256 byte đầu tiên của bạn bị xóa hoàn toàn, vùng 256 byte thứ ba của bạn bị xóa một phần (bạn chỉ có 0 đến 1 bitflips từ dữ liệu chính xác đến một lỗi bị hỏng).

Theo bảng dữ liệu , đèn flash này có thể xóa trang (tôi thường làm việc với các khối xóa lớn hơn các trang). Như đã thấy trong trang 282, Thực hiện xóa trang bằng SPM khá dễ dàng.

Bạn có thể quan tâm theo phần 23.8.1 (Ngăn chặn tham nhũng Flash):

Một lỗi chương trình Flash có thể được gây ra bởi hai tình huống khi điện áp quá thấp. Đầu tiên, một chuỗi ghi thông thường vào Flash yêu cầu điện áp tối thiểu để hoạt động chính xác. Thứ hai, CPU có thể thực thi các lệnh không chính xác, nếu điện áp cung cấp để thực hiện các lệnh quá thấp. Flash tham nhũng có thể dễ dàng tránh được bằng cách làm theo các khuyến nghị thiết kế này (một là đủ):

  1. Nếu không cần cập nhật Boot Loader trong hệ thống, hãy lập trình các bit Khóa Boot Loader để ngăn chặn mọi cập nhật phần mềm Boot Loader.
  2. Giữ cho thiết bị AVR RESET hoạt động (ở mức thấp) trong thời gian điện áp nguồn không đủ.
    Điều này có thể được thực hiện bằng cách kích hoạt Bộ phát hiện màu nâu bên trong (BOD) nếu độ tuổi hoạt động phù hợp với mức phát hiện. Nếu không, có thể sử dụng mạch bảo vệ đặt lại VCC thấp bên ngoài. Nếu quá trình thiết lập lại xảy ra trong khi hoạt động ghi đang diễn ra, thao tác ghi sẽ được hoàn thành miễn là điện áp nguồn cung cấp đủ.
  3. Giữ lõi AVR ở chế độ ngủ Tắt nguồn trong thời gian VCC thấp. Điều này sẽ ngăn CPU cố gắng giải mã và thực hiện các hướng dẫn, bảo vệ hiệu quả Thanh ghi SPMCSR và do đó Flash không bị ghi không chủ ý.

Quan sát của bạn về việc xóa một phần trên trang thứ ba có vẻ hợp lý. Về văn bản Atmel: Tất cả chúng ta đều đồng ý rằng HĐQT dường như là bắt buộc. Nhưng tôi vẫn không chắc chắn về nguyên nhân CHÍNH XÁC của tham nhũng. Không phải là rất khó để bộ điều khiển chỉ thực hiện (vì điện áp thấp) hướng dẫn cụ thể này để xóa một trang flash? Ý tôi là, điều này thậm chí sẽ phải xảy ra trong quá trình thực thi mã bộ tải khởi động, vì flash chỉ có thể ghi được từ đó. Và nó đòi hỏi một trình tự cụ thể.
Rev1.0

3
Không thể giải thích nguồn gốc chính xác của tham nhũng: khi Vcc của bạn giảm, nó trở nên quá thấp để bão hòa hoàn toàn một bóng bán dẫn với một bóng bán dẫn khác. MCU về cơ bản là một phương trình logic rất lớn. Nếu các bóng bán dẫn của bạn ngừng hoạt động như các công tắc logic, bạn thay đổi phương trình này. Vì bóng bán dẫn đầu tiên hoạt động sai phụ thuộc vào pha tạp ASIC wafer và nhiễu loạn điện từ bên ngoài, bạn không thể dự đoán điều gì sẽ xảy ra. Để giải quyết vấn đề này, khi bạn thiết kế ASIC, bạn có thể thêm một phần tương tự tắt phần kỹ thuật số trước khi hoạt động sai. Nhưng nó làm tăng toàn bộ chi phí ASIC.
Jacen

Nhầm lẫn rằng ứng dụng lưu ý trạng thái bảo vệ ngoài màu nâu bên ngoài AVR180 : "Lưu ý rằng nội dung bộ nhớ chương trình Flash bên trong của AVR® không bao giờ bị ảnh hưởng bởi điện áp nguồn không đủ". Hơn nữa: "Vì CPU AVR không có khả năng ghi vào bộ nhớ chương trình của chính nó, nên nội dung bộ nhớ Chương trình Flash bên trong không bao giờ bị ảnh hưởng bởi tình huống mất điện." - IMO Atmel chỉ bỏ qua rằng có một cái gì đó giống như bộ tải khởi động đã thay đổi flash mem.
Rev1.0

@ Rev1.0 Vâng, rất khó xảy ra ... đó là lý do tại sao bạn chỉ nhìn thấy nó trên một thiết bị mỗi vài tháng, thay vì tất cả các thiết bị mọi lúc.
dùng253751

"Ý tôi là, điều này thậm chí sẽ phải xảy ra trong quá trình thực thi mã bộ tải khởi động, vì flash chỉ có thể ghi được từ đó." - Điều đó chỉ đúng nếu các bit khóa khởi động ( BLB01và bạn bè) được đặt phù hợp! Có phải họ không? "Khó hiểu ... ghi chú ứng dụng ..." - Ghi chú ứng dụng nổi tiếng là không đáng tin cậy. Chỉ sử dụng chúng cho cảm hứng; để đảm bảo, hãy dựa vào datasheets (cũng không thể sai được nhưng hey).
marcelm

4

Đây là một vấn đề nổi tiếng và ảnh hưởng đến nhiều bộ vi điều khiển (không chỉ Atmel). Phần cứng điều khiển bộ nhớ flash làm hỏng hoặc xóa một phần bộ nhớ trong điều kiện điện áp thấp. Cách khắc phục đơn giản là cho phép bảo vệ màu nâu.

Bạn nên luôn luôn kích hoạt bảo vệ màu nâu trên vi điều khiển là chuyện đương nhiên.


3
Bạn có bất kỳ tài liệu tham khảo vững chắc nào về CÁCH và TẠI SAO "phần cứng điều khiển bộ nhớ làm hỏng hoặc xóa một phần bộ nhớ trong điều kiện điện áp thấp" không? Có rất nhiều cuộc thảo luận diễn đàn liên quan đến tham nhũng flash nhưng nó hầu như không bao giờ đi đến một cái gì đó vững chắc, đó là lý do tại sao tôi hỏi ở đây.
Rev1.0

Đây có phải là sự cố dưới điện áp trong chip hay có liên quan đến việc thực hiện chương trình sai / ngẫu nhiên trong phần bộ nạp khởi động mà AFAIK chỉ có thể sửa đổi FLASH. Nếu thứ hai là vấn đề vô hiệu hóa thực thi bootloader thông qua FUSE sẽ giải quyết vấn đề.
TMa

Tôi nhớ đã đọc về nó trong lỗi của ít nhất một vi MEGA.
người dùng

3

Điện áp dưới là một nguyên nhân rất có thể. Ví dụ, tôi đã từng có một dự án trong đó mức độ đen 1,8 V thường xuyên gây ra tham nhũng và những tham nhũng này không bao giờ có thể được sao chép với mức độ 3,5V.

Lưu ý rằng bộ xử lý chạy càng nhanh thì càng nhạy cảm với các vấn đề dưới điện áp. Nếu giảm tần số CPU là một tùy chọn có sẵn cho bạn, nó có thể đáng để thử.


1
Cảm ơn về câu trả lời. Chúng tôi đã kết thúc bằng cách sử dụng một máy dò nâu điện cực thấp bên ngoài và không có vấn đề tham nhũng kể từ đó.
Rev1.0

0

EMC sẽ là kẻ thù lớn nhất của bạn, nếu ai đó không tuân theo các quy tắc chính của thiết kế PCB. Dưới đây là những điều quan trọng nhất theo kinh nghiệm của riêng tôi: - chặn tụ điện trên bất kỳ IC nào, bất kể nhà sản xuất nói gì với bạn trong bảng dữ liệu của họ về sơ đồ vô sinh, đặt ít nhất một trong khoảng 100pF - 1nF trên mỗi đường dây điện của IC mỗi lớp PCB càng nhiều càng tốt. Những khu vực đó sẽ được liên lạc qua tất cả các lớp thông qua vias thường xuyên như sở hữu, một mạng lưới 50 triệu là một giá trị tốt. Kết nối các khu vực với tín hiệu mặt đất. - Không bao giờ để đồng không được kết nối (nổi, không có tín hiệu được kết nối) trong PCB của bạn. Nó hoạt động như một ăng-ten và đặt bức xạ điện từ lên các thiết bị một cách dứt khoát - tạo ra các dấu vết mang tín hiệu đồng hồ càng ngắn càng tốt

Tìm thêm chi tiết theo yêu cầu của công cụ tìm kiếm như "hướng dẫn thiết kế pcb bằng chứng emc"

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.