2015-04-08 2 views

ответ

3

Отказ от ответственности: Я m, отвечая на это из опыта, делающего такие вещи на ДРУГИХ чипах & toolchains. Я не знаю Киля или той конкретной части.

Зависит от того, что делает кнопка сброса.

Если он вызывает прерывание внешнего сброса непосредственно на MCU, вы можете сохранить ВСЕ значения RAM при сбросе и только ваши глобальные переменные обнуляли/повторно инициализировали с инициализацией времени выполнения C. Чтобы убедиться в этом, просмотрите разделы таблицы данных при перезагрузке, ОЗУ и, возможно, режиме ожидания/режима низкого энергопотребления. Большинство современных MCU предоставляют весь раздел верхнего уровня для каждой из этих тем.

Если он полностью сработал источник питания (как и во всех напряжениях, подающих чип, полностью удалены), тогда все ставки отключены. Если это так, я думаю, что единственным вариантом является встроенная EEPROM.

Вам нужно будет посмотреть схему и/или проверить регистры статуса возврата, чтобы получить окончательный ответ.

Итак, давайте предположим, что это сброс, что это позволит вам сохранить ОЗУ - Если это так, то типичные шаги идут ...

  1. Добавить специальный раздел (или разделы?) В файл директивы линкера который НЕ инициализируется C init.

  2. Используйте операторы #pragma, связанные с определением переменной, чтобы контролировать, куда он идет (т. Е. Вызывать этот специальный раздел).

  3. При запуске проверяйте регистры кода восстановления, чтобы узнать, содержит ли RAM достоверные данные.

Вам необходимо будет сделать аналогичные положения, чтобы ваш загрузчик не касался ОЗУ тоже, предполагая, что они представляют собой две отдельно скомпилированные программы.

В качестве альтернативы создания специального раздела, Киль может предоставить версию времени выполнения C код запуска, который не неявно «ноля» любых глобал и вместо только инициализацию глобал с начальным значением. Это обычно доступно как средство для улучшения времени запуска. Вам придется вникнуть в руководство по компиляции (или просто написать собственный код инициализации времени запуска C), чтобы сделать это, хотя ....

2

STM32L152ZE включает в себя 16-разрядную EEPROM и 128 байт резервных регистров.

EEPROM - это просто и не страдает от проблемы, связанной с тем, что STM32 создает собственную флеш-память, где он останавливает шину и, следовательно, выполняет код при записи и стирании блоков.

Резервные регистры находятся в отдельном домене питания, чем остальная часть устройства (вместе с RTC), и до тех пор, пока в этот домен сохраняется питание, данные могут быть сохранены. Существует механизм защиты, требующий определенной последовательности для чтения и записи этих регистров.

Если вы просто переживаете сброс, который вас интересует, я полагаю, что до тех пор, пока питание сохраняется через сброс (т. Е. Не сбрасывается силовым циклом), тогда сохраняется SRAM. Однако по умолчанию проекты Keil сконфигурированы для инициализации всех сегментов IRAM до нуля при запуске; вы можете зарезервировать раздел в настройках проекта как раздел «нет-init» и использовать расширение переменной __attribute__, чтобы явно создавать переменные в этом разделе или по конкретным адресам.

0

Если вы используете Keil IDE и не используете свой собственный файл конфигурации компоновщика, то это довольно просто. В разделе «Параметры цели-цели» есть раздел «Чтение/запись области памяти», здесь вы определяете новую область, в которой должны быть размещены все неинициализированные переменные. Например, start-0x20000000 и размер 0x20 и установите флажок «NoInit», если ваша оперативная память начинается с 0x20000000, и вы хотите сохранить первые 32 байта после сброса. Затем в разделе «Параметры цели - компоновщик» убедитесь, что опция «Использовать макет памяти из целевого диалогового окна» выбрана так, чтобы файл SCT-линкера был сгенерирован автоматически.

Теперь последний шаг состоит в том, чтобы поместить переменные в область 0x20000000 в область 0x20000020. Вы объявляете все такие переменные, которые должны быть неинициализированы в одном файле вашего проекта. Теперь щелкните правой кнопкой мыши имя файла из окна проекта и выберите опция «Параметры для файла« xxx.c »» и в присвоении памяти выберите область 0x20000000 для 0x20000020 для данных ZI. (Надеюсь, ваша неинициализированная переменная не будет присвоена никаким значением в коде во время объявления)

Смежные вопросы