Сохранить некоторые значения ОЗУ при сбросе кортекса м3
Есть ли способ сохранить некоторые значения оперативной памяти или глобальные переменные после нажатия на кнопку сброса на доске или в Киле
Я использую STM32L152ZE
3 ответа
Отказ от ответственности: я отвечаю на это из опыта, делающего подобные вещи на ДРУГИХ фишках и наборах инструментов. Я не знаю Киля или той конкретной части.
Зависит от того, что делает кнопка сброса.
Если он запускает внешнее прерывание сброса непосредственно на MCU, вы можете сохранить ВСЕ значения ОЗУ при сбросе, и только ваши глобальные переменные обнуляются / переинициализируются с инициализацией C на этапе выполнения. Чтобы убедиться в этом, обратитесь к разделам таблицы данных по сбросу, оперативной памяти и, возможно, режимам ожидания / низкого энергопотребления. Большинство современных MCU дают целый раздел верхнего уровня для каждой из этих тем.
Если он полностью сброшен (так как все напряжения, подаваемые на чип, полностью сняты), то все ставки отключены. Если это так, я думаю, что единственный вариант - встроенная ЭСППЗУ.
Вам нужно будет посмотреть схему и / или проверить регистры состояния сброса, чтобы получить окончательный ответ.
Итак, давайте предположим, что это сброс, который позволяет вам сохранить оперативную память - если это так, то типичные шаги идут...
Добавьте специальный раздел (или разделы?) В ваш файл директивы компоновщика, который НЕ инициализируется во время выполнения C init.
использование
#pragma
операторы, окружающие / связанные с определением переменной, чтобы контролировать, куда она идет (т. е. вызывать этот специальный раздел).При запуске проверьте регистры кода сброса, чтобы узнать, содержит ли RAM правильные данные.
Вам нужно будет сделать аналогичные условия, чтобы ваш загрузчик тоже не касался ОЗУ, предполагая, что это две отдельно скомпилированные программы.
В качестве альтернативы созданию специального раздела Kiel может предоставить версию кода запуска среды выполнения C, которая неявно "обнуляет" глобальные переменные, а вместо этого только инициализирует глобальные переменные с начальным значением. Это обычно доступно как средство для улучшения времени запуска. Вам нужно будет зайти в руководство по компилятору (или просто написать свой собственный код инициализации C-runt time), чтобы сделать это...
STM32L152ZE включает в себя 16 КБ EEPROM и 128 байт резервных регистров.
ЭСППЗУ является именно этим и не страдает от проблемы, связанной с тем, что STM32 имеет запись своей собственной флэш-памяти, где он останавливает шину и, следовательно, выполнение кода при записи и стирании блоков.
Резервные регистры находятся в отдельном домене питания, чем остальная часть устройства (вместе с RTC), и пока питание сохраняется в этом домене, данные могут сохраняться. Существует механизм защиты, требующий определенной последовательности для чтения и записи этих регистров.
Если это просто переживание сброса, в котором вы заинтересованы, то я полагаю, что пока питание поддерживается через сброс (т. Е. Не происходит сброс по циклу питания), то SRAM сохраняется. Однако по умолчанию проекты Keil настроены на инициализацию всех сегментов IRAM до нуля при запуске; Вы можете зарезервировать раздел в настройках проекта как раздел "без инициализации" и использовать переменную __attribute__
расширение для явного создания переменных в этом разделе или по определенным адресам.
Если вы используете Keil IDE и не используете свой собственный файл конфигурации компоновщика, то это довольно просто. В "Настройках цели - Цель" есть раздел Область чтения / записи памяти, здесь вы определяете новую область, в которую должны быть помещены все неинициализированные переменные. Как например start- 0x20000000 и размером 0x20 и установите флажок "NoInit", если ваша RAM начинается с 0x20000000 и вы хотите сохранить первые 32 байта после сброса. Затем в разделе "Параметры цели - компоновщик" убедитесь, что выбран параметр "Использовать макет памяти из диалогового окна цели", чтобы файл компоновщика компоновки генерировался автоматически.
Теперь последний шаг - поместить переменные в область от 0x20000000 до 0x20000020. Вы объявляете все такие переменные, которые должны быть неинициализированы, в одном файле вашего проекта. Теперь щелкните правой кнопкой мыши имя файла в окне проекта и выберите параметр "Параметры для файл "xxx.c" "и в назначении памяти выберите область от 0x20000000 до 0x20000020 для данных ZI. (Надеюсь, что вашей неинициализированной переменной не назначено никакого значения в коде во время объявления)