本帖最后由 candao2 于 2023-7-28 10:32 编辑
#申请原创# 概述: 本篇从本地RTC和RTT日志输出开始,因为验证码的计算严格依赖于时间,而整个项目运行过程和结果都需要RTT日志来显示,为了将运行过程显示的更加精确,包括每一条通信指令的发出和完成时间,所以我将在每一条输出的RTT日志上打上时间戳。有了功能强大的日志输出功能,你会发现,在项目开发,测试,生产,问题产品返厂分析等各个流程发挥重要作用。 项目目录结构如下:firmware目录是国民的固件库文件,SNTP是我项目文件 下图是SNTP目录下的文件,Config和RTT是直接从J-Link复制过来的目录,sntp是存放sntp协议文件,totp存放算出验证码的文件,inc和src存放RTC,LPUART,按键配置,以及主程序的代码源文件和头文件。 开发环境:Keil5.30 ,国民N32G43XCL-STB 串口连接 NB-IOT模块
一RTC的工作 在src目录下新建源文件rtc.c: 存放RTC的驱动配置和所有有关时间操作的代码。
把SDK例程中的以下函数都复制到rtc.c,在这里我把这些函数都封装在了RTC_init函数中,这样直接在主函数中调用RTC_init就可以了。
为了便于观察设置RTC默认时间是否成功,因为SDK例程中已经加入了串口的log显示,所以我把log.c,log.h文件也加入到工程中,并在RTC_init函数的第一行加入log_init();另外要在rtc.c顶部包含log.h。 串口就是默认PA9作TX, 如下图:我设置的日期是2023-01-12时间是4:22:30,记住这个时间,因为在RTC初始化成功之后RTT输出日志上的时间戳就是这个时间。
二RTT的工作 把RTT日志输出的功能移植到国民mcu上,论坛上已有说明,这里不再多说,主要说我自己对RTT日志输出函数SEGGER_RTT_printf的封装。 在RTT目录中新建asiacom_rtt.h文件,写入以下代码,如下图,用宏定义的方式封装了一个带时间戳日志输出的宏,这个宏增加了__FUNCTION__, __LINE__参数,这样当调用ASIACOM_RTT_LOG时,ASIACOM_RTT_LOG输出日志的同时会自动输出此条日志所在的那个函数和所在行数。 另外在调用ASIACOM_RTT_LOG时,只需包含asiacom_rtt.h,不用再包含RTT自带的头文件SEGGER_RTT.h,这样就实现了解耦合,即当不想通过RTT输出日志,比如通过串口输出日志,可以直接把SEGGER_RTT_printf替换成log.c文件中的log_info函数,这样就实现了日志输出平台的切换。试想如果没有这层封装,所有直接调用SEGGER_RTT_printf的地方都得替换成log_info,那样修改的地方就会很多,很不安全。
上图中的get_BEIJING_time_from_rtc()函数是定义在rtc.c中, 如下图,就是读取RTC时间,组装成一个字符串放在参数time指定的数组中
下面我在3个地方加入ASIACOM_RTT_LOG("iam here......");如下图
一切就绪,下面是看看输出效果的时候了,打开J-Link RTT Viewer ,在开发板上连接J-Link,烧录编译的固件,可以看到3个log分别在哪个函数中,分别在哪一行,前面2个log是在rtc初始化之前,所以时间戳是2000-01-01T00::00:00: 在main函数 114行的log是在rtc初始化之后,所以是rtc默认的时间。
|