|
Как в "незанятой" области FLASH-памяти контроллера сделать определенные значение |
|
|
|
Oct 19 2015, 13:00
|
Участник

Группа: Участник
Сообщений: 48
Регистрация: 2-10-13
Пользователь №: 78 579

|
Добрый день.
Имеется: Некий контроллер STM32F4XX (применительно к задаче не важно какой именно) IDE Keil uVision Программатор J-Link (мне кажется он тут ни к чему, но всеже) Некоторая программа. Некоторый набор двоичных данных.
Сосбтвенно что я хочу: Я использую встроенную нанду для хранения настроек и хочу чтобы при программировании контроллера в него сразу, вместе с программой, зашивались настройки по-умолчанию. (читать и писать программа умеет, но надо чтобы вместо стандартных 0xff в нужной области памяти "изначально" были какие-то определенные значения) Я предполагаю что мне надо как-то получить на выходе из программы такой hex, чтобы после программирования им контроллера, помимо собственно программы, в жестко заданной области памяти, был тот самый "набор двоичных данных".
Есть мысли как это сделать?
Сообщение отредактировал RiseOfDeath - Oct 19 2015, 13:02
|
|
|
|
|
Oct 19 2015, 13:25
|
Участник

Группа: Участник
Сообщений: 48
Регистрация: 2-10-13
Пользователь №: 78 579

|
Цитата(ЯadiatoR @ Oct 19 2015, 16:08)  Если взглянуть на стартап.s то можно увидеть записи типа: Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size
Здесь в качестве STACK идет указатель на область стэка и далее выделяется его размер, равный 0x400 После этого командой DCD можно записать значения в ячейки памяти, так же как это делается с векторной таблицей:
__Vectors . . . DCD NMI_Handler ; NMI Handler DCD HardFault_Handler ; Hard Fault Handler DCD 0 ; Reserved DCD 0 ; Reserved
Поправьте если есть более простые варики Т.е. типа такого вот: Код Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp
EQU 0x0x080E0000 DCD 0xDE DCD 0xAD DCD 0xBE DCD 0xEF Цитата(zltigo @ Oct 19 2015, 16:13)  квалификатор __at А как им пользоваться?
|
|
|
|
|
Oct 19 2015, 13:37
|
Участник

Группа: Участник
Сообщений: 48
Регистрация: 2-10-13
Пользователь №: 78 579

|
Цитата(scifi @ Oct 19 2015, 16:24)  Очень может быть, что проще и практичнее будет, если прошивка сама при первом запуске зашьёт туда то, что нужно. Быть может вы и правы. Сложно сказать.
|
|
|
|
|
Oct 19 2015, 13:38
|

Профессионал
    
Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718

|
в скрипт линковщика добавляете свою секцию Цитата __exidx_end = .;
.flash_var : ALIGN (1024) /* очень важно не прогадать с выравниванием, а то будете затирать программу */ { *(.flash_var*) . = ALIGN (1024); *(.flash_var_end*) } > ROM
__etext = .; затем задаёте в какой секции располагается нужкая переменная(структура) Код static uint8_t __attribute__ ((section(".flash_var"))) mConfigDataFlashArray[sizeof(SConfigData_Internal)]; я обычно по-умолчанию не зашиваю, т.к. программа сам должна знать, что там у неё надо сделать. а при запуске проверяю контрольную сумму: не совпала - сохраняем настройки по-умолчанию.
|
|
|
|
|
Oct 21 2015, 08:42
|
Участник

Группа: Участник
Сообщений: 48
Регистрация: 2-10-13
Пользователь №: 78 579

|
Благодарю всех за помощь. Я решил, что лучше буду при запуске проверять в той памяти некий magik number и орентируясь на его отсутствие писать туда дефолтные настройких. Мне кажется это и проще и будет более очевидно для другогоразработчика, если ему придется иметь с моей прогой дело.
|
|
|
|
|
Oct 21 2015, 10:23
|
Частый гость
 
Группа: Участник
Сообщений: 181
Регистрация: 26-11-10
Пользователь №: 61 198

|
Цитата(RiseOfDeath @ Oct 19 2015, 15:00)  Я предполагаю что мне надо как-то получить на выходе из программы такой hex, чтобы после программирования им контроллера, помимо собственно программы, в жестко заданной области памяти, был тот самый "набор двоичных данных".
Есть мысли как это сделать? Лично я в подобной ситуации поступил весьма тупо в лоб. Потребуется STSW-LINK004STM32 ST-LINK utility1. Заливаем .hex с кодом (без пользовательских настроек). 2. Настраиваем прибор, сохраняем настройки. 3. Читаем флеш полностью (вместе с настройками). 4. Сохраняем новый .hex
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|