读CPU温度的资料

来源:互联网 发布:it难学吗 编辑:程序博客网 时间:2024/04/29 02:51

http://blog.csdn.net/aasmfox/article/details/6610625

 

PMU_SC equ 6Ch               ;命令端口
PMU_DATA                   equ             68h               ;数据端口
RD_EC_SMI                   equ 80h               ;读寄存器命令
POLLING_DATA equ 0E7h             ;CPU温度寄存器号
看上面的定义,PMU寄存器读取的步骤是这样的:
1.等待输入缓冲器空,即PMU将上一条命令处理完毕;
1.将命令(RD_EC_SMI)写入命令端口(PMU_SC);
2.等待输入缓冲器空,即PMU将命令(RD_EC_SMI)处理完毕;
3.将要访问的寄存器号(POLLING_DATA)写入数据端口(PMU_DATA);
4.等待输出缓冲器满,即PMU将从寄存器(POLLING_DATA)读出的数据放到输出缓冲器;
5.将数据从数据端口(PMU_DATA)读出。
(说明,这里的输入输出缓冲是指的PMU的缓冲。)
这样,就完成了一次读操作,写操作和其类似。

具体代码如下:
;AL-----CPU   Temperature
GetCPUTempe   proc
pusha
pushf
cli
mov dx,PMU_SC
mov al,RD_EC_SMI
call pmuWait4IBE ;Must   have
out dx,al

mov dx,PMU_DATA
mov al,POLLING_DATA
call pmuWait4IBE ;Must   have
out dx,al

mov dx,PMU_DATA
call pmuWait4OBF ;Must   have
in al,dx ;Get   Temperature
sti
popf
popa
GetCPUTempe   endp
;#########################################################
pmuWait4IBE proc
PUSH AX
PW4IBE:
IN AL,   06CH ;   Read   PMU   status
TEST AL,   2 ;   Is   Input   Buffer   Empty?
JNZ PW4IBE ;   Jmp   if   no
POP AX
ret
pmuWait4IBE endp;END   OF   PMUWAIT4IBE
;#########################################################
pmuWait4OBF proc
PUSH AX
PW4OBF:
IN AL,   06CH ;   Read   PMU   status
TEST AL,   1 ;   Is   Output   Buffer   Full?
JZ PW4OBF ;   Jmp   if   no
POP AX
ret
pmuWait4OBF endp;END   OF   PMUWAIT4OBF
;#########################################################
上面pmuWait4IBE、pmuWait4OBF两个函数就是等待缓冲器的函数,其中都直接读取了命令端口6Ch(PMU_SC)的内容,关于读出的内容的说明可以参见我发的PMU的说明的第18页下面的那张表。

下面讲一下怎样把上面的代码用vc实现(讲的不好不要用臭鸡蛋扔我啊!):
众所周知,windows下无法直接读写硬件端口,要想实现上面的程序,我们只有借助强大的winio。
在VC中新建个工程,将winio压缩包中的winio.h包括进去,按alt+F7,在lib里面把winio.lib加进去(班门弄斧了^_^)。其实winio的压缩包中有详细的说明:
程序一开始先调用InitializeWinio(),结束时再调用ShutdownWinio()。呵呵!这就不用我多说了。
我们这个程序主要用到的winio的函数是
GetPortVal(WORD   wPortAddr,   PDWORD   pdwPortVal,   BYTE   bSize);//读端口
SetPortVal(WORD   wPortAddr,   DWORD   dwPortVal,   BYTE   bSize);//写端口
看了函数定义,各位高手肯定知道怎么用了吧!^_^

by zkxz

 

原创粉丝点击