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

调试

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

配置调试器

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

Bluetooth LE Examples工程使用硬件在线调试,相关的调试器默认配置如下:

图 27 配置调试器

默认使用的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 current 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)

//_WDWORD(0xE000E180, 0xFFFFFFFF)

//Write run address to 0xA000C578 register,For the debug mode;
//boot code will check the value of 0xA000C578 firstly,if the value of 0xA000C578 is valid,gr551x will jump to run

//_WDWORD(0xA000C578, 0x00810000)
说明:

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,如图 28所示,以保证启动Debug Session之后,点击Keil工具栏中的Reset按钮,程序仍能正常运行。

图 28 配置Connect & Reset Options均为Normal

输出调试Log

GR533x 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.c),并注册相应的Log输出接口和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; ~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接口可以选择不注册。
  • GR533x 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。

当选择使用J-Link RTT方式输出Log时,推荐在SEGGER_RTT.c中做如下修改:

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

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

图 30 配置J-Link RTT Viewer

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

图 31 获取RTT Control Block地址

使用GRToolbox调试

GR533x SDK提供GRToolbox App (Android版),可用于GR533x Bluetooth LE应用调试。该App主要提供以下功能:

  • 通用的Bluetooth LE扫描和连接,对Characteristics的读写。
  • 标准Profile的Demo展示,包括Heart Rate、Blood Pressure等。
  • Goodix自定义应用程序。
提示:

GRToolbox安装文件可从汇顶官网获取,或从应用市场下载。

扫描关注

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