Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: nRF52832 автоматическое дописывание стека во флешь IAR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры
Alex_Golubev
Привет.
Толком не решил вопрос с записью стека во флешь память микроконтроллера nRF52832 с использованием IAR.
Вот в Keil насколько помню было два набора настроек (выбор targer) debug и softdevice. Вначале softdevice шился, потом можно было отладку юзать.
Но как сделать в IAR хз. Чтоб стек (.hex) сразу зашивался куда надо.
Подскажите как сделать?
Alex_Golubev
Полазил по Dev zone, нашел https://devzone.nordicsemi.com/f/nordic ... -1-for-arm , человек поднимает как раз мою тему.
Но из прочитанного не ясно от куда взялся адрес define region S110_region = mem:[from 0x00000000 to 0x00015FFF]; , а именно 0x00015FFF.
Почему 0x00015FFF ?
esaulenka
Потому что в те далёкие времена S110 занимал 86539 (0x01520B) байт (у него это написано с первых же строк).

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

Сделал настройки linker на рис.
Настройки .icf
CODE
/*###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).
x893
В любом 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.
Alex_Golubev
В общем сделал размер в два раза больше, чем показал jflash. Получился размер 0x00059C48. IAR перестал ругаться, собрал проект прошил, но не чего не работает. В начале флешь памяти ff.
esaulenka
Вопрос первый. Где вы взяли файл размером 0x2ce24 (183844) байта?
Вопрос второй. Вы точно уверены, что проект для S132 корректно заработает с S110 ? (должно работать, НО: надо править размещение application и, очевидно, нельзя трогать нереализованное в S110 API). Первое, как я вижу, не сделано.
Alex_Golubev
Цитата
Где вы взяли файл размером 0x2ce24 (183844) байта?
С помощью hex2bin переделал ble_app_uart_pca10040_s132.hex в .bin. Посмотрел размер файла с помощью jflash получилось 183844 байта. Умножил на два и получил размер 0x00059C48.

Цитата
Вопрос второй. Вы точно уверены, что проект для S132 корректно заработает с S110
Я подключил проект S132,а S110 просто взял название с форума DEV ZONE. Или я не понял вашего вопроса?
esaulenka
Какой 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
Alex_Golubev
Цитата
Какой ble_app_uart_pca10040_s132 ?!
Понял я это только после того, когда написал на форуме DEV ZONE sm.gif .
Сейчас буду пробовать с s132_nrf52_6.0.0_softdevice.hex.

Заранее уточню define region S132_region = mem:[from 0x00000000 to x]; вместо x кокой адрес написать?
Alex_Golubev
Добил я IAR. На DEV ZONE направили меня на правильный путь sm.gif. Полностью очистил флешь и записал из IAR и все заработало. Воть sm.gif.
В общем куму надо:
CODE
/*###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 бутлодер.
Можете подсказать с чего начать?
x893
Как всегда с примеров в SDK
esaulenka
А это ничего, что ROM_region и S132_region перекрываются?
И вообще, откуда опять взялись эти цифирки "mem:[from 0x00000000 to 0x00049448]" ?

Вообще, для прояснения, я б начал с документации. Цифры там устарели (сейчас размер софтдевайса другой), но общий принцип никуда не делся.
Alex_Golubev
Цитата
А это ничего, что 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).
CODE
/*###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.
esaulenka
Цитата
Вы имеете в виду что S132_region должен лежать в приделах 0x00003000 - 0x0001F000 SoftDevice ?

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

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

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

В вышеупомянутом hex'е, действительно, "склеены" MBR + SoftDevice. Где об этом написано, я не помню.
Хорошо видно, если открыть файл в любой программе, которая умеет hex. Видно две области данных - одна стартует с нуля, вторая - с 0x1000.
Alex_Golubev
esaulenka можно попросить вас дать пример с комментариями бута?
x893
Кому не нравится SD
https://mynewt.apache.org/
Alex_Golubev
Не собираются у меня примеры бута
Код
Fatal Error[Pe1696]: cannot open source file "uECC.h" C:\Users\Алексей\Desktop\nordic\nRF5_SDK_15.0.0_a53641a\components\libraries\crypto\backend\micro_ecc\micro_ecc_backend_ecc.h 52
В общем все как всегда sad.gif.
Посмотрел в функции main очень мало строг кода.
Код
    uint32_t ret_val;

    // Protect MBR and bootloader code from being overwritten.
    ret_val = nrf_bootloader_flash_protect(0, MBR_SIZE, false);
    APP_ERROR_CHECK(ret_val);
    ret_val = nrf_bootloader_flash_protect(BOOTLOADER_START_ADDR, BOOTLOADER_SIZE, false);
    APP_ERROR_CHECK(ret_val);

    (void) NRF_LOG_INIT(app_timer_cnt_get);
    NRF_LOG_DEFAULT_BACKENDS_INIT();

    NRF_LOG_INFO("Inside main");

    ret_val = nrf_bootloader_init(dfu_observer);
    APP_ERROR_CHECK(ret_val);

    // Either there was no DFU functionality enabled in this project or the DFU module detected
    // no ongoing DFU operation and found a valid main application.
    // Boot the main application.
    nrf_bootloader_app_start();

    // Should never be reached.
    NRF_LOG_INFO("After main");

Тут может быть даже собирать не надо. Можно так разобраться с функциями.
Вот функция nrf_bootloader_flash_protect(0, MBR_SIZE, false); как понимаю нужна для защиты от стирания области памяти MBR.
nrf_bootloader_flash_protect(BOOTLOADER_START_ADDR, BOOTLOADER_SIZE, false); тоже самое.
nrf_bootloader_init(dfu_observer); инициализация бута.
и потом они зачем то еще и стартуют nrf_bootloader_app_start(); хотя стар есть nrf_bootloader_init().
А вот обработчиков запуска перепрошивки не нашел.
Alex_Golubev
Я установил MinGW, получил консоль. Нашел рекомендации на DEV ZONE https://devzone.nordicsemi.com/f/nordic-q-a...micro-ecc-issue. Ссылка на DEV ZONE на gitHab оказалось битой, посчитал что по этой ссылки должно быть вот это https://github.com/kmackay/micro-ecc.
Install version 4.9-2015-q3-update of the GCC compiler toolchain for ARM не стал устанавливать не понял для чего нужно. В папке micro-ecc есть nrf52hf_iar и nrf52nf_iar в чем отличие?
консоль выдала ошибку.
esaulenka
Цитата(x893 @ Aug 22 2018, 16:55) *
Кому не нравится SD
https://mynewt.apache.org/

Опыт применения есть? У нордика всё по полочкам разложено, куча пользователей, техподдержка, а тут самому грабли собирать...

Цитата(Alex_Golubev @ Aug 22 2018, 16:39) *
esaulenka можно попросить вас дать пример с комментариями бута?

Нет их у меня. Я и сам осваиваю этот чип. Пример собрал, но даже запускать не пробовал. По первому впечатлению - пообщаемся с коллегами, и выкинем бОльшую часть криптографии. То, что будет уже не стандартный DFU, не очень пугает - всё равно своё приложение писать...

Цитата(Alex_Golubev @ Aug 23 2018, 17:55) *
https://github.com/kmackay/micro-ecc.
консоль выдала ошибку.

Ну, как минимум, надо было сделать cd /каталог/до/нужного/Makefile

Цитата(Alex_Golubev @ Aug 23 2018, 17:55) *
GCC compiler toolchain for ARM не стал устанавливать не понял для чего нужно.

Нужно для того, чтобы собрать uecc из исходников (у них ассемблерный кусок только для gcc-шного ассемблера). Я, собственно, так и сделал - но я всё gcc собираю.
Вам, насколько я понимаю, нужно было
- uEcc.h и проч. заголовки с гитхаба положить в нужном месте
- проследить, чтобы линкер подхватил скомпилированную заботливым нордиком библиотеку (те самые файлы *.a / *.lib в каталогах nrf52xx_iar)

Цитата(Alex_Golubev @ Aug 23 2018, 17:55) *
В папке micro-ecc есть nrf52hf_iar и nrf52nf_iar в чем отличие?

Гугл знает!.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.