- 前言
-
- 培训期过, 开始给师兄帮倒忙了. 其中一项呢, 就是写一个KHz级别的方波, 通过GP62引脚输出,参照SIOGPIO芯片手册. 其间尝试了两种方法,
-
-
- 1:直接写一个死循环,在循环中用Stall()函数写延时;
-
-
-
- 2:用定时器,前面绑回调函数,后面SetTimer().
-
-
- 拿示波器一测, 方法二寄了, 波形调不出来. 方法一有时延, 也明显. 这个时延需要计算一下, 大意是去通过RTC计算. 一通查找, 公式大概是算对了, 再理一点RTC相关知识.
(一) RTC定义
-
- RTC, 实时计数器(Real Time Clock). 通过RTC计算时间差,其实是获得时间戳, 再做减法.
-
- 硬件对应的是BIOS主板上面的纽扣电池, 叫做RTC电池或者CMOS电池. 圆圆的那个有嵌入的卡槽, 小板子上是另一种,是黄色胶带包着的很扁.
- (二) RTC应用
-
- 比如, 我写循环, 用Stall()写延时. 但是Stall()调用等也需要时间, 这就造成了误差. 事实上是MS级别的时延. 我要清晰测得这个误差, 可以获取Stall前后时间戳, 再进行计算. 代码如下:
Data = IoRead8(0x705);
while (1)
{
IoWrite8(0x705, 0x02 | Data);
gBS->Stall(250);
IoWrite8(0x705, 0xEB & Data);
gBS->Stall(250);
if (__kbhit(&Key))
{
Tsc2 = EfiReadTsc();
break;
}
}
tarT = (Tsc2 - Tsc1) / 0x18 / (100 * 1000);
-
- 0x18出处找不到了.
-
- 可在EDK2的TscTimerLib下找到相应startTSC和endTSC.
- (三) RTC时序
- 没学通,待补充.