Files
kunlun/dtest/dtest3/kl3_rtc_test
2024-09-28 14:24:04 +08:00
..
2024-09-28 14:24:04 +08:00
2024-09-28 14:24:04 +08:00
2024-09-28 14:24:04 +08:00

RTC测试例程说明文档

本测试程序用于测试RTC基本功能。

RTC简介

RTC timerreal-time clock timer即实时时钟定时器通过内部计数器计数到指定值来产生定时中断指定值可以由软件修改。

RTC特性

kl3 RTC具有如下特性

  • 支持32bit的计数数值只支持向上计数。
  • 支持设置计数补偿值。
  • 支持软件暂停计数和清零。
  • 支持单周期和多周期计数模式。
  • 支持两个timer级联成一个64bit counter mode此时timer1作为计数值高32bittimer0作为计数值低32bit。
  • 支持3种工作模式。
    1. timer mode计数值到达阈值之后停止计数。
    2. repeat mode计数值到达阈值是产生中断并清除counter重新计数。
    3. freerun mode在计数达到阈值后产生中断但是不停止计数。
  • 支持timer计数产生中断之后软件直接修改阈值产生下一个中断。
  • 支持auto-reload模式软件可以直接改写counter当前的计数值。

测试例程说明

rtc测试例程使用到的外设包含rtc、uart、gptimer。

  • rtc测试对象测试其计数、中断、级联等基础功能。
  • uart使用uart0实现调试信息打印接收case配置信息等与PC的交互功能。
  • gptimer使用gptimer0用于测试时延时方便判断rtc是否正常工作。

rtc测试例程遵循自动化测试框架在例程执行之后初始化串口0通过串口发送“start”字段到PC并等待PC发送“config”字段来获取本次需要执行的测试case如果在规定时间内9s没有收到测试case信息则默认测试所有的case。

在获取到case组合之后初始化rtc以及gptimer并根据case组合开始执行测试case。

rtc的测试较为简单测试用的例程大多数使用gptimer延时阻塞式并对比延时前后的计数值的方式来判定rtc是否正常工作。已知rtc时钟为32768则延时1s的情况下rtc应该累计32768左右的计数值但是据rtc ower戴万描述由于操作rtc存在跨时间域的问题即rtc时钟主频和core主频不一致在操作rtc时可能会导致rtc丢失几个周期的计数值

case0获取和设置计数值

在rtc timer配置为非级联模式下分别获取timer0和timer1的计数值并通过gptimer延时阻塞式1秒再次获取timer0和timer1的技术值通过分别对比timer对应的计数值差值如果差值小于32768则认为rtc工作异常因为代码执行以及打印需要额外的时间

设置timer0和timer1的计数值为0延时1秒读取timer0和timer1的计数值如果计数值小于32768则认为rtc设置计数值失败。

测试结果正常。

case1计数暂停和恢复

在rtc timer配置为非级联模式下读取timer0和timer1的计数值然后暂停rtc计数延时1秒之后从新读取计数值如果两次读取的计数值差值大于32768则认为rtc暂停失败。

暂停成功后回复rtc计数延时1秒之后重新读取rtc计数判断延时前后的rtc计数值差值小于32768则认为恢复失败。

测试结果正常。

case2rtc stop和start

测试方法和case1一致。测试结果正常。

case3rtc中断

在rtc timer配置为非级联模式下将scratch0寄存器置0使能timer中断配置对应的中断处理函数通过配置timer计数值使其能够在3秒后达到阈值并触发中断在中断处理函数中将scratch0寄存器对应的bit置位timer0置位bit0timer1置位bit1并清除中断标志。在程序中等待scratch0寄存器变为0x3如果7秒内scratch0寄存器值不为0x3则判定测试失败。

这里使timer在3秒内达到阈值用了两种办法

  1. timer0阈值配置为0xffffffff配置补偿值为阈值减去当前计数值再减去332768使其3秒后能达到阈值顺便测试了补偿值功能

    补偿值不直接累加到计数值上,而是存在于额外的寄存器中,所以获取到的计数值等于计数器寄存器值加上补偿寄存器值

  2. timer1计数值配置为0阈值配置为3*32768。

测试结果正常。

case4级联计数器

在kunlun大code中级联为64bit计数器才是rtc真正的用法。根据实际使用场景这里只需要保证64bit计数值能正常工作即可。

在测试时将rtc重新初始化为级联模式并配置timer0的计数值为0xffffffff配置timer1的计数值为0以确保timer0计数超出阈值之后timer1作为高32bit能正常累加。延时1秒读取级联计数值如果高32bit不等于1或者计数值小于0xffffffff加32768则判定测试失败。

测试结果正常。

case5计数精准度

这个测试较为简单在级联模式下直接使用gptimer延时并在延时前后读取timer计数值并打印在串口工具端开启日志时间戳功能。通过判断时间戳和打印的计数值差值来判定rtc计数精准度这个测试需要人工参与因此不加入自动化测试流程中。

需要注意的是,两次读取计数值之间尽量不要存在多余的流程和打印,仅保留一个简单打印用于触发串口工具的时间戳即可。

case6看门狗复位时rtc行为测试

这个测试主要验证rtc在看门狗复位是配置寄存器的值是否会改变以及计数值是否继续累加。

测试方法较为简单在执行完中断测试之后中断测试汇总修改了较多的寄存器dump rtc寄存器的值然后触发看门狗复位复位后使用gdb dump rtc寄存器的值然后对比两次寄存器值即可预期的结果是计数值继续累加但是配置寄存器的值不变化。

测试结果正常,符合预期。