Segger Embedded Studio(简称SES)有许多使用技巧,本文介绍几个我比较常用的。

(1)自定义快捷键

通过菜单项:Tools –> Options –> Keyboard,实现自定义快捷键。

我所改的几个功能:

  • DebugDownloadActive(F8):下载当前工程。
    在Keil中,下载功能使用快捷键F8,与Build功能(F7)毗邻,这里设置成相同快捷键。
  • EditGoToDeclaration(F11):跳转到函数声明。
    跳转到函数定义快捷键是Alt+G和F12,后者是隐藏快捷键,这里设置成F11与之毗邻。

另外,在Tools –> Options –> Text Editor中,将Ctrl + Left Click Action设为Go To Definition,即可实现类似Source Insight中的“Ctrl+点击”的方式跳转函数定义。

(2)外部工具

SES可以添加外部工具,但是入口很隐晦。

打开菜单项:File –> Open Studio Folder –> External Tool Configuration,将打开tools.xml文件。

在<tools></tools>之间加入如下代码,参考链接

<item name="Tool.CMSIS_Config_Wizard" wait="no">
    <menu>&amp;CMSIS Configuration Wizard</menu>
    <text>CMSIS Configuration Wizard</text>
    <tip>Open a configuration file in CMSIS Configuration Wizard</tip>
    <key>Ctrl+Y</key>
    <match>*config*.h</match>
    <message>CMSIS Config</message>
    <commands>
    java -jar &quot;$(CMSIS_CONFIG_TOOL)&quot; &quot;$(InputPath)&quot;
    </commands>
</item>

此时对sdk_config.h文件点右键,右键菜单中将多出一个CMSIS Configuration Wizard的菜单项,快捷键是Ctrl+Y。如下:

CMSIS Configuration Wizard是一个可视化的设置sdk_config.h的工具,SDK14.2中已经自带了该工具:

同时可以看到,右键菜单中还有我自定义的擦除芯片(Erase the Chip)的命令。

(3)定位注释中的变量

有的代码注释会引用外部变量,如下:

enum BLE_GAP_EVTS
{
  BLE_GAP_EVT_DISCONNECTED,     /**< See @ref ble_gap_evt_disconnected_t.*/
  BLE_GAP_EVT_CONN_PARAM_UPDATE,/**< See @ref ble_gap_evt_conn_param_update_t.*/
  // ...
}

注释中提到了ble_gap_evt_disconnected_t,我想查看该类型变量的定义,由于它位于注释中,无法直接按F12跳转。

最直观的方法是”全局搜索“,再从搜索结果中筛选,但这样做效率很慢(而且SES的全局搜索功能还有陈年bug)。

一个快速的方式是,调用菜单项:Navigate –> Find Symbol(Alt + Y),在符号查找窗口中输入ble_gap_evt_disconnected_t,然后就能够快速定位到该变量的定义,如下:

(4)移除Code/Data列

在项目文件浏览器中,显示了各文件的Code/Data大小,这两列宽度无法调小,在笔记本屏幕上非常浪费空间。

在工具栏的右边角落里有个设置菜单,可以在菜单中隐藏这两列,如下图:

(5)简化工程选项(Project Options)

打开工程选项的常规做法是先选中工程,再右键选择Edit Options项。但是Options中的条目太多,看着麻烦,希望能够只显示我们关心的条目。

操作方法是,打开(4)中提到菜单,做如下设置:

然后在项目文件浏览器中会自动增加一个Project Options目录,里面存放了我们修改过的选项。

如果手动修改了Project Options中的条目,被修改的条目会自动添加到这里。注意,不可以随意删除这些条目,删除操作意味着将其值恢复为默认值。

最终效果如下:

(6)按等号对齐

写代码时候经常遇到这样情况:

p_yqs->conn_handle = BLE_CONN_HANDLE_INVALID;
p_yqs->data_handler = p_yqs_init->data_handler;
p_yqs->is_notification_enabled = false;

希望这些赋值操作按等号对齐,实现如下效果:

p_yqs->conn_handle             = BLE_CONN_HANDLE_INVALID;
p_yqs->data_handler            = p_yqs_init->data_handler;
p_yqs->is_notification_enabled = false;

很简单,选中这几行,调用菜单项:Edit –> Column Tidy功能,即可自动以按等号对齐。

(7)跳转到头文件

假设当前打开的文件为peer_manager.c,希望跳转到peer_manager.h文件中。

调用菜单项:Navigate –> Go To Header (Alt + L)即可。

反过来,从头文件中跳转到源文件,只要找一个函数,按F12跳转到定义即可。

 

(未完待续)

Linux上的串口软件非常少,网络上80%的帖子都在介绍minicom,然而它又不是万能的。

串口软件分为两类,一类是串口终端模拟器,它只支持输入ASCII码。另一类是串口数据收发软件,可以发送十六进制数据。

工作中这两类工具都不可或缺,本文介绍我所使用的几款串口软件。

(1) minicom

minicom属于串口终端模拟器,支持常用的串口输出功能,包括十六进制字符、时间戳等。

使用用法:

  • 连接串口:minicom -D /dev/ttyACM0
  • 退出软件:Ctrl + A X
  • 打开帮助面板:Ctrl+A Z

在minicom中输入错误可以通过Backspace键删除重新输入。

缺点:调整终端窗口大小,会导致minicom中的已有数据被清除。

(2) tio

tio是串口终端模拟器,它功能简洁,但是比较易用。

使用方法:

  • 连接串口:tio /dev/ttyACM0
  • 退出软件:Ctrl + T Q
  • 打开帮助面板:Ctrl + T ?

调整终端窗口不会清除tio的数据内容。

缺点:输入字符时无法修改,比如输入prnt,想修改成print,只能回车后重新输入。

(3) cutecom

cute属于第二类串口工具,它有一个GUI界面,能够方便的输入十六进制数据。

(4) 其他

picocom:类似minicom

cu:类似minicom

gtkterm:类似cutecom

 


 

习惯了Windows系统,突然转到Linux上操作串口会不适应。

系统默认情况下,访问串口需要管理员权限,但是GUI程序无法方便的使用sudo,这就导致cutecom无法检测到串口端口。

解决办法:

将当前用户加入到一个特殊的组(dialout)中,该组具有访问串口的权限,从而无需额外的sudo操作。

在终端中执行:

> sudo usermod -a -G dialout <username>
> systemctl stop ModemManager.service
> systemctl disable ModemManager.service

(完)

 

开发Nordic nRF51和nRF52芯片,我一般都使用nrfjprog.exe进行烧录。

本文记录一些使用技巧。

1. 安装nrfjprog

nordic官网搜索下载Command Line Tools,安装后即获得最新版的nrfjprog工具,同时还会自动安装jLink驱动软件。

默认的安装目录为:C:\Program Files (x86)\Nordic Semiconductor\nrf5x\bin,请将该目录添加到系统环境变量中。

在命令行窗口中测试:

> nrfjprog -v

期望输出为:

> nrfjprog version: 9.7.2
> JLinkARM.dll version: 6.20i

2. 配置硬件

如果使用开发板(PCA100xx),无需做任何配置。

如果使用自己的电路板,需要将SWD接口连接到JLink调试器,PC通过JLink调试器执行nrfjprog命令。

开发板上的JLink可以对外使用,即将开发板视为一个JLink Lite Debugger。

连线图为:

(参考:论坛链接

当按照图中连接一个外部电路板,PC上执行烧录hex命令,那该hex到底烧录到开发板上的芯片还是外部电路呢?

在上图的接线图中,找到橙色标注的管脚VTG,有如下规则:

  • VTG == HIGH,烧录外部电路
  • VTG == LOW,烧录开发板

3. nrfjprog用法

3.1 烧录

> nrfjprog--program <hex_path> [-f UNKNOWN]

UNKNOWN参数可以自动适配nRF51、nRF52和nRF52840各种芯片,而无需手动指定。

nrfjprog v9.5以后的版本,在nrfjprog.ini中指定默认的芯片类型为UNKNOWN,所以命令行中可以省略–family UNKNOWN参数。

如果目标机器上的nrfjprog版本较低,或者没有该ini文件,则仍然要加上该参数。

3.2 擦除

> nrfjprog -e [-f UNKNOWN]

3.3 读写指定地址的内存数据

> nrfjprog --memrd 0x08C78790 [-f UNKNOWN] [--n 4]
> nrfjprog --memwr 0x08C78790 [-f UNKNOWN] --val 0x11

3.4 重启芯片

> nrfjprog --reset [-f UNKNOWN]

3.5 恢复错误状态

> nrfjprog --recover -f NRF52/NRF51/NRF52840

有时候芯片在特殊情况下会锁住(read back protection),导致无法下载程序,需要使用–recover擦除读保护。

3.6 命令列表

> nrfjprog

如果没有任何参数,将列出全部的参数,里面有许多有用的参数。

3.7 连续执行

> nrfjprog --e && nrfjprog --program <hex path> && nrfjprog --reset

使用&&或&可以依次执行多个命令。

4. 命令行窗口

4.1 基本用法

> cd <hex path>
> nrfjprog --program <hex path>

4.2 在当前目录打开cmd

在资源管理器地址栏输入cmd,即可在当前目录打开cmd,省略cd的过程。快捷键:Ctrl + L。

4.3 在当前目录打开PowerShell

Windows 10 推荐用户使用PowerShell替代传统的CMD窗口。

在文件夹空白处,Shift+右键,将显示如下菜单项:

可以通过修改注册表恢复CMD

4.4 为命令加注释

> nrfjprog -e &:: Erase the chip
> nrfjprog --program <hex path> &:: Program the hex
> nrfjprog --reset &:: Reset the chip

&::符号及后面的部分视为注释,不执行,这样在输入许多命令后,通过上下方向键寻找历史记录时,比较方便。参考链接

5. 批处理

5.1 基础

新建文件,后缀名为.bat,用编辑器打开,添加代码:

@echo off
:: This is a line comment
echo This line will be printed
:: Below is a blank line
echo.
set name=ISYQ
echo The author is %name%
pause

保存后,双击运行,将打开CMD窗口并输出:

> This line will be printed
>
> The author is ISYQ
> Press any key to continue . . .

5.2 传入参数

添加代码:

:: Drag a hex file on the bat file, and get the valid path string
set hex_path_with_quotation=%1
set hex_path=%hex_path_with_quotation:~1,-1%
echo The hex path is %hex_path%

保存后,将一个文件拖放到该bat文件上,将打印出该文件的路径。

5.3 用户输入

添加代码:

set /p user_input=Input your name:
echo Your input is: %user_input%

保存运行,将提示用户输入。用户 输入以回车键为结束,如果直接回车,则输入为空。

注意set语句中有/p参数。

5.4 判断和选择

添加代码:

set part_family=0
echo [1] nRF51 series
echo [2, Enter] nRF52 series
echo.
set /p user_input=Select 1/2/Enter:
if "%user_input%" == "1" (
set part_family=NRF51
goto GET_PART_FAMILY
)
if "%user_input%" == "2" (
set part_family=NRF52
goto GET_PART_FAMILY
)
if "%user_input%" == "" (
set part_family=NRF52
goto GET_PART_FAMILY
)
:GET_PART_FAMILY
echo The part family is %part_family%

保存运行,用户输入1,将选择NRF51,输入2或者直接回车,将选择NRF52。

注意,批处理的if语句要尽可能轻度使用,它与C语言的if差异很大。如果运行结果异常,请注释掉开头的@echo off语句,定位出错位置。

%user_input%两边的引号不可省略,因为如果直接输入Enter,会导致代码被解析成if == 3 (,这个语法错误会让程序直接崩溃退出。

批处理的goto关键字使用非常频繁,它要配合标号语法一起使用。

5.5 示例:擦除芯片

@echo off
nrfjprog -e -f UNKNOWN

当开发板连接到电脑,直接运行这个批处理即可擦除芯片。

5.6 示例:下载hex

@echo off
if {%1} == {} (
echo [ERR] No input hex file
echo.
goto END
)
set hex_path_with_quotation=%1
set hex_path=%hex_path_with_quotation:~1,-1%
echo [INFO] Erase the chip
echo.
nrfjprog -e -f UNKNOWN
echo.
echo [INFO] Program the hex: %hex_path%
echo.
nrfjprog --program "%hex_path%" -f UNKNOWN
echo.
echo [INFO] Reset the chip
echo.
nrfjprog --reset -f UNKNOWN
echo.
echo [INFO] Success
echo.
:END
pause

运行效果如图(gif):

5.7 示例:DFU生成公钥和私钥

@echo off
title Generate DFU Keys
set PRIVATE_KEY=private_key.pem
set PUBLIC_KEY=dfu_public_key.c
echo [INFO] Gen private key: %PRIVATE_KEY%
echo.
nrfutil keys generate %PRIVATE_KEY%
echo.
echo [INFO] Gen private key: %PUBLIC_KEY%
nrfutil keys display --key pk --format code %PRIVATE_KEY% --out_file %PUBLIC_KEY%
echo [INFO] Success
echo.
pause

运行后将在当前文件夹生成private_key.pem和dfu_public_key.c两个文件。

5.8 更多示例

许多与命令行工具相关的工作都可以写成批处理,包括:

  • 下载softdevice
    将不同版本的softdevice.hex路径整理出来,然后放到批处理,通过选择SDK版本和nRF型号,自动下载对应的协议栈。
  • 生成DFU的zip
    通过手动输入一些列参数,自动生成DFU需要的zip文件。
  • 生成DFU的Bootloader-Settings.hex

6. pynrfjprog

nrfjprog提供了C/C++和Python的库,可以在代码中执行nrfjprog全部的功能。

这里介绍Python库(pynrfjprog)的使用。

6.1 阅读文档

源码仓库:地址

使用文档:地址

6.2 下载库

该库支持Python 2和Python 3。这里用Python 3进行测试。

在Windows上安装Python 3,在命令行窗口运行:

> pip install pynrfjprog

将自动下载pynrfjprog需要的库文件。库文件与源码仓库中的内容一致。

默认保存地址为:<python dir>\Lib\site-packages\pynrfjprog

6.3 测试

进入示例目录:<python dir>\Lib\site-packages\pynrfjprog\examples\program_hex.py

在cmd中执行:

>python program_hex.py

会自动下载blinky.hex到开发板中。

也可以直接运行program_hex.pyc。

6.4 IDE

使用PyCharm会自动识别pip下载的模块,因此可以脱离python 3安装目录建立自己的工程。

6.5 API介绍

api.connect_to_emu_without_snr()

解释:连接外部芯片,不指定序列号SNR。

hex_content = Hex.Hex(hex_path)
print("Write hex: %s" % hex_path)
for segment in hex_content:
api.write(segment.address, segment.data, True)

解释:将Hex文件内容解析成段,分段写入Flash。

api.sys_reset()
api.go()

解释:重启并运行芯片。

7. 辅助工具

7.1 clink

clink可以增强Windows命令提示符的功能,包括:

  • Tab键自动完成
  • 永久记录历史输入
  • Ctrl+C/Ctrl+V粘贴复制
  • Bash编辑快捷键,比如Ctrl+A回到行首,Ctrl+K删除剩余字符等
  • 额外的Bash命令,包括ls,rm等。

7.2 XYPlorer

XYPlorer是增强型资源管理器,快捷键Ctrl+Alt+P可以快速打开cmd窗口,并定位到当前目录:

XYPlorer支持自定义工具,将本文5.6小节中写好的bat文件,加入Catalog面板,如下所示,只要选中hex文件,单击该条目即可自动下载hex。

7.3 BandiZip

BandiZip是一个免费的压缩软件,它可以在右键菜单增加一项:在当前目录打开CMD窗口。

7.4 Quick Clip

Quick Cliq可以保存用户程序命令,通过托盘图标快速启动程序。

我们可以将上面写好的批处理文件都添加到Quick Clip中统一管理。效果如下:

(完)