MicroPython标准库函数utime
原创版权归山东萝卜科技有限公司所有,转载必须以链接形式注明作者和原始出处。
初始时刻: Unix 使用 POSIX 系统标准,从 1970-01-01 00:00:00 UTC开始。嵌入式程序从 2000-01-01 00:00:00 UTC 开始。
日期/时间: 需要一个实时时钟 (RTC)。在底层系统 (包括一些 RTOS 中),RTC 已经包含在其中。设置时间是通过 OS/RTOS 而不是 MicroPython 完成,查询日期/时间也需要通过系统 API。对于裸板系统时钟依赖于 machine.RTC() 对象。设置时间通过 machine.RTC().datetime(tuple) 函数,并通过下面方式维持:
后备电池 (可能是选件、扩展板等)。
使用网络时间协议 (需要用户设置)。
每次上电时手工设置 (大部分只是在硬复位时需要设置,少部分每次复位都需要设置)。
如果实际时间不是通过系统/MicroPython RTC维持,那么下面函数结果可能不是和预期的相同。
函数
utime.localtime([secs])
从初始时间的秒转换为元组: (年, 月, 日, 时, 分, 秒, 星期, yearday) 。如果 secs 是空或者 None,那么使用当前时间。
年包括了 (如 2014).
月是 1-12
日是 1-31
小时是 0-23
分钟是 0-59
秒是 0-59
星期是 0-6 代表周一到周日
yearday 是 1-366
utime.mktime()
时间的反函数,它的参数是完整8参数的元组,返回值是从 Jan 1, 2000开始的秒数。
utime.sleep(seconds)
休眠指定的时间(秒),Seconds 可以是浮点数。注意有些版本的 MicroPython 不支持浮点数,为了兼容可以使用 sleep_ms() 和 sleep_us() 函数。
utime.sleep_ms(ms)
延时指定毫秒,参数不能小于0。
utime.sleep_us(us)
延时指定微秒,参数不能小于0。
utime.ticks_ms()
返回不断递增的毫秒计数器,在某些值后会重新计数(未指定)。计数值本身无特定意义,只适合用在 ticks_diff().
utime.ticks_us()
和上面类似,只是返回微秒。
utime.ticks_cpu()
和 ticks_ms/ticks_us 类似,具有更高精度 (使用 CPU 时钟)。
utime.ticks_diff(old, new)
计算两次调用 ticks_ms(), ticks_us(), 或 ticks_cpu()之间的时间。因为这些函数的计数值可能会回绕,所以不能直接相减,需要使用 ticks_diff() 函数。“旧” 时间需要在 “新” 时间之前,否则结果无法确定。这个函数不要用在计算很长的时间 (因为 ticks_*() 函数会回绕,通常周期不是很长)。通常用法是在带超时的轮询事件中调用:
# Wait for GPIO pin to be asserted, but at most 500us start = time.ticks_us() while pin.value() == 0: if time.ticks_diff(start, time.ticks_us()) > 500: raise TimeoutError
utime.time()
返回从开始时间的秒数(整数),假设 RTC 已经按照前面方法设置好。如果 RTC 没有设置,函数将返回参考点开始计算的秒数 (对于 RTC 没有后备电池的板子,上电或复位后的情况)。如果你开发便携版的 MicroPython 应用程序,你不要依赖函数来提供超过秒级的精度。如果需要高精度,使用 ticks_ms() 和 ticks_us() 函数。如果需要日历时间,使用不带参数的 localtime() 是更好选择。
与 CPython 的不同
在 CPython 中,这个函数用浮点数返回从 Unix 开始时间(1970-01-01 00:00 UTC)的秒数,通常是毫秒级的精度。在 MicroPython 中,只有 Unix 版才使用相同开始时间,如果允许浮点精度,将返回亚秒精度。嵌入式硬件通常没有用浮点数表示长时间访问和亚秒精度,所以返回值是整数。一些嵌入式系统硬件不支持 RTC 电池供电方式,所以返回的秒数是从最后上电、或相对某个时间、以及特定硬件时间 (如复位)。
示例代码
import pyb,micropython,machine,utime rtc = pyb.RTC() rtc.datetime((2017, 5, 1, 4, 13, 0, 0, 0)) print(utime.localtime())