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

📄 pwmdirver.cpp

📁 pwmdirver
💻 CPP
📖 第 1 页 / 共 2 页
字号:
RETAILMSG (1,(TEXT("v_pCLKPWRegs is not mapped\n\r")));
return dwRet;
}
RETAILMSG (1,(TEXT("v_pCLKPWRegs is mapped to %x\n\r"), v_pCLKPWRegs));




v_pINTRegs = (volatile INTreg*)VirtualAlloc(0, sizeof(INTreg), MEM_RESERVE, PAGE_NOACCESS);
RETAILMSG (1,(TEXT("PWM_Init:33333333!\n\r")));
if (v_pINTRegs == NULL) 
{
     RETAILMSG (1,(TEXT("v_pINTRegs is not allocated\n\r")));
      return dwRet;
}
if (!VirtualCopy((PVOID)v_pINTRegs, (PVOID)INT_BASE, sizeof(INTreg), PAGE_READWRITE|PAGE_NOCACHE)) 
{
RETAILMSG (1,(TEXT("v_pINTRegs is not mapped\n\r")));
return dwRet;
}
RETAILMSG (1,(TEXT("v_pINTRegs is mapped to %x\n\r"), v_pINTRegs));



v_pPWMRegs= (volatile PWMreg*)VirtualAlloc(0, sizeof(PWMreg), MEM_RESERVE, PAGE_NOACCESS);
RETAILMSG (1,(TEXT("PWM_Init:4444444!\n\r")));
if (v_pPWMRegs == NULL) 
{
     RETAILMSG (1,(TEXT("v_pPWMRegs is not allocated\n\r")));
      return dwRet;
}
if (!VirtualCopy((PVOID)v_pPWMRegs, (PVOID)PWM_BASE, sizeof(PWMreg), PAGE_READWRITE|PAGE_NOCACHE)) 
{
RETAILMSG (1,(TEXT("v_pPWMRegs is not mapped\n\r")));
return dwRet;
}
RETAILMSG (1,(TEXT("v_pPWMRegs is mapped to %x\n\r"), v_pPWMRegs));

    // PWM_CLKDIVN=(ULONG)MmMapIoSpace(CLKDIVN,4,FALSE);
     //PWM_MPLLCON=(ULONG)MmMapIoSpace(MPLLCON,4,FALSE);
	 //PWM_GPBCON=(ULONG)MmMapIoSpace(GPBCON,4,FALSE);
	 //PWM_GPBUP=(ULONG)MmMapIoSpace(GPBUP,4,FALSE);
	 //PWM_TCFG0=(ULONG)MmMapIoSpace(TCFG0,4,FALSE);
	 //PWM_TCFG1=(ULONG)MmMapIoSpace(TCFG1,4,FALSE);
	 //PWM_TCNTB0=(ULONG)MmMapIoSpace(TCNTB0,4,FALSE);
	 //PWM_TCMPB0=(ULONG)MmMapIoSpace(TCMPB0,4,FALSE);
	 //PWM_TCON=(ULONG)MmMapIoSpace(TCON,4,FALSE);
   
     // Create an event
     RETAILMSG (1,(TEXT("PWM_Init:555555!\n\r")));
     Interruptevent = CreateEvent(NULL, FALSE, FALSE, NULL);//创建事件
     RETAILMSG (1,(TEXT("PWM_Init:66666\n\r")));
     if (Interruptevent == NULL) 
     {
           RETAILMSG(1, (TEXT("DEMO: Event creation failed!!!\r\n")));
            dwRet=1;
           return  dwRet;
     }
    //将事件和中断关联起来
    if ( !InterruptInitialize(SysInt,Interruptevent,NULL,0)) 
     {
           RETAILMSG (1, (TEXT("DEMO: InterruptInitialize failed!!!\r\n")));
           dwRet=1;
           return  dwRet;
     }
     RETAILMSG (1,(TEXT("PWM_Init:END!\n\r")));
     return dwRet;
}

//主要完成一些资源的释放
BOOL PWM_Deinit (DWORD hDeviceContext)
{

BOOL bRet=TRUE;

//MmUnmapIoSpace((void *)PWM_CLKDIVN,4);
//MmUnmapIoSpace((void *)PWM_MPLLCON,4);
//MmUnmapIoSpace((void *)PWM_GPBCON,4);
//MmUnmapIoSpace((void *)PWM_GPBUP,4);
//MmUnmapIoSpace((void *)PWM_TCFG0,4);
//MmUnmapIoSpace((void *)PWM_TCFG1,4);
//MmUnmapIoSpace((void *)PWM_TCNTB0,4);
//MmUnmapIoSpace((void *)PWM_TCMPB0,4);
//MmUnmapIoSpace((void *)PWM_TCON,4);

//RETAILMSG(1,TXET("MYPWM:PWM_Deinit!")));
RETAILMSG(1, (TEXT("MYPWM:PWM_Deinit!\r\n")));

return bRet;
}

//主要完成系统电源和时钟管理,一些寄存器值的初始化,GPBCON TCMTB0 TCNTBO TCFG0 TCFG1
DWORD PWM_Open(DWORD hDeviceContext,DWORD AccessCode,DWORD ShareMode)
{
RETAILMSG (1,(TEXT("PWM_Open:ENTER!\n\r")));
DWORD dwRet=0;
// hdivn,pdivn FCLK:HCLK:PCLK
     //     0,0         1:1:1 
     //     0,1         1:1:2 
     //     1,0         1:2:2
     //     1,1         1:2:4
//v_pCLKPWRegs->rCLKDIVN= (1<1)|1; //     1,1     1:2:4
  v_pCLKPWRegs->rCLKDIVN|=0x03;
RETAILMSG (1,(TEXT("PWM_Open:1111111!\n\r")));
v_pCLKPWRegs->rMPLLCON|= (0xa1<<12)|(0x3<<4) | 0x1; // FCLK=202.8MHz
RETAILMSG (1,(TEXT("PWM_Open:222222222!\n\r")));                        
//完成控制寄存器值的写,GPBCON TCMTB0 TCNTBO TCFG0 TCFG1

v_pIOPRegs->rGPBCON&=~0x03; //将GPB对应的设置为TOUT0
//v_pIOPRegs->rGPBCON=0x5556a;
RETAILMSG (1,(TEXT("PWM_Open:333333!\n\r")));
v_pIOPRegs->rGPBCON|=0x02;
RETAILMSG (1,(TEXT("PWM_Open:4444444!\n\r")));
v_pIOPRegs->rGPBUP|= 0x4;
RETAILMSG (1,(TEXT("PWM_Open:5555555!\n\r")));
v_pPWMRegs->rTCFG0=255; //预分频设置
RETAILMSG (1,(TEXT("PWM_Open:6666666!\n\r")));
v_pPWMRegs->rTCFG1=0x01;//分频设置;
RETAILMSG (1,(TEXT("PWM_Open:777777!\n\r")));
v_pPWMRegs->rTCNTB0=160; //给两个缓冲器//赋值
RETAILMSG (1,(TEXT("PWM_Open:888888!\n\r")));
v_pPWMRegs->rTCMPB0=110;
RETAILMSG (1,(TEXT("PWM_Open:999999!\n\r")));
//必须返回以个不为空的句柄
dwRet=1;
RETAILMSG (1,(TEXT("PWM_Open:END!\n\r")));
return dwRet;
}


//停止PWM工作
BOOL PWM_Close(DWORD hOpenContext)
{
BOOL dwRet=TRUE;
v_pPWMRegs->rTCON=0x500000;
RETAILMSG (1,(TEXT("PWM_Close:ENTER!\n\r")));
return dwRet;
}

//以下3个函数暂时不执行任何操作,到时加一些调试输出即可
BOOL PWM_IOControl(DWORD hOpenContext,DWORD dwCode,PBYTE pBufIn,DWORD 
dwLenIn,PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut)
{
BOOL bRet=TRUE;
 RETAILMSG (1, (TEXT("MYPWM:PWM_IOControl!\r\n")));
//RETAILMSG(1,TXET("MYPWM:PWM_IOControl!")));
return bRet;
}
void PWM_PowerUp(DWORD hDeviceContext)
{
	RETAILMSG (1, (TEXT("MYPWM:PWM_PowerUp!\r\n")));
//RETAILMSG(1,TXET("MYPWM:PWM_PowerUp!")));
}

void PWM_PowerDown(DWORD hDeviceContext)
{
RETAILMSG (1, (TEXT("MYPWM:PWM_PowerDownt!\r\n")));	
// RETAILMSG(1,TXET("MYPWM:PWM_PowerDownt!")));
}

//PWM_Read 函数完成的功能是中断服务线程的编写,首先创建一个线程,该线程的任务是等待中断并返回。
DWORD PWM_Read(DWORD hOpenContext, LPVOID  pBuffer, DWORD Count)
{
	RETAILMSG (1, (TEXT("PWM_Read:ENTRY!\r\n")));
	g_htIST = CreateThread(NULL,//CE Has No Security 
		0,//No Stack Size 
		ThreadIST,// Interrupt Thread 
		NULL,// No Parameters 
		CREATE_SUSPENDED,// Create Suspended until we are done 
		dwThreadID // Thread Id 
	); 
	RETAILMSG (1, (TEXT("PWM_Read:1111111!\r\n")));
	if( !g_htIST )return 0; 
	// Set the thread priority to real time 
	int m_nISTPriority = 251; 
	if(!CeSetThreadPriority( g_htIST, m_nISTPriority)) 
	{
		RETAILMSG(1,(TEXT("ADC_READ:Failed setting Thread Priority.\r\n")));
		return 0; 
	}
	ResumeThread(g_htIST);
	DWORD ReturnValue;
	RETAILMSG (1, (TEXT("PWM_Read:222222!\r\n")));
	ReturnValue=WaitForSingleObject(g_htIST,INFINITE);//等待线程返回
	RETAILMSG (1, (TEXT("PWM_Read:333333!\r\n")));
	if(ReturnValue==WAIT_OBJECT_0)//如果正常返回
	{
		/*CRITICAL_SECTION csMyCriticalSection;
		InitializeCriticalSection(&csMyCriticalSection);
		EnterCriticalSection(&csMyCriticalSection);
		RETAILMSG (1, (TEXT("PWM_Read:4444444444!\r\n")));
		v_pPWMRegs->rTCNTB0=80;
		v_pPWMRegs->rTCMPB0=40;
		RETAILMSG (1, (TEXT("PWM_Read:55555555!\r\n")));
		LeaveCriticalSection(&csMyCriticalSection);*/
	
		RETAILMSG (1, (TEXT("PWM_Read:666666666!\r\n")));
		return  0;
	}
	else  if(ReturnValue==WAIT_TIMEOUT)//如果等待超时
	{
		RETAILMSG (1, (TEXT("PWM_Read:WAIT_TIMEOUT!\r\n")));
		TerminateThread(g_htIST,0);//终止进程
		return  0;
	}
	else   //其它情况
	{
		//发送调试信息
		RETAILMSG(1,(TEXT("Do not Know What Was Wrong!\r\n")));
		return 0;
	}
	RETAILMSG (1, (TEXT("PWM_Read:END!\r\n")));
	//InterruptDone(SysInt);//中断返回
}

DWORD WINAPI ThreadIST(LPVOID a)
{
	RETAILMSG (1, (TEXT(" ThreadIST:ENTRY!\r\n")));
	while (1)
	{
	WaitForSingleObject(Interruptevent,INFINITE);//无限期等待中断
	//CRITICAL_SECTION csMyCriticalSection;
	//InitializeCriticalSection(&csMyCriticalSection);
	//EnterCriticalSection(&csMyCriticalSection);
	v_pPWMRegs->rTCNTB0=80;
	v_pPWMRegs->rTCMPB0=40;
	RETAILMSG (1, (TEXT(" ThreadIST:mmmmmm!\r\n")));
	//LeaveCriticalSection(&csMyCriticalSection);
	InterruptDone(SysInt);//中断返回
	}
	RETAILMSG (1, (TEXT(" ThreadIST:END!\r\n")));
	return 0;
}

//不完成具体工作
DWORD PWM_Seek(DWORD hOpenContext,long Amount,WORD Type)
{
DWORD dwRet=0;
RETAILMSG(1,(TEXT("MYPWM:PWM_Seek\n")));
return dwRet;
}

//TCON 的初始化,从而启动定时器的工作
DWORD PWM_Write(DWORD hOpenContext, LPVOID  pBuffer, DWORD Count)
{
	RETAILMSG (1, (TEXT(" PWM_Write:ENTRY!\r\n")));
DWORD dwRet=0;
v_pPWMRegs->rTCON=0x50000a; 
RETAILMSG (1,(TEXT("PWM_Write:1111111!\n\r")));
v_pPWMRegs->rTCON=0x500009;
RETAILMSG (1, (TEXT(" PWM_Write:END!\r\n")));
return dwRet;
}

⌨️ 快捷键说明

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