Skip to content

Latest commit

 

History

History
115 lines (87 loc) · 5.71 KB

038 实时时钟.md

File metadata and controls

115 lines (87 loc) · 5.71 KB

实时时钟

RTC Real Time Clock 实时时钟

  1. 轮询:时钟中断的时候不停的去检测
  2. 实时中断

寄存器 A (读写)

第 7 位

正处于更新过程中 (Update In Progress, UIP). 该位可以作为一个状态进行监视,CMOS RAM 中的时间和日期信息会由 RTC 周期性地更新,在此期间,用户程序不应当访问它们。对当前寄存器的写入不会改变此位的状态

  • 0: 更新周期至少在 488 微秒内不会启动,换句话说,此时访问 CMOS RAM 中的时间、日历和闹钟信息是安全的
  • 1: 正处于更新周期,或者马上就要启动

如果寄存器 B 的 SET 位不是 1 , 而且在分频电路已正确配置的情况下,更新周期每秒发生一次,在此期间,会增加保存的日期和时间、检查数据是否因超出范围而溢出(比如,31 号之后是下月 1 号,而不是 32 号),还要检查是否到了闹钟时间,最后,更新之后的数据还要写回原来的位置;

更新周期至少会在 UIP 置为 1 后的 488μs 内开始,而且整个周期的完成时间不会多于 1984 μs, 在此期间,和日期时间有关的存储单元 (0x00 ~ 0x09) 会暂时脱离外部总线。

为避免更新和数据遭到破坏,可以有两次安全地从外部访问这些单元的机会:当检测到更新结束中断发生时, 可以有差不多999ms 的时间用于读写有效的日期和时间数据:如果检测到寄存器 A 的 UIP 位为低 (0) ,那么这意味若在更新周期开始前,至少还有 488μs 的时间。

第 6 ~ 4 位

分频电路选择 (Division Chain Select),这 3 位控制晶体振荡器的分频电路。系统将其初始化到 010, 为 RTC 选择一个 32.768kHz 的时钟频率。

第 3 ~ 0 位

速率选择 (Rate Select, RS),选择分频电路的分节点。如果寄存器 B 的 PIE 位被设置的话,此处的选择将产生一个周期性的中断信号,否则将设置寄存器 C 的 PF 标志位;默认是 0110,976.S62S μs

3 ~ 0 位 时间片
0000 从不触发中断
0001 3.90625 ms
0010 7.8125 ms
0011 122.070 μs
0100 244.141 μs
0101 488.281 μs
0110 976.5625 μs
0111 1.953125 ms
1000 3.90625 ms
1001 7.8125 ms
1010 5.625 ms
1011 1.25 ms
1100 62.5 ms
1101 125 ms
1110 250 ms
1111 500 ms

寄存器 B (读写)

  • 7:更新周期禁止(Update Cycle Inhibit, SET)。允许或者禁止更新周期
    • 0: 更新周期每秒都会正常发生
    • 1: 中止当前的更新周期,井且此后不再产生更新周期,此位置 1 时,BIOS 可以安全地初始化日历和时间
  • 6:周期性中断允许(Periodic Interrupt Enable, PIE)
    • 0: 不允许
    • 1: 当达到寄存器 A 中 RS 所设定的时间基准时,允许产生中断
  • 5:闹钟中断允许(Alarm Interrupt Enable, AIE)
    • 0: 不允许
    • 1: 允许更新周期在到达闹钟点并将 AF 置位的同时,发出一个中断
  • 4:更新结束中断允许(Update-Ended Interrupt Enable, UIE)
    • 0: 不允许
    • 1: 允许在每个更新周期结束时产生中断
  • 3:方波允许(Square Wave Enable, SQWE) 该位保留不用,只是为了和早期的 Motorola 146818B 实时时钟芯片保持一致
  • 2:数据模式(Data Mode, DM) 该位用于指定二进制或者 BCD 的数据表示形式
    • 0: BCD
    • 1: Binary
  • 1:小时格式(Hour Format, HOURFORM)
    • 0: 12 小时制,在这种模式下,第 7 位为 0 表示上午(AM),为 1 表示下午(PM)
    • 1: 24 小时制
  • 0:老软件的夏令时支持(Daylight Savings Legacy Software S叩port, DSLSWS),该功能已不再支持,该位仅用于维持对老软件的支持,并且是无用的

寄存器 C (只读)

  • 7:中断请求标志(Interrupt Request Flag, IRQF)

    $IRQF = (PF \times PIE) + (AF \times AIE) + (UF \times UFE)$

    以上,加号表示逻辑或,乘号表示逻辑与。该位被设置时,表示肯定要发生中断,对寄存器 C 的读操作将导致此位清零

  • 6:周期性中断标志( Periodic Intenupt Flag, PF)

    • 若寄存器 A 的 RS 位为 0000, 则此位是 0
    • 否则是 1,对寄存器 C 的读操作将导致此位清零
    • 注:程序可以根据此位来判断 RTC 的中断原因
  • 5:闹钟标志( Alum Flag, AF)

    • 当所有闹点同当前时间相符时,此位是 1
    • 对寄存器 C 的读操作将导致此位清零
    • 注:程序可以根据此位来判断 RTC 的中断原因
  • 4 更新结束标志 (Update-Ended Flag, UF)

    • 紧接着每秒一次的更新周期之后,RTC 电路立即将此位置 1
    • 对寄存器 C 的读操作将导致此位清零
    • 注:程序可以根据此位来判断 RTC 的中断原因
  • 3 ~ 0:保留,总是报告 0

寄存器 D (读写)

  • 7:有效 RAM 和时间位(Valid RAM and Time Bit, VRT)
    • 在写周期,此位应当始终写 0
    • 在读周期,此位回到 1
    • 在RTC 加电正常时,此位被硬件强制为 1
  • 6:保留,总是返回 0.并且在写周期总是置 0
  • 5 ~ 0:日期闹钟(Date Alarm) ,这些位保存着闹钟的月份数值

参考文献

  1. 李忠 & 王晓波 & 余洁 - 《X86汇编语言》,电子工业出版社
  2. Motorola MC146818A Datasheet
  3. https://wiki.osdev.org/RTC
  4. http://bos.asmhackers.net/docs/timer/docs/cmos.pdf
  5. https://web.archive.org/web/20150514082645/http://www.nondot.org/sabre/os/files/MiscHW/RealtimeClockFAQ.txt
  6. https://www.qemu.org/docs/master/system/qemu-manpage.html?highlight=rtc%20localtime