天嵌 ARM开发社区

 找回密码
 注册
查看: 4898|回复: 0

2440 6410下, 按键中断驱动

[复制链接]
weichaocz 发表于 2013-6-12 19:17:02 | 显示全部楼层 |阅读模式
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("***test InitInterruptTestGPIO  \r\n")));
// interrupt led test  中断控制的led灯
v_pIOPregs->GPMCON &= 0xfffffff0; //set pin out
v_pIOPregs->GPMCON |= 0x1;
   
v_pIOPregs->GPMPUD &= 0xfffffffc ;  //enable up
v_pIOPregs->GPMPUD |= 0x2;

//interrup sourse gpn0  设置gpn0脚为中断源
v_pIOPregs->GPNCON &= 0xfffffffc;
v_pIOPregs->GPNCON |= (0x2<<0);
      //pull up enable
v_pIOPregs->GPNPUD &= 0xfffffffc;
v_pIOPregs->GPNPUD |= (0x2<<0);
//filter enable
v_pIOPregs->EINT0FLTCON0 = (v_pIOPregs->EINT0FLTCON0 & ~(0x1<<6)) |(0x1<<7);

//Configurate the EINT0 Trigger 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 MASK EINT0
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("******test KernelIoControlt 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 event fail\r\n")));
return FALSE;
}
// 创建一个挂起的线程
m_interrupTestThread = CreateThread(NULL,  // Security
0,     // No Stack Size
(LPTHREAD_START_ROUTINE)Threadproc,//Interrupt Thread        /*参数必须与中断处理函数名称一样*/           
NULL,     // No  Parameters   
CREATE_SUSPENDED, // Create Suspended
lpThreadId ); // Thread Id  );




以上是一个完整的中断处理过程。大家认真去看。


QQ: 2541414627
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-19 09:22 , Processed in 1.078125 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表