1 基于J-Link的调试信息输出( 三 )


NRF_LOG_INTERNAL_HEXDUMP_MODULE(NRF_LOG_SEVERITY_WARNING, NRF_LOG_SEVERITY_WARNING, p_data, len)
现在我们再进行make就可以正常编译了 , 然后执行make flash烧录到L-Stick就可以了 。
我们另外打开两个终端窗口
现在切回到JLink RTT输出的终端就可以看到我们打印输出的信息了

1 基于J-Link的调试信息输出

文章插图
2 DWT(数据观察点单元)时间戳 DWT简介
DWT是中众多调试组件之一 , 叫做数据观察点与跟踪单元
它提供的调试功能包括:
它包含了 4 个比较器,可以配置成在发生比较匹配时,执行如下动作:
调试监视器模式
作为计数器,DWT 可以对下列项目进行计数:
以固定的周期采样 PC 的值中断事件跟踪
DWT 中有剩余的计数器,它们典型地用于程序代码的“性能速写”() 。通过编程它们,就可以让它们在计数器溢出时发出事件(以跟踪数据包的形式) 。最典型地,就是使用 寄存器来测量执行某个任务所花的周期数,这也可以用作时间基准相关的目的(操作系统中统计 CPU使用率可以用到它) 。
我们的时间戳实现就是利用DWT作为计数器通过读取寄存器来获取当前时间戳的 。
工程建立
我们把RTT文件夹复制一份并重命名位DWT作为我们本节的工程文件夹 。
修改main.c
打开main.c文件将所有内容删除替换为如下代码
#include "nrf_delay.h"#include "nrf_log.h"#include "nrf_log_ctrl.h"#include "nrf_log_default_backends.h"/****************************************************************************** @brefDWT_init* @paramnone* @retvalnone*****************************************************************************/void DWT_init(void){uint32_t val;// Enable the trace and debug blocks (DWT is one of them).val = CoreDebug->DEMCR;CoreDebug->DEMCR = val | CoreDebug_DEMCR_TRCENA_Msk;// Make the cycle counter is enabled.val = DWT->CTRL;DWT->CTRL = val | DWT_CTRL_CYCCNTENA_Msk;}/****************************************************************************** @brefDWT_init* @paramnone* @retvalnone*****************************************************************************/static inline uint32_t DWT_get_tick(void){return DWT->CYCCNT;}/*** @brief Function for application main entry.*/int main(void){NRF_LOG_INIT(NULL);NRF_LOG_DEFAULT_BACKENDS_INIT();// Init DWTDWT_init();while (true){nrf_delay_ms(1000);NRF_LOG_DEBUG("CYCCNT: %u", DWT_get_tick());}}
程序启动后首先调用使能DWT功能 , 此时DWT的寄存器的值就开始计数了(计数频率就是我们单片机的运行频率(64MHz)所以每秒的值增加 , 寄存器是类型的所以我们可以算出来这个计数器会在67秒溢出 , 从0开始重新计数)
程序主循环中会每隔一秒会通过RTT打印输出当前的值 。
3 电池电压检测、充电检测、电源锁定 电池电压检测
电池电压检测采用的逐次逼近型模数转换器(SAADC)实现 , 的SAADC支持8个通道 , 每个通道可以分别配置到芯片的AIN0到AIN7引脚 , SAADC的特性如下
在官方的SDK中像这类片内外设的硬件抽象层代码都在 SDK//nrfx/文件夹内其中又分为hal和两个层级关系 , hal层的代码是更直接操作硬件寄存器的层是对hal层的更加抽象的再次封装 , 方便大家进行调用 。我们在使用某个片内外设时 , 一般只需要看一下数据手册对这个外设的介绍 , 看看SDK中的例子 , 然后再结合这个外设库的文档就可以进行开发了 。
充电检测
充电检测我们采用通过 IO口检测充电芯片的两个状态IO来进行冲电检测 , 数据手册上的状态IO说明如下图