Автоматизация прошивки SoftDevice |
![]() |
Добавил(а) microsin |
При переключении между несколькими проектами nRF5x часто возникает необходимость перепрошивать SoftDevice. Проще всего это сделать с помощью командного интерфейса JLink.exe. В этой статье описывается пример прошивки s132_nrf52_3.1.0_softdevice в среде IDE Keil. Пример bat-файла, который запускает перепрошивку SoftDevice: @cd ..\util\jlink @set JLINK722="C:\Program Files (x86)\SEGGER\JLink\JLink.exe" @%JLINK722% -CommandFile %1 Содержимое файла списка команд для JLink.exe, который передается через опцию -CommandFile: device NRF52 si SWD speed 4000 r h loadfile ..\..\fw_prj\components\softdevice\s132\hex\s132_nrf52_3.1.0_softdevice.hex q Первая строка device NRF52 задает семейство перепрограммируемого MCU. Вторая строка si SWD задает интерфейс подключения к MCU. Третья строка speed 4000 выбирает скорость подключения в килобит/сек. Четвертая строка r сбрасывает MCU (reset), пятая строка h останавливает выполнение (halt). Строка loadfile выполняет загрузку SoftDevice. Последняя строка q производит выход из сессии JLink.exe. Процесс прошивки s132_nrf52_3.1.0_softdevice.hex интеллектуальный - перед прошивкой выполняется сравнение текущего содержимого памяти MCU с прошиваемым файлом. Если они совпадают, то стирание и прошивка памяти flash не выполняется, чем ускоряется весь процесс и экономится ресурс циклов перепрограммирования памяти flash. [Интеграция скрипта JLink.exe в IDE Keil] Вызов командного файла настраивается через опции проекта вставляется в строку Before Build/Rebuild -> Run на закладке User. Пример: CMD /C ..\util\jlink\flash-SoftDevice.bat CommandFile52.jlink Здесь ..\util\jlink\flash-SoftDevice.bat путь до bat-файла, а CommandFile52.jlink это файл списка команд для JLink.exe. Пример вывода результата Rebuild окна Build Output среды Keil: Build started: Project: myproject *** Using Compiler 'V5.06 update 7 (build 960)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin' Build Project 'myproject' - Target 'nRF52' Before Build - User command #1: CMD /C ..\util\jlink\flash-SoftDevice.bat CommandFile52.jlink SEGGER J-Link Commander V7.22 (Compiled Jun 2 2021 10:04:41) DLL version V7.22, compiled Jun 2 2021 10:03:15 J-Link Command File read successfully. Processing script file... J-Link connection not established yet but required for command. Connecting to J-Link via USB...O.K. Firmware: J-Link ARM V8 compiled Nov 28 2014 13:44:46 Hardware version: V8.00 S/N: 12345678 VTref=3.300V Selecting SWD as current target interface. Selecting 4000 kHz as target interface speed Target connection not established yet but required for command. Device "NRF52" selected. Connecting to target via SWD InitTarget() start InitTarget() end Found SW-DP with ID 0x2BA01477 DPv0 detected Scanning AP map to find all available APs AP[2]: Stopped AP scan as end of AP map has been reached AP[0]: AHB-AP (IDR: 0x24770011) AP[1]: JTAG-AP (IDR: 0x02880000) Iterating through AP map to find AHB-AP to use AP[0]: Core found AP[0]: AHB-AP ROM base: 0xE00FF000 CPUID register: 0x410FC241. Implementer code: 0x41 (ARM) Found Cortex-M4 r0p1, Little endian. FPUnit: 6 code (BP) slots and 2 literal slots CoreSight components: ROMTbl[0] @ E00FF000 ROMTbl[0][0]: E000E000, CID: B105E00D, PID: 000BB00C SCS-M7 ROMTbl[0][1]: E0001000, CID: B105E00D, PID: 003BB002 DWT ROMTbl[0][2]: E0002000, CID: B105E00D, PID: 002BB003 FPB ROMTbl[0][3]: E0000000, CID: B105E00D, PID: 003BB001 ITM ROMTbl[0][4]: E0040000, CID: B105900D, PID: 000BB9A1 TPIU ROMTbl[0][5]: E0041000, CID: B105900D, PID: 000BB925 ETM Cortex-M4 identified. Reset delay: 0 ms Reset type NORMAL: Resets core & peripherals via SYSRESETREQ & VECTRESET bit. Reset: Halt core after reset via DEMCR.VC_CORERESET. Reset: Reset device via AIRCR.SYSRESETREQ. PC = 000008E4, CycleCnt = 00000000 R0 = 00000000, R1 = 00000000, R2 = 00000000, R3 = 00000000 R4 = 00000000, R5 = 00000000, R6 = 00000000, R7 = 00000000 R8 = 00000000, R9 = 00000000, R10= 00000000, R11= 00000000 R12= 00000000 SP(R13)= 20000400, MSP= 20000400, PSP= 00000000, R14(LR) = FFFFFFFF XPSR = 01000000: APSR = nzcvq, EPSR = 01000000, IPSR = 000 (NoException) CFBP = 00000000, CONTROL = 00, FAULTMASK = 00, BASEPRI = 00, PRIMASK = 00 FPS0 = 00000000, FPS1 = 00000000, FPS2 = 00000000, FPS3 = 00000000 FPS4 = 00000000, FPS5 = 00000000, FPS6 = 00000000, FPS7 = 00000000 FPS8 = 00000000, FPS9 = 00000000, FPS10= 00000000, FPS11= 00000000 FPS12= 00000000, FPS13= 00000000, FPS14= 00000000, FPS15= 00000000 FPS16= 00000000, FPS17= 00000000, FPS18= 00000000, FPS19= 00000000 FPS20= 00000000, FPS21= 00000000, FPS22= 00000000, FPS23= 00000000 FPS24= 00000000, FPS25= 00000000, FPS26= 00000000, FPS27= 00000000 FPS28= 00000000, FPS29= 00000000, FPS30= 00000000, FPS31= 00000000 FPSCR= 00000000 Downloading file [..\..\components\softdevice\s132\hex\s132_nrf52_3.1.0_softdevice.hex]... J-Link: Flash download: Bank 0 @ 0x00000000: Skipped. Contents already match O.K. Script processing completed. After Build - User command #1: FromElf.exe --bin --output ..\bin\program.bin .\Objects\program.axf Build Time Elapsed: 00:00:02 Комментарии в списке команд. Можно в список команд добавлять комментарии с помощью двойного слеша, так же, как на языке C. Пример: device NRF52 si SWD speed 4000 r h //loadfile ..\..\..\..\..\..\components\softdevice\s132\hex\s132_nrf52_3.0.0_softdevice.hex loadfile ..\..\..\..\..\..\components\softdevice\s132\hex\s132_nrf52_3.1.0_softdevice.hex q [Два одновременно подключенных J-Link] Бывает, что одновременно отлаживаются два сопрягаемых устройства - например BLE central и BLE peripheral. Тогда при запуске подключения к J-Link открывается окно диалога, где нужно выбрать конкретный адаптер: Это неудобно, потому что приходится каждый раз выбирать нужный J-Link для каждого программируемого устройства, и есть риск ошибочного выбора. Решить проблему можно с помощью опции -USB командной строки JLink.exe, которая позволяет указать нужный адаптер по его серийному номеру. Пример: @set JLINK722="C:\Program Files (x86)\SEGGER\JLink\JLink.exe" @set JLINK_SERIAL=12345678 @%JLINK722% -USB %JLINK_SERIAL% -CommandFile %1 [Пример Post-Build для автоматизации прошивки nRF51844 в IAR] В этом примере рассматривается компиляция проекта ble_app_hids_keyboard на основе чипа nRF51422_xxAA (установлен на плате PCA10028). Этот проект доступен в nRF5 SDK v12.3.0 [4]. После компиляции автоматически запускается скрипт, который сначала прошивает в память чипа двоичный код SoftDevice (s130_nrf51_2.0.1_softdevice.hex), а потом прошивается двоичный код приложения (ble_app_hids_keyboard_pca10028_s130.hex). Процесс по шагам: 1. Создайте командный файл post-build.cmd следующего содержания: @rem Передача опций командной строки:
set PROJ_DIR=%1
set SERIAL=%2
set FIRMWARE=%3.hex
@rem Абсолютный путь до прошиваемого SoftDevice:
set SOFTDEVICE=%PROJ_DIR%\..\..\..\..\..\..\components\softdevice\s130\hex\ s130_nrf51_2.0.1_softdevice.hex @rem Абсолютный путь до утилиты JLink.exe:
set JLINK722="%ProgramFiles(x86)%\SEGGER\JLink\JLink.exe" @rem Имя скрипта команд для JLink.exe:
set JLINK_SCRIPT=%PROJ_DIR%\..\..\..\prg51.jlink @rem Имя файла для выводимых сообщений JLink.exe:
set JLINKOUTPUT=%PROJ_DIR%\..\..\..\jlinkoutput.txt @rem Генерация файла команд для JLink.exe:
echo device NRF51422_XXAA> %JLINK_SCRIPT% echo si SWD >> %JLINK_SCRIPT% echo speed 4000 >> %JLINK_SCRIPT% echo r >> %JLINK_SCRIPT% echo h >> %JLINK_SCRIPT% echo loadfile %SOFTDEVICE% >> %JLINK_SCRIPT% echo loadfile %FIRMWARE% >> %JLINK_SCRIPT% echo q >> %JLINK_SCRIPT% @rem Запуск прошивки кода SoftDevice и кода приложения:
%JLINK722% -USB %SERIAL% -CommandFile %JLINK_SCRIPT% >> %JLINKOUTPUT%
2. Запишите командный файл post-build.cmd в папку examples\ble_peripheral\ble_app_hids_keyboard SDK. 3. Откройте свойства проекта, перейдите в раздел настроек Build Actions, и в строке "Post-build command line:" введите следующее: $PROJ_DIR$\..\..\..\post-build.cmd $PROJ_DIR$ 12345678 $TARGET_BPATH$ На этом все. Перекомпилируйте проект, в память чипа nRF51422 будет записан сначала код SoftDevice, затем код приложения. Причем память FLASH чипа будет записана с экономией её ресурса перезаписи: будут стерты только те сектора, содержимое которых не совпадает с записываемыми данными. Это хорошо видно в выводе утилиты JLink.exe. Подробное описание работы скрипта post-build.cmd см. в [3]. [Ссылки] 1. J-Link Commander site:wiki.segger.com. |