Этот вопрос связан с самой депрограммированием AVR .
Информация о проекте: у
нас есть продукт с батарейным питанием, использующий ATMEGA644P. Приложение постоянно работает в спящем режиме и просыпается только раз в секунду (RTC) или при срабатывании одной из двух внешних линий прерывания.
Устройство оснащено довольно простым загрузчиком, который общается через UART (используя ИС интерфейса RS232). Он просто служит удобным способом обновления прошивки, так что не требуется аппаратный ISP-программист. (Загрузчик ожидает телеграмм с защитой контрольной суммы)
Устройства были спроектированы с внутренним отключением при отключении, потому что это удваивает энергопотребление и длительное время работы от батареи является обязательным (я полагаю, что следует использовать внешнее обнаружение отключения - повторная разработка находится в работе).
Проблема:
каждые несколько месяцев устройство просто перестает работать, на них не было никаких обновлений прошивки. Однако после дальнейшего изучения содержимое флэш-памяти этих устройств повреждено. Кроме того, батареи некоторых из этих устройств были все еще хорошими, но я не хочу исключать какую-то ситуацию с пониженным напряжением.
Это сравнение исходного содержимого флэш-памяти (слева) с поврежденным содержимым (справа):
Некоторые наблюдения:
- Поврежденный блок всегда состоит как минимум из одной флэш-страницы (256 байт) и выровнен по странице. Другими словами: затрагиваются только целые страницы, а не отдельные байты.
- Поврежденный контент большую часть времени читает 0xFF, но может также содержать некоторые другие значения или быть полностью «случайным».
- Маленькая полоска на левой стороне изображения показывает все затронутые области. Для этого устройства это примерно одна десятая от общего содержимого флэш-памяти.
- У нас было одно устройство, на котором была затронута только одна страница.
Вполне вероятно, что пониженное напряжение во время записи на флэш-память может повредить содержимое флэш-памяти. Однако это будет означать, что должны выполняться некоторые инструкции, чувствительные к флэш-памяти.
Возможно, контроллер случайно перезагружается из-за пониженного напряжения, и код загрузчика в это время работает совершенно непредсказуемо. Процитирую парня с другого форума относительно пониженного напряжения:
«Выполняются не только случайные инструкции из флэш-памяти, но и период случайных инструкций (нет гарантии, что код из флэш-памяти будет прочитан и интерпретирован правильно). Вместе с тем другие части mcu могут работать не так, как задумано, включая защиту механизмы «.
Вопрос (ы):
Считаете ли вы, что «случайное поведение при пониженном напряжении и выполнении некоторых инструкций, изменяющих данные на флэш-страницах» - объяснение является обоснованным? Если это так, то почему мы не видим подобные ошибки постоянно как причину некоторых программных проблем (переполнение стека, неверные указатели).
Есть ли у вас какие-либо идеи, что может привести к коррупции такого рода? Может ли это быть вызвано EMI / ESD?
Ответы:
Вы должны заметить, что вспышка не пишется, она стирается. Стертая вспышка полна 0xFF. Ваши первые 256 байтов полностью стерты, ваша третья 256-байтовая область частично стерта (у вас есть только от 0 до 1 бит-кадров от правильных данных до поврежденных).
Согласно данным таблицы , эта флэш-память стирается страницей (обычно я работаю с блоками стирания, большими, чем страницы). Как видно на странице 282, выполнить удаление страницы с помощью SPM довольно просто.
Вы можете быть заинтересованы в разделе 23.8.1 (Предотвращение повреждения Flash):
источник
BLB01
и друзья) установлены правильно! Они? «Смущает ... примечание к приложению ...» - Примечания к приложению общеизвестно ненадежны. Используйте их только для вдохновения; для гарантий положитесь на таблицы данных (которые также не безошибочны, но эй).Это хорошо известная проблема, которая затрагивает многие микроконтроллеры (не только Atmel). Аппаратные средства управления флэш-памятью повреждают или стирают часть памяти в условиях низкого напряжения. Простое решение состоит в том, чтобы включить защиту от отключения.
Вы должны всегда включать защиту от отключения на микроконтроллерах как само собой разумеющееся.
источник
Пониженное напряжение является очень вероятной причиной. Например, у меня когда-то был проект, в котором уровень отключения 1,8 В часто вызывал повреждение, и эти повреждения никогда не могли быть воспроизведены с уровнем отключения 3,5 В.
Обратите внимание, что чем быстрее работает процессор, тем более он чувствителен к проблемам с пониженным напряжением. Если для вас доступно снижение частоты процессора, возможно, стоит попробовать.
источник
EMC станет вашим главным врагом, если вы не будете следовать основным правилам проектирования печатных плат. Вот наиболее важные из моего собственного опыта: - блокировка конденсаторов на любой микросхеме, независимо от того, что производители сообщают вам в своих таблицах данных об адских схемах, поместите по крайней мере один от 100 пФ до 1 нФ на линии электропередач каждой микросхемы - проводящие заземления на слой каждой печатной платы как можно больше. Эти области должны контактировать через все слои через переходы настолько часто, насколько это возможно, сетка в 50 миль является хорошим значением. Подключите эти области к заземлению. - Никогда не оставляйте неподключенную (плавающую, без сигнала) медь на вашей печатной плате. Он действует как антенна и изобретательно наносит электромагнитное излучение на устройства - делает следы, несущие тактовые сигналы, как можно короче
Более подробную информацию можно найти в запросах поисковых систем, таких как "Руководство по разработке emc proof pcb".
источник