Перейти к содержанию
    

STM32L476 Botloader и хранение данных в необнуляемой области ОЗУ

Написал бутлоадер. Основной прошивке требуется хранение данных в необнуляемой области ОЗУ. Прописал эту область в Скаттере. Без бутлоадера все чудно работало. Сброс не портил данные. Но при применении бутлоадера данные терлись при перезагрузки прошивки.

Изменил бутлоадер - прописал в скаттере такую же область и заработало. Память больше не портится при перезагрузки прошивки. Хотел бы узнать - какие тут подводные ками? Так вообще можно делать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Посмотрите в сторону блока памяти в RTC. Он не обнуляется (и не меняется) штатно без ведома процессора (и в частности, без сброса бита "Отключить защиту бэкап-области".

2. Если хотите хранить данные в отдельной области памяти - укажите в линкер-скрипте её как запрещённую. Скажем, если в чипе 128кБ RAM - измените Linker-скрипт так, чтобы и загрузчик и "приложение" не могли разместить данные в этой области, ограничиваясь, скажем, 120кБ. В этом случае компилятор и линкер не будут устанавливать указатель стэка на последние 8кБ памяти, соответственно, начальная инициализация тоже не тронет эти адреса. (Хотя это не ваш случай, в этом чипе память разделена на сегменты в разных адресах).

3. STM32L47x умеет защиту страниц SRAM2 (0x10000000~0x10007FFF) страницами по 1кБ. RM0351 2.4.2
SRAM1 (0x20000000~0x2001FFFF) при этом доступна на чтение и запись.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Backup регистры уже использую, но объем маловат.

2. можно ли (и надо ли?) совместить пункты 2 и 3?

 

Спасибо за ответы они уже помогли мне.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, AlanDrakes said:

Если хотите хранить данные в отдельной области памяти - укажите в линкер-скрипте её как запрещённую.

В итоге вот что получилось:

 

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00100000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00100000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00018000  {  ; RW data
   .ANY (+RW +ZI)
  }

  RW_IRAM2 0x10000000 UNINIT 0x0000400  { ;no init section
  *(.noinit )}

  RW_IRAM3 0x10000400 0x00008000 - 0x3FF  {
   .ANY (+RW +ZI)

  }
}

Но ключа для линкера чтобы пометить область как неиспользуемую пока не нашел. Судя по MAP файлу, линкер отдает предпочтение области IRAM1 располагая там переменные. Область IRAM3 не используется линкером. Могу прописать явно модули в IRAM3, но пока не хочу.

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, Arlleex said:

отрезать по адресам;

Так вроде выше привел скаттер - там адреса явно указаны. Имеется ввиду секция RW_IRAM2

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

30 minutes ago, Arlleex said:

Ну все, ничего туда компилятор сам не поместит.

Спасибо огромное.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 часов назад, Димон Безпарольный сказал:

В итоге вот что получилось:

 


; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00100000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00100000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00018000  {  ; RW data
   .ANY (+RW +ZI)
  }

  RW_IRAM2 0x10000000 UNINIT 0x0000400  { ;no init section
  *(.noinit )}

  RW_IRAM3 0x10000400 0x00008000 - 0x3FF  {
   .ANY (+RW +ZI)

  }
}

Но ключа для линкера чтобы пометить область как неиспользуемую пока не нашел

Удалите из этого файла секции RW_IRAM2, RW_IRAM3 и линкер просто не будет знать о их существовании.

Во всяком случае, так работает с arm-none-eabi-ld (кросс-компилятор для STM32* из-под линуха). Некоторые IDE могут пересоздавать файлы конфигурации в процессе сборки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...