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

    

nRF52832 автоматическое дописывание стека во флешь IAR

Привет.

Толком не решил вопрос с записью стека во флешь память микроконтроллера nRF52832 с использованием IAR.

Вот в Keil насколько помню было два набора настроек (выбор targer) debug и softdevice. Вначале softdevice шился, потом можно было отладку юзать.

Но как сделать в IAR хз. Чтоб стек (.hex) сразу зашивался куда надо.

Подскажите как сделать?

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


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

Полазил по Dev zone, нашел https://devzone.nordicsemi.com/f/nordic ... -1-for-arm , человек поднимает как раз мою тему.

Но из прочитанного не ясно от куда взялся адрес define region S110_region = mem:[from 0x00000000 to 0x00015FFF]; , а именно 0x00015FFF.

Почему 0x00015FFF ?

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


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

Потому что в те далёкие времена S110 занимал 86539 (0x01520B) байт (у него это написано с первых же строк).

 

Сейчас (SDK 15) последний адрес S110 - 0x18647, для softdevice'а есть смысл отвести всю память перед application: from 0 to 0x18ffff для S110, from 0 to 0x25fff для s132

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


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

Сделал настройки linker на рис.

Настройки .icf

/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x26000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x26000;
define symbol __ICFEDIT_region_ROM_end__   = 0x7ffff;
define symbol __ICFEDIT_region_RAM_start__ = 0x20002a98;
define symbol __ICFEDIT_region_RAM_end__   = 0x2000ffff;
export symbol __ICFEDIT_region_RAM_start__;
export symbol __ICFEDIT_region_RAM_end__;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 8192;
define symbol __ICFEDIT_size_heap__   = 8192;
/**** End of ICF editor section. ###ICF###*/

define memory mem with size = 4G;
define region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];

define region S110_region  = mem:[from 0x00000000 to 0x25fff];

"S110_Firmware":
place in S110_region { section .s110_section };

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };
define block RO_END    with alignment = 8, size = 0     { };

initialize by copy { readwrite };
do not initialize  { section .noinit };

keep { section .intvec };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place in ROM_region   { readonly,
                       block RO_END };
place in RAM_region   { readwrite,
                       block CSTACK,
                       block HEAP };

Iar выдал ошибку unable to allocate space for sections/blocks with a total estimated minimum size of 0x2ce24 bytes (max align 0x4) in <[0x00000000-0x00025fff]> (total uncommitted space 0x26000).

post-95877-1534860196_thumb.png

Изменено пользователем Alex_Golubev

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


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

В любом SD есть файл (пример)

s132_nrf51822_5.0.0_release-notes.pdf

В начале написано сколько флэш и рам надо оставить.

The combined MBR and SoftDevice memory requirements for this version are as follows:

Flash: 140 kB (0x23000 bytes).

RAM: 5.18 kB (0x14b8 bytes). This is the minimum required memory with the BLE stack enabled. The actual requirements

depend on the configuration chosen at sd_ble_enable() time.

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


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

В общем сделал размер в два раза больше, чем показал jflash. Получился размер 0x00059C48. IAR перестал ругаться, собрал проект прошил, но не чего не работает. В начале флешь памяти ff.

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


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

Вопрос первый. Где вы взяли файл размером 0x2ce24 (183844) байта?

Вопрос второй. Вы точно уверены, что проект для S132 корректно заработает с S110 ? (должно работать, НО: надо править размещение application и, очевидно, нельзя трогать нереализованное в S110 API). Первое, как я вижу, не сделано.

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


Ссылка на сообщение
Поделиться на другие сайты
Где вы взяли файл размером 0x2ce24 (183844) байта?
С помощью hex2bin переделал ble_app_uart_pca10040_s132.hex в .bin. Посмотрел размер файла с помощью jflash получилось 183844 байта. Умножил на два и получил размер 0x00059C48.

 

Вопрос второй. Вы точно уверены, что проект для S132 корректно заработает с S110
Я подключил проект S132,а S110 просто взял название с форума DEV ZONE. Или я не понял вашего вопроса?

post-95877-1534901852_thumb.png

Изменено пользователем Alex_Golubev

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


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

Какой ble_app_uart_pca10040_s132 ?!

Вы туда что хотите положить? Softdevice? Вот и кладите софтдевайс. Вот этот: nRF5_SDK_15.0.0_a53641a\components\softdevice\s112\hex\s112_nrf52_6.0.0_softdevice.hex

 

UPD. Точнее, вот этот: nRF5_SDK_15.0.0_a53641a\components\softdevice\s132\hex\s132_nrf52_6.0.0_softdevice.hex

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


Ссылка на сообщение
Поделиться на другие сайты
Какой ble_app_uart_pca10040_s132 ?!
Понял я это только после того, когда написал на форуме DEV ZONE :) .

Сейчас буду пробовать с s132_nrf52_6.0.0_softdevice.hex.

 

Заранее уточню define region S132_region = mem:[from 0x00000000 to x]; вместо x кокой адрес написать?

Изменено пользователем Alex_Golubev

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


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

Добил я IAR. На DEV ZONE направили меня на правильный путь :). Полностью очистил флешь и записал из IAR и все заработало. Воть :).

В общем куму надо:

/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x26000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x26000;
define symbol __ICFEDIT_region_ROM_end__   = 0x7ffff;
define symbol __ICFEDIT_region_RAM_start__ = 0x20002a98;
define symbol __ICFEDIT_region_RAM_end__   = 0x2000ffff;
export symbol __ICFEDIT_region_RAM_start__;
export symbol __ICFEDIT_region_RAM_end__;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 8192;
define symbol __ICFEDIT_size_heap__   = 8192;
/**** End of ICF editor section. ###ICF###*/

define memory mem with size = 4G;
define region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];

define region S132_region  = mem:[from 0x00000000 to 0x00049448];

"S132_Firmware":
place in S132_region { section .s132_section };

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };
define block RO_END    with alignment = 8, size = 0     { };

initialize by copy { readwrite };
do not initialize  { section .noinit };

keep { section .intvec };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place in ROM_region   { readonly,
                       block RO_END };
place in RAM_region   { readwrite,
                       block CSTACK,
                       block HEAP };

Конечно есть у меня вопросы, но думаю нужно немного подождать чтобы мысли структурировались.

Теперь квест II бутлодер.

Можете подсказать с чего начать?

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


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

Как всегда с примеров в SDK

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


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

А это ничего, что ROM_region и S132_region перекрываются?

И вообще, откуда опять взялись эти цифирки "mem:[from 0x00000000 to 0x00049448]" ?

 

Вообще, для прояснения, я б начал с документации. Цифры там устарели (сейчас размер софтдевайса другой), но общий принцип никуда не делся.

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


Ссылка на сообщение
Поделиться на другие сайты
А это ничего, что ROM_region и S132_region перекрываются?
Вы имеете в виду что S132_region должен лежать в приделах 0x00003000 - 0x0001F000 SoftDevice ?

Если по этой ссылки https://infocenter.nordicsemi.com/index.jsp...dfu_memory.html то область должна быть SoftDevice 0x0000 1000 - 0x0002 6000 (148 kB).

/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x26000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x26000;
define symbol __ICFEDIT_region_ROM_end__   = 0x7ffff;
define symbol __ICFEDIT_region_RAM_start__ = 0x20002a98;
define symbol __ICFEDIT_region_RAM_end__   = 0x2000ffff;
export symbol __ICFEDIT_region_RAM_start__;
export symbol __ICFEDIT_region_RAM_end__;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 8192;
define symbol __ICFEDIT_size_heap__   = 8192;
/**** End of ICF editor section. ###ICF###*/

define memory mem with size = 4G;
define region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];

define region S132_region  = mem:[from 0x00000000 to 0x00026000];

"S132_Firmware":
place in S132_region { section .s132_section };

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };
define block RO_END    with alignment = 8, size = 0     { };

initialize by copy { readwrite };
do not initialize  { section .noinit };

keep { section .intvec };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place in ROM_region   { readonly,
                       block RO_END };
place in RAM_region   { readwrite,
                       block CSTACK,
                       block HEAP };

А вот что за область памяти Master Boot Record (MBR) мне не ясно. И если написать define region S132_region = mem:[from 0x00001000 to 0x00026000]; То программа снова не работает. Может Master Boot Record (MBR) уже включена в SoftDevice .Hex.

Изменено пользователем Alex_Golubev

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


Ссылка на сообщение
Поделиться на другие сайты
Вы имеете в виду что S132_region должен лежать в приделах 0x00003000 - 0x0001F000 SoftDevice ?

А эти цифры откуда?

 

Отложили бы вы всё, да денёк-другой полистали нордиковскую документацию. Метод тыка и слепого копипаста работает плохо...

 

MBR - это нордиковская штука, которая умеет: запускать application, запускать пользовательский бутлоадер (правда, я пока не разбирался, как этого добиться), а также копировать данные во флеш памяти (для организации обновления "на лету" через резервную область). Поставляется исключительно в бинарном виде.

 

В вышеупомянутом hex'е, действительно, "склеены" MBR + SoftDevice. Где об этом написано, я не помню.

Хорошо видно, если открыть файл в любой программе, которая умеет hex. Видно две области данных - одна стартует с нуля, вторая - с 0x1000.

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти