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

📄 time2test.cpp

📁 s3c2410 pwm 不用注册流,定时器1的使用
💻 CPP
字号:
// Time2Test.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "Time2Test.h"


#include    <windows.h>
#include	<types.h>
#include    <ceddk.h>
#include    <memory.h>
#include    <nkintr.h>
#include    "D:\\WINCE420\\PLATFORM\\SMDK2410\\INC\\oalintr.h"
#include    "D:\\WINCE420\\PLATFORM\\SMDK2410\\INC\\drv_glob.h"
#include    "D:\\WINCE420\\PLATFORM\\SMDK2410\\INC\\s2410.h"


HWND g_hwnd;
volatile PWMreg *v_pPWMregs;
volatile INTreg *v_pINTregs;
HANDLE g_hevInterrupt=NULL;
HANDLE g_hThread=NULL;
BOOL g_Run=false;


BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
    switch (ul_reason_for_call)
	{
		case DLL_PROCESS_ATTACH:
		case DLL_THREAD_ATTACH:
		case DLL_THREAD_DETACH:
		case DLL_PROCESS_DETACH:
			break;
    }
    return TRUE;
}


// This is an example of an exported variable
TIME2TEST_API int nTime2Test=0;

// This is an example of an exported function.
TIME2TEST_API int fnTime2Test(void)
{
	return 42;
}

// This is the constructor of a class that has been exported.
// see Time2Test.h for the class definition
CTime2Test::CTime2Test()
{ 
	return; 
}

////////////////////////////
// pwm,int的初始化
extern "C" TIME2TEST_API void Time1_Init(void)
{
	v_pPWMregs->rTCFG0 &= ~0xff;	//clear
    v_pPWMregs->rTCFG0 |= 0x40;		//prescaler value = 64+1
  	v_pPWMregs->rTCFG1 &= ~0x0f;	//1/2

//	50750000/64+1/1/2=390385;390385/5=78076;一秒产生5次中断
	v_pPWMregs->rTCNTB1=390385;
	v_pPWMregs->rTCMPB1=0;

//	v_pPWMRegs->rTCON=0x50000a; 

	v_pPWMregs->rTCON &= ~0x000f00;    //clear time1 TCON 
	v_pPWMregs->rTCON = 0x500a00;	//1010
//	v_pPWMregs->rTCON &= ~0x000200;	//clear update bit
//	v_pPWMregs->rTCON |= 0x500100;	// no operation 1001
	v_pPWMregs->rTCON = 0x500900;

	if(v_pINTregs->rINTPND &BIT_TIMER1)
	{
		v_pINTregs->rSRCPND = BIT_TIMER1;
	}
	v_pINTregs->rINTMSK &= (~(1<<11));	//INT_TIME1 enable
	RETAILMSG(1,(TEXT("pwm,int Init")));
}

extern "C" TIME2TEST_API int ProfessInit(HWND hwnd)
{
	g_hwnd=hwnd;	//传窗口句柄

	if(v_pPWMregs == NULL)
	{
    	v_pPWMregs = (volatile PWMreg *)VirtualAlloc(0,sizeof(PWMreg),MEM_RESERVE, PAGE_NOACCESS);
    	if(v_pPWMregs == NULL)
		{
	    	RETAILMSG(1,(TEXT("For PWMreg: VirtualAlloc failed!\r\n")));
		    return 0;
	    }
    	else
		{
	    	if(!VirtualCopy((PVOID)v_pPWMregs,(PVOID)(PWM_BASE),sizeof(PWMreg),PAGE_READWRITE | PAGE_NOCACHE )) 
			{
			    RETAILMSG(1,(TEXT("For PWMreg: VirtualCopy failed!\r\n")));
    			return 0;
	    	}
	    }
	}

	if(v_pINTregs == NULL) 
	{
    	v_pINTregs = (volatile INTreg *) VirtualAlloc(0,sizeof(INTreg),MEM_RESERVE, PAGE_NOACCESS);
    	if(v_pINTregs == NULL) 
		{
	    	RETAILMSG(1,(TEXT("For INTreg: VirtualAlloc failed!\r\n")));
		    return 0;
	    }
    	else 
		{
	    	if(!VirtualCopy((PVOID)v_pINTregs,(PVOID)(INT_BASE),sizeof(INTreg),PAGE_READWRITE | PAGE_NOCACHE )) 
			{
			    RETAILMSG(1,(TEXT("For INTreg: VirtualCopy failed!\r\n")));
    			return 0;
	    	}
	    }
	}

	Time1_Init();

	//create event sing
	g_hevInterrupt = CreateEvent( NULL,FALSE,FALSE,NULL);
	if(g_hevInterrupt == NULL)
	{
		RETAILMSG(1, (TEXT("DEMO: Event creation failed!!!")));
		return 0;
	}
	RETAILMSG(1, (TEXT("create event sing ")));
	//创建等待信号的线程
	DWORD dwThreadID;
	g_hThread=CreateThread(NULL,0,ThreadIST,NULL,CREATE_SUSPENDED,&dwThreadID);
	if(g_hThread == NULL)
	{
		RETAILMSG(1, (TEXT("DEMO: Thread creation failed!!!")));
		return 0;
	}
	else
	{
		//设置线程优先级
		CeSetThreadPriority(g_hThread,1);
		RETAILMSG(1, (TEXT("set Thread Priority!!!")));	
	}
	InterruptDisable(SYSINTR_TIMER1); 
	//注册中断和事件
	if (!InterruptInitialize(SYSINTR_TIMER1, g_hevInterrupt, NULL,0)) 
	{
		RETAILMSG(1, (TEXT("SYSINTR_TIMER1: InterruptInitialize failed\r\n")));
		return 0;
    }
	RETAILMSG(1, (TEXT("zhu ce shi jian!!!")));	
	//启动线程
	g_Run=true;
	ResumeThread(g_hThread);
	RETAILMSG(1, (TEXT("qi dong xian cheng")));	

	return 1;
}

DWORD ThreadIST(LPVOID)
{
	DWORD dwStatus;

//	while(g_Run)
//	{
		dwStatus=WaitForSingleObject(g_hevInterrupt,INFINITE);
		if(dwStatus==WAIT_OBJECT_0)
		{
			RETAILMSG(1, (TEXT("yun xing xiang cheng")));
			SendMessage(g_hwnd,WM_MyNotify,0,0);
			InterruptDone(SYSINTR_TIMER1);
//			v_pINTregs->rSRCPND &= ~BIT_TIMER1;
//			v_pINTregs->rINTPND =BIT_TIMER1;
//			v_pINTregs->rINTMSK &= (~(1<<11));
		}
//	}
	return 1;
}

extern "C" TIME2TEST_API void ProfessDeInit()
{
	v_pPWMregs->rTCON=0x500000;
	g_Run=false;

	if(v_pINTregs)
    {
        VirtualFree((void*)v_pINTregs, sizeof(INTreg), MEM_RELEASE);
        v_pINTregs=NULL;
    }
	if(v_pPWMregs)
    {
        VirtualFree((void*)v_pPWMregs, sizeof(PWMreg), MEM_RELEASE);
        v_pPWMregs=NULL;
    }
	RETAILMSG(1, (TEXT("end !!!")));
}

⌨️ 快捷键说明

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