调试
Keil提供了调试器,支持代码在线调试。该调试器支持设置6个硬件断点和多个软件断点。开发者还可以使用多种方式设置调试命令。
配置调试器
启动调试之前,需要配置调试器。点击Keil工具栏中的Options for Target按钮 ,打开Options for Target ‘GRxx_Soc’对话框,选择Debug标签页。窗口左侧为软件仿真调试配置,右侧为硬件在线调试配置。Bluetooth LE Examples工程使用硬件在线调试,相关的调试器默认配置如下:
默认使用的Initialization File:sram.ini位于SDK_Folder\build\keil目录。开发者可以直接使用该文件,也可以将该文件复制到自己的工程目录下使用。
初始化文件sram.ini中包含一组调试命令,调试过程将执行这些命令。点击Initialization File栏右侧的Edit...按钮,可打开sram.ini文件。sram.ini的代码示例如下:
/**
*****************************************************************
* GR55xx object loading script through debugger interface
* (e.g.Jlink, *etc).
* The goal of this script is to load the Keils's object file to the
* GR55xx RAM
* assuring that the GR55xx has been previously cleaned up.
*****************************************************************
*/
// Debugger reset(check Keil debugger settings)
// Preselected reset type(found in Options->Debug->Settings)is
// Normal(0);
// -Normal:Reset core & peripherals via SYSRESETREQ & VECTRESET bit
// RESET
// Load object file
LOAD %L
// Load stack pointer
SP = _RDWORD(0x00000000)
// Load program counter
$ = _RDWORD(0x00000004)
// Write 0 to vector table register, remap vector
_WDWORD(0xE000ED08, 0x00000000)
Keil支持按照以下顺序执行开发者设置的调试器命令:
- 当 被使能,调试器会首先载入 中的文件。
- 执行 所指定文件中的命令。
- 当 包含的选项被选中,恢复相应的Breakpoints,Watch Windows,Memory Display等。
- 当g,main被发现位于Initialization File中,调试器就开始自动执行CPU指令,直至遇到main()才会停下来。 被选中或者命令
启动调试
完成调试器配置后,点击Keil工具栏的Start/Stop Debug Session按钮 即可开始调试。
Connect & Reset Options均需设置为Normal,如图 29所示,以保证启动Debug Session之后,点击Keil工具栏的Reset按钮,程序仍能正常运行。
输出调试Log
GR5525 SDK提供APP LOG模块,可支持硬件端口输出Application调试Log,并支持开发者自定义输出方式:UART、J-Link RTT或ARM ITM(Instrumentation Trace Macrocell)。若使用APP LOG模块,则需在custom_config.h中打开宏APP_LOG_ENABLE,并根据所需输出方式配置宏APP_LOG_PORT。
模块初始化
完成配置后,开发者还需在外设初始化阶段,调用app_log_init()完成APP LOG模块的初始化,包括配置Log参数、注册Log输出接口和Flush接口。
APP LOG模块支持使用标准C库函数printf()和APP LOG API输出调试Log。若使用APP LOG API,则可通过设置Log级别、格式、过滤方式等参数优化Log输出;若使用printf(),则可将Log参数设置为NULL。
根据开发者所设置的输出方式,调用相应模块的初始化函数(具体可参考SDK_Folder\platform\boards\board_SK.h),并注册相应的发送和Flush函数,可参考函数bsp_log_init()。以UART输出方式为例,bsp_log_init()实现如下:
void bsp_log_init(void)
{
#if APP_LOG_ENABLE
#if (APP_LOG_PORT == 0)
bsp_uart_init();
#elif (APP_LOG_PORT == 1)
SEGGER_RTT_ConfigUpBuffer(0, NULL, NULL, 0, SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL);
#endif
#if (APP_LOG_PORT <= 2)
app_log_init_t log_init;
log_init.filter.level = APP_LOG_LVL_DEBUG;
log_init.fmt_set[APP_LOG_LVL_ERROR] = APP_LOG_FMT_ALL & (~APP_LOG_FMT_TAG);
log_init.fmt_set[APP_LOG_LVL_WARNING] = APP_LOG_FMT_LVL;
log_init.fmt_set[APP_LOG_LVL_INFO] = APP_LOG_FMT_LVL;
log_init.fmt_set[APP_LOG_LVL_DEBUG] = APP_LOG_FMT_LVL;
#if (APP_LOG_PORT == 0)
app_log_init(&log_init, bsp_uart_send, bsp_uart_flush);
#elif (APP_LOG_PORT == 1)
app_log_init(&log_init, bsp_segger_rtt_send, NULL);
#elif (APP_LOG_PORT == 2)
app_log_init(&log_init, bsp_itm_send, NULL);
#endif
#endif
app_assert_init();
#endif
}
- app_log_init()接口的入参包括Log初始化参数、Log输出接口和Flush接口。其中,Flush接口可以选择不注册。
- GR5525 SDK提供了APP LOG STORE模块,该模块支持将调试Log存入Flash中以及从Flash中导出。使用该模块时需在custom_config.h中添加宏APP_LOG_STORE_ENABLE。SDK_Folder\projects\ble\ble_peripheral\ble_app_rscs工程中配置了该功能,开发者可参考该示例工程配置,使用APP LOG STORE模块。
- 使用printf()输出的Application Log无法使用APP LOG STORE模块进行存储。
- bsp_uart_send()实现了app_uart异步(app_uart_transmit_async接口)和hal_uart同步(hal_uart_transmit接口)两种方式的输出接口,开发者可根据实际需求,选择合适的Log输出方式。
- bsp_uart_flush()为uart_flush接口,用于中断模式下输出缓存在内存中缓存的Log数据。
开发者可重写上述两个接口函数。
当使用J-Link RTT或ARM ITM输出调试Log时,已实现的Log输出接口分别为bsp_segger_rtt_send() 和 bsp_itm_send()。在这两种模式下,没有实现Flush接口。
使用方法
APP LOG模块初始化完成后,开发者可以使用以下四个API输出调试Log:
- APP_LOG_ERROR()
- APP_LOG_WARNING()
- APP_LOG_INFO()
- APP_LOG_DEBUG()
如果使用了中断输出模式,可调用app_log_flush()函数将缓存中的全部调试Log输出,从而保证芯片复位或系统睡眠之前,输出全部调试Log。
当选择ARMCC编译并使用J-Link RTT方式输出Log时,推荐在SEGGER_RTT.c中做如下修改:
若需对J-Link RTT Viewer进行配置,则可参考图 31中的参数配置。
其中RTT Control Block的地址通过Address方式指定,输入值可设置为编译工程生成的.map映射文件中_SEGGER_RTT结构体的地址,如下图所示。若按图 30推荐方式创建RTT Control Block并将其置于地址0x20005000处,则Address应设置为0x20005000。
当使用GCC编译时,无需按照图 30修改,J-Link RTT Viewer中RTT Control block地址为编译工程生成的.map映射文件中_SEGGER_RTT结构体的地址。
使用GRToolbox调试
GR5525 SDK提供GRToolbox App (Android版),可用于GR5525 Bluetooth LE应用调试。该App主要提供以下功能:
- 通用的Bluetooth LE扫描和连接,对Characteristics的读写。
- 标准Profile的Demo展示,包括Heart Rate、Blood Pressure等。
- Goodix自定义应用程序。
GRToolbox安装文件为SDK_Folder\tools\GRToolbox\GRToolbox-Version.apk。