📄 pwmdirver.cpp
字号:
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 + -