WINCE 2440 6410下, 按键中断驱动 实现
来源:互联网 发布:me软件下载 编辑:程序博客网 时间:2024/05/17 02:32
WINCE 2440 6410下, 按键中断驱动
首先申明一点,本人所有的文章以指导思路为主,不公布源码,因为我的源码是在其它厂家的BSP里写的,我对比了一下的BSP,写法完全不同,所以我不去错误引导各位了。
首先我们说一下中断的概念:
从结构上看,WinCE中断涉及4层,即:硬件层、内核层、OAL层、IST处理层。
硬件层就是我们GPIO引脚设计
内核层就内核处理层
OAL层其实就是一个中转层
IST层是实际我们去处理中断事件的层
下面我转一下别人的文章,我的文字功底不行,
大致步骤如下:
1. 初始化GPIO口
2、 创建事件
3、 获取IRQ的系统中断号
4、 创建挂起的中断服务线程IST
5、 调用InterruptInitialize以创建IRQ与事件之间的关联。(创建未挂起的中断服务线程有可能导致InterruptInitialize函数调用失败,因为该事件已经处于等待状态)
6、 调用CeSetThreadPriority函数设置IST的优先级
7、 启动IST线程
1.初始化GPIO口
//声明的一些变量
HANDLE m_interruptTestEvent = NULL;
HANDLE m_interrupTestThread = NULL;
DWORD m_interruptTestSysId = SYSINTR_UNDEFINED;
DWORD m_interruptTestPhyId = 0;
LPDWORD lpThreadId = NULL;
DWORD threadpriority = 6;
BOOL m_ExitThread = FALSE ;
void InitInterruptTestGPIO(void)
{
RETAILMSG(1,(TEXT("***testInitInterruptTestGPIO \r\n")));
// interrupt ledtest 中断控制的led灯
v_pIOPregs->GPMCON &= 0xfffffff0; //setpin out
v_pIOPregs->GPMCON |= 0x1;
v_pIOPregs->GPMPUD &= 0xfffffffc; //enable up
v_pIOPregs->GPMPUD |= 0x2;
//interrup soursegpn0 设置gpn0脚为中断源
v_pIOPregs->GPNCON &= 0xfffffffc;
v_pIOPregs->GPNCON |= (0x2<<0);
//pull upenable
v_pIOPregs->GPNPUD &= 0xfffffffc;
v_pIOPregs->GPNPUD |= (0x2<<0);
//filter enable
v_pIOPregs->EINT0FLTCON0 =(v_pIOPregs->EINT0FLTCON0 & ~(0x1<<6)) |(0x1<<7);
//Configurate the EINT0Trigger of Flowing Type 01x配置EINT0为下降沿触发
v_pIOPregs->EINT0CON0 &= 0xfffffff8;
v_pIOPregs->EINT0CON0 |= (0x2<<0);
}
2.使能中断
BOOL Enble_Test_Interrupt(void)
{
//clear interrupt eint 0
v_pIOPregs->EINT0PEND = (0x1<<0);
//网上有说v_pIOPregs->EINT0PEND= (0x1<<0)与v_pIOPregs->EINT0PEND|=(0x1<<0);
//有差,前者是清除位元,后者是全部位清除,我试了都可以,还得好好研究
//ENable Interrupt MASKEINT0
v_pIOPregs->EINT0MASK=v_pIOPregs->EINT0MASK & ~(0x1<<0);
return true;
}
3.物理中断映射成系统中断号,创建中断事件及中断处理线程
BOOL InitInterruptTest(void)
{
RETAILMSG(1,(TEXT("******testInitInterruptTest\r\n")));
m_interruptTestPhyId = IRQ_EINT0;//物理中断号
//物理中断映射成系统中断号
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR,&m_interruptTestPhyId,sizeof(DWORD),&m_interruptTestSysId,sizeof(DWORD),NULL))
{
RETAILMSG(1,(TEXT("******testKernelIoControlt fail\r\n")));
m_interruptTestSysId = SYSINTR_UNDEFINED;
return FALSE;
}
//create an event
m_interruptTestEvent = CreateEvent(NULL, FALSE, FALSE,NULL);
if (NULL == m_interruptTestEvent)
{
RETAILMSG(1,(TEXT("******test create eventfail\r\n")));
return FALSE;
}
// 创建一个挂起的线程
m_interrupTestThread =CreateThread(NULL, // Security
0, // No Stack Size
(LPTHREAD_START_ROUTINE)Threadproc,//InterruptThread /*参数必须与中断处理函数名称一样*/
NULL, //No Parameters
CREATE_SUSPENDED, // Create Suspended
lpThreadId ); // Thread Id );
// set the thread priority
threadpriority = 6;
if( !CeSetThreadPriority( m_interrupTestThread,threadpriority))
{
RETAILMSG(1,(TEXT("test: Failed settingThread Priority.\r\n")));
return FALSE;
}
//initialize interrupt event
if (!InterruptInitialize(m_interruptTestSysId,m_interruptTestEvent,NULL,0))
{
ERRORMSG( 1, (TEXT("test interrupt is notinitialized\n\r")));
return(FALSE);
}
//启动线程
ResumeThread( m_interrupTestThread );
return TRUE;
}
4.中断线程处理函数
DWORD WINAPIThreadproc(LPVOIDlpvParam)
{
DWORD dwStatus;
BOOL fState = TRUE;
static BOOL count = TRUE;
RETAILMSG(1,(TEXT("entry testthread \r\n")));
while (!m_ExitThread)
{
dwStatus= WaitForSingleObject(m_interruptTestEvent,INFINITE);
if (m_ExitThread)
{
break;
}
if (dwStatus == WAIT_OBJECT_0)
{
RETAILMSG(1,(TEXT("test thread happend\r\n")));
}
count = ~count;
if(count&0x1)
v_pIOPregs->GPMDAT|= 0x1; //灯灭
else
v_pIOPregs->GPMDAT &= 0xfffffffe;//灯亮
InterruptDone(m_interruptTestSysId);
Enble_Test_Interrupt();
}
return FALSE;
}
以上是一个完整的中断处理过程。大家认真去看。
QQ: 2541414627
- WINCE 2440 6410下, 按键中断驱动 实现
- wince 下的按键驱动
- wince 按键驱动
- 字符设备驱动--中断方式下的按键驱动
- 外部中断按键驱动
- fl2440按键中断驱动
- 按键中断驱动实例
- s3c6410中断按键驱动
- s5pc100中断按键驱动
- TQ2440 中断按键驱动
- OK6410 按键中断驱动
- 按键中断驱动
- 按键中断驱动
- 按键中断驱动
- mtk 按键中断驱动
- 中断按键驱动
- 驱动-按键-中断模式
- wince按键中断的检测
- <a>标签传值 乱码问题
- 6410 WINCE 下,红外 遥控 技术实验 飞凌开发板
- 8086交换指令XCHG
- 细说ASP.NET Windows身份认证
- 解决找不到jni.h和jni_md.h的问题
- WINCE 2440 6410下, 按键中断驱动 实现
- HTTP状态码的含义
- 软件外包项目管理经验谈
- boost::asio译文
- 安装UnityVS 2012步骤
- system调用总是返回-1
- OpenGL 3d 入门
- OOAD笔记三
- boost::thread线程管理