RTT调试不占用串口,也不用接多余的线,在调试时比uart打印日志更加方便。
在nordic的zigbee/ble/thread 3.2 SDK(v3.2.0_9fade31),
修改目标工程为
C: ordic_zigbee_v3.2.0_9fade31examplesmultiprotocolle_zigbeele_zigbee_dynamic_door_lock_nuspca10056s140arm5_no_packsle_zigbee_dynamic_door_lock_pca10056_s140.uvprojx
第一步 增加代码
在工程中添加rtt相关的C代码文件
源文件的路径在
X: ordic_zigbee_v3.2.0_9fade31externalsegger_rtt
第二步 修改config
sdk_config.h文件中增加启用RTT的宏,这部分在3.2以后的版本可能已经增加,使用时请注意区分。
增加的代码段如下:
//========================================================== // <e> NRF_LOG_BACKEND_RTT_ENABLED - nrf_log_backend_rtt - Log RTT backend //========================================================== #ifndef NRF_LOG_BACKEND_RTT_ENABLED #define NRF_LOG_BACKEND_RTT_ENABLED 1 #endif // <o> NRF_LOG_BACKEND_RTT_TEMP_BUFFER_SIZE - Size of buffer for partially processed strings. // <i> Size of the buffer is a trade-off between RAM usage and processing. // <i> if buffer is smaller then strings will often be fragmented. // <i> It is recommended to use size which will fit typical log and only the // <i> longer one will be fragmented. #ifndef NRF_LOG_BACKEND_RTT_TEMP_BUFFER_SIZE #define NRF_LOG_BACKEND_RTT_TEMP_BUFFER_SIZE 128 #endif // <o> NRF_LOG_BACKEND_RTT_TX_RETRY_DELAY_MS - Period before retrying writing to RTT #ifndef NRF_LOG_BACKEND_RTT_TX_RETRY_DELAY_MS #define NRF_LOG_BACKEND_RTT_TX_RETRY_DELAY_MS 1 #endif // <o> NRF_LOG_BACKEND_RTT_TX_RETRY_CNT - Writing to RTT retries. // <i> If RTT fails to accept any new data after retries // <i> module assumes that host is not active and on next // <i> request it will perform only one write attempt. // <i> On successful writing, module assumes that host is active // <i> and scheme with retry is applied again. #ifndef NRF_LOG_BACKEND_RTT_TX_RETRY_CNT #define NRF_LOG_BACKEND_RTT_TX_RETRY_CNT 3 #endif // </e> |
第二段代码
// <h> nRF_Segger_RTT //========================================================== // <h> segger_rtt - SEGGER RTT //========================================================== // <o> SEGGER_RTT_CONFIG_BUFFER_SIZE_UP - Size of upstream buffer. // <i> Note that either @ref NRF_LOG_BACKEND_RTT_OUTPUT_BUFFER_SIZE // <i> or this value is actually used. It depends on which one is bigger. #ifndef SEGGER_RTT_CONFIG_BUFFER_SIZE_UP #define SEGGER_RTT_CONFIG_BUFFER_SIZE_UP 14000 #endif // <o> SEGGER_RTT_CONFIG_MAX_NUM_UP_BUFFERS - Size of upstream buffer. #ifndef SEGGER_RTT_CONFIG_MAX_NUM_UP_BUFFERS #define SEGGER_RTT_CONFIG_MAX_NUM_UP_BUFFERS 2 #endif // <o> SEGGER_RTT_CONFIG_BUFFER_SIZE_DOWN - Size of upstream buffer. #ifndef SEGGER_RTT_CONFIG_BUFFER_SIZE_DOWN #define SEGGER_RTT_CONFIG_BUFFER_SIZE_DOWN 16 #endif // <o> SEGGER_RTT_CONFIG_MAX_NUM_DOWN_BUFFERS - Size of upstream buffer. #ifndef SEGGER_RTT_CONFIG_MAX_NUM_DOWN_BUFFERS #define SEGGER_RTT_CONFIG_MAX_NUM_DOWN_BUFFERS 2 #endif // <o> SEGGER_RTT_CONFIG_DEFAULT_MODE - RTT behavior if the buffer is full. // <i> The following modes are supported: // <i> - SKIP - Do not block, output nothing. // <i> - TRIM - Do not block, output as much as fits. // <i> - BLOCK - Wait until there is space in the buffer. // <0=> SKIP // <1=> TRIM // <2=> BLOCK_IF_FIFO_FULL #ifndef SEGGER_RTT_CONFIG_DEFAULT_MODE #define SEGGER_RTT_CONFIG_DEFAULT_MODE 0 #endif // </h> //========================================================== // </h> //========================================================== |
增加代码完成之后,可视化的界面(仅截取相关部分)如下
第三步 头文件路径
由于segger_rtt是新添加的,还要在工程中将该文件夹的路径增加到搜索区域。一般使用相对路径,配置的方法如下图:
在SDK中,工程不作修改的情况下可以使用以下路径:
..............externalsegger_rtt
第四步 临门一脚
在main()函数,增加一个代码进行测试。
增加的代码如下
SEGGER_RTT_printf(0,"haha, this is a rtt log ");
第五步 大功告成
将上面的工程编译后,下载到目标板,(注意,先不要处于Deubg状态),打开J-Link RTT Viewer v6.60c(也可以是其他版本),这里是windows10,其他操作系统请百度。并且按下F2连接到当前的Jlink。复位目标板,在RTT Viewer 将显示日志如下:
所有的工作完成!
这个方法适用于Nordic semi芯片的Keil工程,比如nrf52832, 52840等,这里以zigbee-ble混合工程为例,ble / thread工作应该也可以用。不同的IDE可以参照实现。