⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 speridll.cpp

📁 Implementing μVision2 DLLs for Visual borland c++ builder
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// SPeriDLL.cpp : Defines the initialization routines for the DLL.
// Sample Peripheral DLL: A/D Converter for ADuC812

#include "stdafx.h"
#include "Agsi.h"
#include "SPeriDLL.h"
#include "PeriDialog.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

//
//	Note!
//
//		If this DLL is dynamically linked against the MFC
//		DLLs, any functions exported from this DLL which
//		call into MFC must have the AFX_MANAGE_STATE macro
//		added at the very beginning of the function.
//
//		For example:
//
//		extern "C" BOOL PASCAL EXPORT ExportedFunction()
//		{
//			AFX_MANAGE_STATE(AfxGetStaticModuleState());
//			// normal function body here
//		}
//
//		It is very important that this macro appear in each
//		function, prior to any calls into MFC.  This means that
//		it must appear as the first statement within the 
//		function, even before any object variable declarations
//		as their constructors may generate calls into the MFC
//		DLL.
//
//		Please see MFC Technical Notes 33 and 58 for additional
//		details.
//

/////////////////////////////////////////////////////////////////////////////
// CSPeriDLLApp

BEGIN_MESSAGE_MAP(CSPeriDLLApp, CWinApp)
	//{{AFX_MSG_MAP(CSPeriDLLApp)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

static AGSICONFIG  AgsiConfig;
struct AGSIFUNCS   Agsi;

DWORD GetFunctionPointers(void) {           // get all function pointers

  Agsi.DefineSFR            = (tAgsiDefineSFR)             GetProcAddress(AgsiConfig.m_hInstance, "AgsiDefineSFR");
  Agsi.DefineVTR            = (tAgsiDefineVTR)             GetProcAddress(AgsiConfig.m_hInstance, "AgsiDefineVTR");
  Agsi.DeclareInterrupt     = (tAgsiDeclareInterrupt)      GetProcAddress(AgsiConfig.m_hInstance, "AgsiDeclareInterrupt");
  Agsi.SetWatchOnSFR        = (tAgsiSetWatchOnSFR)         GetProcAddress(AgsiConfig.m_hInstance, "AgsiSetWatchOnSFR");
  Agsi.SetWatchOnVTR        = (tAgsiSetWatchOnVTR)         GetProcAddress(AgsiConfig.m_hInstance, "AgsiSetWatchOnVTR");
  Agsi.SetWatchOnMemory     = (tAgsiSetWatchOnMemory)      GetProcAddress(AgsiConfig.m_hInstance, "AgsiSetWatchOnMemory");
  Agsi.CreateTimer          = (tAgsiCreateTimer)           GetProcAddress(AgsiConfig.m_hInstance, "AgsiCreateTimer");
  Agsi.DefineMenuItem       = (tAgsiDefineMenuItem)        GetProcAddress(AgsiConfig.m_hInstance, "AgsiDefineMenuItem");

  Agsi.WriteSFR             = (tAgsiWriteSFR)              GetProcAddress(AgsiConfig.m_hInstance, "AgsiWriteSFR");
  Agsi.ReadSFR              = (tAgsiReadSFR)               GetProcAddress(AgsiConfig.m_hInstance, "AgsiReadSFR");
  Agsi.WriteVTR             = (tAgsiWriteVTR)              GetProcAddress(AgsiConfig.m_hInstance, "AgsiWriteVTR");
  Agsi.ReadVTR              = (tAgsiReadVTR)               GetProcAddress(AgsiConfig.m_hInstance, "AgsiReadVTR");
  Agsi.SetSFRReadValue      = (tAgsiSetSFRReadValue)       GetProcAddress(AgsiConfig.m_hInstance, "AgsiSetSFRReadValue");
  Agsi.ReadMemory           = (tAgsiReadMemory)            GetProcAddress(AgsiConfig.m_hInstance, "AgsiReadMemory");
  Agsi.WriteMemory          = (tAgsiWriteMemory)           GetProcAddress(AgsiConfig.m_hInstance, "AgsiWriteMemory");
  Agsi.GetLastMemoryAddress = (tAgsiGetLastMemoryAddress)  GetProcAddress(AgsiConfig.m_hInstance, "AgsiGetLastMemoryAddress");
  Agsi.IsSimulatorAccess    = (tAgsiIsSimulatorAccess)     GetProcAddress(AgsiConfig.m_hInstance, "AgsiIsSimulatorAccess");
  Agsi.SetTimer             = (tAgsiSetTimer)              GetProcAddress(AgsiConfig.m_hInstance, "AgsiSetTimer");
  Agsi.GetClock             = (tAgsiGetClock)              GetProcAddress(AgsiConfig.m_hInstance, "AgsiGetClock");
//  Agsi.GetLogicalClockFactor= (tAgsiGetLogicalClockFactor) GetProcAddress(AgsiConfig.m_hInstance, "AgsiGetLogicalClockFactor");
//  Agsi.GetPhysicalClockRate = (tAgsiGetPhysicalClockRate)  GetProcAddress(AgsiConfig.m_hInstance, "AgsiGetPhysicalClockRate");
//  Agsi.SetPhysicalClockRate = (tAgsiSetPhysicalClockRate)  GetProcAddress(AgsiConfig.m_hInstance, "AgsiSetPhysicalClockRate");
  Agsi.GetProgramCounter    = (tAgsiGetProgramCounter)     GetProcAddress(AgsiConfig.m_hInstance, "AgsiGetProgramCounter");
  Agsi.IsInInterrupt        = (tAgsiIsInInterrupt)         GetProcAddress(AgsiConfig.m_hInstance, "AgsiIsInInterrupt");
  Agsi.IsSleeping           = (tAgsiIsSleeping)            GetProcAddress(AgsiConfig.m_hInstance, "AgsiIsSleeping");
//  Agsi.WakeUp               = (tAgsiWakeUp)                GetProcAddress(AgsiConfig.m_hInstance, "AgsiWakeUp");
  Agsi.StopSimulator        = (tAgsiStopSimulator)         GetProcAddress(AgsiConfig.m_hInstance, "AgsiStopSimulator");
  Agsi.TriggerReset         = (tAgsiTriggerReset)          GetProcAddress(AgsiConfig.m_hInstance, "AgsiTriggerReset");
  Agsi.UpdateWindows        = (tAgsiUpdateWindows)         GetProcAddress(AgsiConfig.m_hInstance, "AgsiUpdateWindows");
  Agsi.HandleFocus          = (tAgsiHandleFocus)           GetProcAddress(AgsiConfig.m_hInstance, "AgsiHandleFocus");

  if ((Agsi.DefineSFR            == NULL) || (Agsi.DefineSFR            == NULL) ||
      (Agsi.DefineVTR            == NULL) || (Agsi.SetWatchOnSFR        == NULL) ||
      (Agsi.SetWatchOnVTR        == NULL) || (Agsi.SetWatchOnMemory     == NULL) ||
      (Agsi.CreateTimer          == NULL) || (Agsi.DefineMenuItem       == NULL) ||
      (Agsi.WriteSFR             == NULL) || (Agsi.ReadSFR              == NULL) ||
      (Agsi.WriteVTR             == NULL) || (Agsi.ReadVTR              == NULL) ||
      (Agsi.SetSFRReadValue      == NULL) || (Agsi.ReadMemory           == NULL) ||
      (Agsi.WriteMemory          == NULL) || (Agsi.GetLastMemoryAddress == NULL) ||
      (Agsi.IsSimulatorAccess    == NULL) || (Agsi.SetTimer             == NULL) ||
      (Agsi.GetClock             == NULL) || /* (Agsi.GetLogicalClockFactor== NULL) || */
//      (Agsi.GetPhysicalClockRate == NULL) || (Agsi.SetPhysicalClockRate == NULL) ||
      (Agsi.GetProgramCounter    == NULL) || (Agsi.DeclareInterrupt     == NULL) ||
      (Agsi.IsInInterrupt        == NULL) || (Agsi.IsSleeping           == NULL) ||
  /*  (Agsi.WakeUp               == NULL)||*/(Agsi.StopSimulator        == NULL) ||
      (Agsi.TriggerReset         == NULL) || (Agsi.UpdateWindows        == NULL) ||
	  (Agsi.HandleFocus          == NULL)) {
    return(FALSE);
  }

  return(1);
}


DWORD DefineAllSFR(void) {           // declare all special function registers and their bits
  BOOL ret = TRUE;

  ret &= Agsi.DefineSFR("ADCCON1",  ADCCON1,  AGSIBYTE, 0);  // If more SFR's are defined, do it in a table
  ret &= Agsi.DefineSFR("ADCCON2",  ADCCON2,  AGSIBYTE, 0);
  ret &= Agsi.DefineSFR("ADCCON3",  ADCCON3,  AGSIBYTE, 0);
  ret &= Agsi.DefineSFR("ADCDATAL", ADCDATAL, AGSIBYTE, 0);
  ret &= Agsi.DefineSFR("ADCDATAH", ADCDATAH, AGSIBYTE, 0);
  ret &= Agsi.DefineSFR("DMAL",     DMAL,     AGSIBYTE, 0);
  ret &= Agsi.DefineSFR("DMAH",     DMAH,     AGSIBYTE, 0);
  ret &= Agsi.DefineSFR("DMAP",     DMAP,     AGSIBYTE, 0);

  // It is only allowed to define bits which are bitaddressable.
  ret &= Agsi.DefineSFR("CS0",      ADCCON2,  AGSIBIT,  0);
  ret &= Agsi.DefineSFR("CS1",      ADCCON2,  AGSIBIT,  1);
  ret &= Agsi.DefineSFR("CS2",      ADCCON2,  AGSIBIT,  2);
  ret &= Agsi.DefineSFR("CS3",      ADCCON2,  AGSIBIT,  3);
  ret &= Agsi.DefineSFR("SCONV",    ADCCON2,  AGSIBIT,  4);
  ret &= Agsi.DefineSFR("CCNOV",    ADCCON2,  AGSIBIT,  5);
  ret &= Agsi.DefineSFR("DMA",      ADCCON2,  AGSIBIT,  6);
  ret &= Agsi.DefineSFR("ADCI",     ADCCON2,  AGSIBIT,  7);

  return(ret);
}


struct vtrlist VTREG[] = {           // VTR's definition: keep this table consistent with defines in SPeriDLL.h
  { "AIN0",   AGSIVTRFLOAT, 0x00000000, NULL },
  { "AIN1",   AGSIVTRFLOAT, 0x00000000, NULL },
  { "AIN2",   AGSIVTRFLOAT, 0x00000000, NULL },
  { "AIN3",   AGSIVTRFLOAT, 0x00000000, NULL },
  { "AIN4",   AGSIVTRFLOAT, 0x00000000, NULL },
  { "AIN5",   AGSIVTRFLOAT, 0x00000000, NULL },
  { "AIN6",   AGSIVTRFLOAT, 0x00000000, NULL },
  { "AIN7",   AGSIVTRFLOAT, 0x00000000, NULL },
  { "TEMP",   AGSIVTRFLOAT, 0x41C80000, NULL },  // 25 癈
  { "VREF",   AGSIVTRFLOAT, 0x40200000, NULL },  // 2.5 V
  { "XTAL",   AGSIVTRLONG,  0x00A8C000, NULL },  // 11.0592MHz oscillator frequency
  { "CONVST", AGSIVTRCHAR,  0x00000001, NULL },
};

DWORD DefineAllVTREG(void) {         // declare all virtual registers
  BOOL ret = TRUE;
  int i;

  for (i = 0; i <= 11; i++) {
    VTREG[i].hVTR = Agsi.DefineVTR(VTREG[i].pName, VTREG[i].Type, VTREG[i].Value);
	if (!VTREG[i].hVTR) ret = FALSE;
  }

  return(ret);
}


AGSIINTERRUPT Interrupt = {     // Table of all Interrupts of this module
// vec    *mess           msfr mmask *mname  rsfr     rmask *rname  esfr  emask *ename  p0sfr p0mask *pname p1sfr p1mask pwl auto_reset
   0x33, "A/D Converter",  0,  0,     "",    ADCCON2, 0x80, "ADCI", IE,   0x40, "EADC", IP,   0x40,  "Pri", 0,    0x00,  7,  1   // ADCI
};


DWORD DefineAllInterrupts(void) {   // declare all interrupts

  if (!Agsi.DeclareInterrupt(&Interrupt)) return(FALSE);

  return(TRUE);
}


AGSITIMER Timer;

DWORD DefineAllWatches(void) {      // define all Watches
  BOOL ret = TRUE;

  ret &= Agsi.SetWatchOnSFR(ADCCON1, AdcConv, AGSIWRITE);
  ret &= Agsi.SetWatchOnSFR(ADCCON2, AdcConv, AGSIWRITE);
  ret &= Agsi.SetWatchOnSFR(ADCCON3, AdcConv, AGSIWRITE);
  ret &= Agsi.SetWatchOnVTR(CONVST,  AdcConv, AGSIWRITE);

  Timer = Agsi.CreateTimer(AdcCompleted);
  if (!Timer) return(FALSE);

  return(ret);
}


DWORD DefineAllMenuEntries(void) {  // declare all peripheral-menu entries and dialogs

  if (!Agsi.DefineMenuItem(&PeriMenu)) return(FALSE);

  return(TRUE);
}


DWORD ResetPeripheral(void) {       // reset all SFR's of this peripheral
  BOOL ret = TRUE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -