CN / EN
文档反馈
感谢关注汇顶文档,期待您的宝贵建议!
感谢您的反馈,祝您愉快!

调试

Keil提供了调试器,支持代码在线调试。该调试器支持设置6个硬件断点和多个软件断点。开发者还可以使用多种方式设置调试命令。

配置调试器

启动调试之前,需要配置调试器。点击Keil工具栏中的Options for Target按钮 ,打开Options for Target ‘GRxx_Soc’对话框,选择Debug标签页。窗口左侧为软件仿真调试配置,右侧为硬件在线调试配置。Bluetooth LE Examples工程使用硬件在线调试,相关的调试器默认配置如下:

图 28 配置调试器

默认使用的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支持按照以下顺序执行开发者设置的调试器命令:

  1. Options for Target ‘GRxx_Soc’ > Debug > Load Application at Startup被使能,调试器会首先载入Options for Target ‘GRxx_Soc’ > Output > Name of Executable中的文件。
  2. 执行Options for Target ‘GRxx_Soc’ > Debug > Initialization File所指定文件中的命令。
  3. Options for Target ‘GRxx_Soc’ > Debug > Restore Debug Session Settings包含的选项被选中,恢复相应的Breakpoints,Watch Windows,Memory Display等。
  4. Options for Target ‘GRxx_Soc’ > Debug > Run to main()被选中或者命令g,main被发现位于Initialization File中,调试器就开始自动执行CPU指令,直至遇到main()才会停下来。

启动调试

完成调试器配置后,点击Keil工具栏的Start/Stop Debug Session按钮 即可开始调试。

说明:

Connect & Reset Options均需设置为Normal,如图 29所示,以保证启动Debug Session之后,点击Keil工具栏的Reset按钮,程序仍能正常运行。

图 29 配置Connect & Reset Options均为Normal

输出调试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模块进行存储。
当使用UART输出调试Log时,已实现的Log输出接口和Flush接口分别为bsp_uart_send()和bsp_uart_flush()。
  • 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中做如下修改:

图 30 创建RTT Control Block并置于地址0x20005000处

若需对J-Link RTT Viewer进行配置,则可参考图 31中的参数配置。

图 31 配置J-Link RTT Viewer

其中RTT Control Block的地址通过Address方式指定,输入值可设置为编译工程生成的.map映射文件中_SEGGER_RTT结构体的地址,如下图所示。若按图 30推荐方式创建RTT Control Block并将其置于地址0x20005000处,则Address应设置为0x20005000

图 32 获取RTT Control Block地址
说明:

当使用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

扫描关注

打开微信,使用“扫一扫”即可关注。