STM32L запись в EEPROM при компиляции
-
Alex-Elektron
- Встал на лапы
- Сообщения: 113
- Зарегистрирован: Сб янв 11, 2014 21:25:55
STM32L запись в EEPROM при компиляции
Доброго времени суток! Ранее для записи переменной по конкретному адресу во Flash при компиляции использовал такую конструкцию:
MyVariable[] __attribute__((at(0x08002000)))={0, 4, 3, 55, 32};
Вопрос, можно ли с использованием подобной директивы записать массив данных/переменную в область EEPROM при компиляции?
MyVariable[] __attribute__((at(0x08002000)))={0, 4, 3, 55, 32};
Вопрос, можно ли с использованием подобной директивы записать массив данных/переменную в область EEPROM при компиляции?
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32L запись в EEPROM при компиляции
При компиляции ничего в микроконтроллер не пишется.
-
BlackKilkennyCat
- Собутыльник Кота
- Сообщения: 2905
- Зарегистрирован: Ср ноя 29, 2017 06:58:50
Re: STM32L запись в EEPROM при компиляции
А еще прочитайте http://www.keil.com/support/man/docs/ar ... 981140.htm, а то создается впечатление, что MyVariable[] __attribute__((at(0x08002000)))={0, 4, 3, 55, 32}; - это просто от балды.
Меня здесь больше нет
Re: STM32L запись в EEPROM при компиляции
В STM32 нет как таковой EEPROM, это просто выделенная область FLASH. Так что может быть и да.
Надо посмотреть, как указаны границы FLASH в файле линкера. Если область EEPROM туда входит, то должно получиться. Можно попробовать завести отдельный сегмент для EEPROM и располагать переменные там. Главное чтобы линкер положил данные куда надо, и софт для программирования это правильно понял.
Но я бы просто из программы записывал при первом старте, тем более, что механизм возврата к настройкам по-умолчанию всегда полезен.
Надо посмотреть, как указаны границы FLASH в файле линкера. Если область EEPROM туда входит, то должно получиться. Можно попробовать завести отдельный сегмент для EEPROM и располагать переменные там. Главное чтобы линкер положил данные куда надо, и софт для программирования это правильно понял.
Но я бы просто из программы записывал при первом старте, тем более, что механизм возврата к настройкам по-умолчанию всегда полезен.
Последний раз редактировалось YS Чт июл 02, 2020 14:12:56, всего редактировалось 1 раз.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: STM32L запись в EEPROM при компиляции
[uquote="YS",url="/forum/viewtopic.php?p=3862226#p3862226"]В STM32 нет как таковой EEPROM, это просто выделенная область FLASH.[/uquote]
Вообще-то в серии L есть именно EEPROM.
Вообще-то в серии L есть именно EEPROM.
-
Alex-Elektron
- Встал на лапы
- Сообщения: 113
- Зарегистрирован: Сб янв 11, 2014 21:25:55
Re: STM32L запись в EEPROM при компиляции
[uquote="YS",url="/forum/viewtopic.php?p=3862226#p3862226"]В STM32 нет как таковой EEPROM, это просто выделенная область FLASH. Так что может быть и да.
Надо посмотреть, как указаны границы FLASH в файле линкера. Если область EEPROM туда входит, то должно получиться. Можно попробовать завести отдельный сегмент для EEPROM и располагать переменные там. Главное чтобы линкер положил данные куда надо, и софт для программирования это правильно понял.
Но я бы просто из программы записывал при первом старте, тем более, что механизм возврата к настройкам по-умолчанию всегда полезен.[/uquote]
EEPROM конечно же есть в L-серии. Но я посмотрел на размер секторов FLASH, они довольно мелкие, выделил пару для хранения данных и забил на EEPROM.
То, что вы не пробовали так делать, не значит, что эта конструкция не работает.
Надо посмотреть, как указаны границы FLASH в файле линкера. Если область EEPROM туда входит, то должно получиться. Можно попробовать завести отдельный сегмент для EEPROM и располагать переменные там. Главное чтобы линкер положил данные куда надо, и софт для программирования это правильно понял.
Но я бы просто из программы записывал при первом старте, тем более, что механизм возврата к настройкам по-умолчанию всегда полезен.[/uquote]
EEPROM конечно же есть в L-серии. Но я посмотрел на размер секторов FLASH, они довольно мелкие, выделил пару для хранения данных и забил на EEPROM.
BlackKilkennyCat писал(а):А еще прочитайте http://www.keil.com/support/man/docs/ar ... 981140.htm, а то создается впечатление, что MyVariable[] __attribute__((at(0x08002000)))={0, 4, 3, 55, 32}; - это просто от балды.
То, что вы не пробовали так делать, не значит, что эта конструкция не работает.
Re: STM32L запись в EEPROM при компиляции
Ну, они просто так пишут.Вообще-то в серии L есть именно EEPROM.
Эта так называемая EEPROM расположена непосредственно за FLASH, управляется тем же контроллером и стирать ее можно не менее чем по слову за раз (ну хорошо хоть не по 4 кБ). Один байт стереть и перезаписать нельзя, что явно говорит о том, что это не настоящая EEPROM.
Есть у меня подозрения, что из этой так называемой EERPOM и код запустить можно.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
-
BlackKilkennyCat
- Собутыльник Кота
- Сообщения: 2905
- Зарегистрирован: Ср ноя 29, 2017 06:58:50
Re: STM32L запись в EEPROM при компиляции
[uquote="Alex-Elektron",url="/forum/viewtopic.php?p=3862233#p3862233"]То, что вы не пробовали так делать, не значит, что эта конструкция не работает.[/uquote]
Вы сделали странный и глупый вывод.
Вы сделали странный и глупый вывод.
Меня здесь больше нет
Re: STM32L запись в EEPROM при компиляции
Значит память 32-ух битная (неудивительно учитывая разрядность ядра).YS писал(а):стирать ее можно не менее чем по слову за раз
Это ни о чем не говорит.YS писал(а):Один байт стереть и перезаписать нельзя, что явно говорит о том, что это не настоящая EEPROM.
Память 32-ух битная, а не 8-ми битная.
Re: STM32L запись в EEPROM при компиляции
При компиляции разумеется ничего в МК не пишется. Пишется при загрузке. Но! Есть такая гадость, что EEPROM после сброса залочена и в нее нельзя писать сразу. Да, не эмуляция, а самая настоящая EEPROM есть в некоторых из "элек". Она сделана на той же флеши, но с отдельными адресами и с большим гарантированным числом перезаписей. Ее можно писать без стирания, хоть побайтно, хоть пословно, без разницы. Она работает именно как EEPROM.
Чтобы при прошивке записать в EEPROM, придется в скрипте дебагера предварительно разблокировать запись двумя командами:
set *0x40023c0c = 0x89ABCDEF
set *0x40023c0c = 0x02030405
Чтобы при прошивке записать в EEPROM, придется в скрипте дебагера предварительно разблокировать запись двумя командами:
set *0x40023c0c = 0x89ABCDEF
set *0x40023c0c = 0x02030405
Почти все плюсы в свою карму и в рейтинги сообщения поставил себе сам, своими же созданными для этих целей клонами. aen
-
BlackKilkennyCat
- Собутыльник Кота
- Сообщения: 2905
- Зарегистрирован: Ср ноя 29, 2017 06:58:50
Re: STM32L запись в EEPROM при компиляции
Если она сделана на той же флеши, то она такая же. У нее не может быть иная физика.
Подобная гадость с блокировкой не является свойством мк, а лишь кривого инструментария.
Подобная гадость с блокировкой не является свойством мк, а лишь кривого инструментария.
Re: STM32L запись в EEPROM при компиляции
Почему? В референс-мануале четко и однозначно написано:
Unlocking the Data EEPROM block and the FLASH_PECR register
After reset, Data EEPROM block and the Program/erase control register (FLASH_PECR) are not accessible in write mode and the PELOCK bit in FLASH_PECR is set. The same unlocking sequence unprotects them both at the same time.
The following sequence is used to unlock the Data EEPROM block and FLASH_PECR register:
• Write PEKEY1= 0x89ABCDEF to the Program/erase key register (FLASH_PEKEYR)
• Write PEKEY2= 0x02030405 to the Program/erase key register (FLASH_PEKEYR)
И "физика" там немного другая. Можно писать даже побайтно без стирания. Да и гарантированное число перезаписей указано в 300 тыс. против 10 тыс у программного флеша. То есть, в принципе, очень даже годная штука для энергонезависимого хранения настроек и прочего изменяемого контента.
Тут дело немного в другом. Чтобы записать данные в EEPROM вместе с прошивкой программной памяти, нужно писать скрипт для External Loader. Я пока что еще не разбирался с этим, а готовых скриптов вроде как нету. Ограничился пока что тем, что прописал в стартап-скрипте строчки, указанные в предыдущем посте. Писать их нужно до команды load. Работает кривовато, но грузит нормально.
Unlocking the Data EEPROM block and the FLASH_PECR register
After reset, Data EEPROM block and the Program/erase control register (FLASH_PECR) are not accessible in write mode and the PELOCK bit in FLASH_PECR is set. The same unlocking sequence unprotects them both at the same time.
The following sequence is used to unlock the Data EEPROM block and FLASH_PECR register:
• Write PEKEY1= 0x89ABCDEF to the Program/erase key register (FLASH_PEKEYR)
• Write PEKEY2= 0x02030405 to the Program/erase key register (FLASH_PEKEYR)
И "физика" там немного другая. Можно писать даже побайтно без стирания. Да и гарантированное число перезаписей указано в 300 тыс. против 10 тыс у программного флеша. То есть, в принципе, очень даже годная штука для энергонезависимого хранения настроек и прочего изменяемого контента.
Тут дело немного в другом. Чтобы записать данные в EEPROM вместе с прошивкой программной памяти, нужно писать скрипт для External Loader. Я пока что еще не разбирался с этим, а готовых скриптов вроде как нету. Ограничился пока что тем, что прописал в стартап-скрипте строчки, указанные в предыдущем посте. Писать их нужно до команды load. Работает кривовато, но грузит нормально.
Почти все плюсы в свою карму и в рейтинги сообщения поставил себе сам, своими же созданными для этих целей клонами. aen
Re: STM32L запись в EEPROM при компиляции
[uquote="VladislavS",url="/forum/viewtopic.php?p=3861854#p3861854"]При компиляции ничего в микроконтроллер не пишется.[/uquote]
Не факт. Может компиляция происходит на этом же самом МК?
Не факт. Может компиляция происходит на этом же самом МК?