Слияние кода завершено, страница обновится автоматически
(*
说明:全志A20的TP底层操作封装类。分为两个部分:
1.TP类,可对寄存器直接操作,单例;
2.TTemperature类,对具体的PWM通道实现了一些功能的简化。
作者:tjCFeng
邮箱:tjCFeng@163.com
更新日期:2014.12.06
*)
unit TP;
{$mode objfpc}{$H+}
interface
uses Classes, SysUtils, A20;
type
TTP = class
private
class var FInstance: TTP;
class function GetInstance: TTP; static;
public
class procedure Release;
class property Instance: TTP read GetInstance;
private
FTP_BASE: ^LongWord;
FTP_CTRL: TGROUP4_REG;
FTP_INT_FIFOC: TGROUP1_REG;
FTP_INT_FIFOS: TGROUP1_REG;
FTP_TPR: TGROUP1_REG;
FTP_CDAT: TGROUP1_REG;
FTEMP_DATA: TGROUP1_REG;
FTP_DATA: TGROUP1_REG;
FTP_IO_CONFIG: TGROUP1_REG;
FTP_PORT_DATA: TGROUP1_REG;
constructor Create;
destructor Destroy; override;
public
property TP_CTRL: TGROUP4_REG read FTP_CTRL;
property TP_INT_FIFOC: TGROUP1_REG read FTP_INT_FIFOC;
property TP_INT_FIFOS: TGROUP1_REG read FTP_INT_FIFOS;
property TP_TPR: TGROUP1_REG read FTP_TPR;
property TP_CDAT: TGROUP1_REG read FTP_CDAT;
property TEMP_DATA: TGROUP1_REG read FTEMP_DATA;
property TP_DATA: TGROUP1_REG read FTP_DATA;
property TP_IO_CONFIG: TGROUP1_REG read FTP_IO_CONFIG;
property TP_PORT_DATA: TGROUP1_REG read FTP_PORT_DATA;
end;
TTemperature = class
private
class var FInstance: TTemperature;
class function GetInstance: TTemperature; static;
public
class procedure Release;
class property Instance: TTemperature read GetInstance;
private
FINTBit: Integer;
FEnBit: Integer;
constructor Create;
destructor Destroy; override;
public
function Temperature: Double;
end;
implementation
const
TP_BASE = $01C25000;
(*TP***************************************************************************)
class function TTP.GetInstance: TTP;
begin
if FInstance = nil then FInstance:= TTP.Create;
Result:= FInstance;
end;
class procedure TTP.Release;
begin
FreeAndNil(FInstance);
end;
constructor TTP.Create;
var Base: LongWord; I: Byte;
begin
inherited Create;
FTP_BASE:= TA20.Instance.GetMMap(TP_BASE);
Base:= LongWord(FTP_BASE) + TA20.Instance.BaseOffset(TP_BASE);
for I:= 0 to 3 do FTP_CTRL[I]:= Pointer(Base + $04 * I);
FTP_INT_FIFOC:= Pointer(Base + $10);
FTP_INT_FIFOS:= Pointer(Base + $14);
FTP_TPR:= Pointer(Base + $18);
FTP_CDAT:= Pointer(Base + $1C);
FTEMP_DATA:= Pointer(Base + $20);
FTP_DATA:= Pointer(Base + $24);
FTP_IO_CONFIG:= Pointer(Base + $28);
FTP_PORT_DATA:= Pointer(Base + $2C);
end;
destructor TTP.Destroy;
begin
TA20.Instance.FreeMMap(FTP_BASE);
inherited Destroy;
end;
(*Temperature******************************************************************)
class function TTemperature.GetInstance: TTemperature;
begin
if FInstance = nil then FInstance:= TTemperature.Create;
Result:= FInstance;
end;
class procedure TTemperature.Release;
begin
FreeAndNil(FInstance);
end;
constructor TTemperature.Create;
begin
inherited Create;
with TTP.Instance do
begin
FTP_CTRL[0]^:= FTP_CTRL[0]^ and not (($1 shl 22) or ($3 shl 20) or ($FFFF shl 0));
FTP_CTRL[0]^:= FTP_CTRL[0]^ or (($0 shl 22) or ($1 shl 20) or ($7 shl 16) or ($3F shl 0));
FTP_CTRL[1]^:= FTP_CTRL[1]^ and not ($1 shl 3);
FTP_CTRL[1]^:= FTP_CTRL[1]^ or (($1 shl 7) or ($1 shl 4));
FTP_TPR^:= $00000FFF;
end;
FINTBit:= ($1 shl 18);
FEnBit:= ($1 shl 16);
end;
destructor TTemperature.Destroy;
begin
inherited Destroy;
end;
function TTemperature.Temperature: Double;
begin
with TTP.Instance do
begin
FTP_INT_FIFOS^:= FTP_INT_FIFOS^ or FINTBit;
FTP_INT_FIFOC^:= FTP_INT_FIFOC^ or FINTBit;
FTP_TPR^:= FTP_TPR^ or FEnBit;
while (FTP_INT_FIFOS^ and FINTBit) <> FINTBit do ;
Result:= FTEMP_DATA^ * 85 / 4096;
FTP_INT_FIFOC^:= FTP_INT_FIFOC^ and not FINTBit;
FTP_TPR^:= FTP_TPR^ and not FEnBit;
end;
end;
finalization
TTP.Instance.Release;
end.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарий ( 0 )