При переключении между несколькими проектами 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. 2. nRF Command Line Tools. 3. IAR Build Actions. 4. 211209nRF5_SDK_12.3.0_d7731ad-ble_app_hids_keyboard.zip - nRF5 SDK v12.3.0 с примерами приложений и скриптом post-build.cmd в каталоге проекта ble_app_hids_keyboard. |