概述:
本篇从本地RTC和RTT日志输出开始,因为验证码的计算严格依赖于时间,而整个项目运行过程和结果都需要RTT日志来显示,为了将运行过程显示的更加精确,包括每一条通信指令的发出和完成时间,所以我将在每一条输出的RTT日志上打上时间戳。有了功能强大的日志输出功能,你会发现,在项目开发,测试,生产,问题产品返厂分析等各个流程发挥重要作用。
开发环境:Keil 5.30 ,国民N32G43XCL-STB 串口连接 NB-IOT模块
项目目录结构如下:firmware目录是国民的固件库文件,SNTP是我项目文件
下图是SNTP目录下的文件,Config和RTT是直接从J-Link复制过来的目录,sntp是存放sntp协议文件,totp存放算出验证码的文件,inc 和src存放RTC,LPUART,按键配置,以及主程序的代码源文件和头文件。
一 RTC的工作
在src目录下新建源文件rtc.c: 存放RTC的驱动配置和所有有关时间操作的代码。
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("i am here......");如下图
一切就绪,下面是看看输出效果的时候了,打开J-Link RTT Viewer ,在开发板上连接J-Link,烧录编译的固件,可以看到3个log分别在哪个函数中,分别在哪一行,前面2个log是在rtc初始化之前,所以时间戳是2000-01-01T00::00:00: 在main函数 114行的log是在rtc初始化之后,所以是rtc默认的时间。
|