Jump to content

    

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

Recommended Posts

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

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

Share this post


Link to post
Share on other sites

AlanDrakes

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

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

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

Share this post


Link to post
Share on other sites

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

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

 

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

Share this post


Link to post
Share on other sites

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, но пока не хочу.

Edited by Димон Безпарольный

Share this post


Link to post
Share on other sites

2 minutes ago, Arlleex said:

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

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

Edited by Димон Безпарольный

Share this post


Link to post
Share on other sites

AlanDrakes
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 могут пересоздавать файлы конфигурации в процессе сборки.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.