2011-07-28 —— 杂记 —— GPIO(2)中断服务例程(Self's)
来源:互联网 发布:2017年网络语 编辑:程序博客网 时间:2024/05/16 07:31
1、PIO_OUTPUT_ENABLE和PIO_OUTPUT_DISABLE是控制输出和输入的;PIO_INT_ENABLE和PIO_INT_DISABLE是控制中断的触发类型。其中输入的状态在超级终端上可以打印出来。
2、对于 GPIO 的中断控制,如果有两个驱动控制,可能会发生冲突,从而导致失败。
1.1 oal 中断配置
在WINCE600\PLATFORM\NANO\SRC\INC\oemintr.h 中
#defineIRQ_CHARGEDONE (IRQ_TD1120 - 1)//61
#defineSYSINTR_CHARGEDONE (SYSINTR_TD1120 - 1)//66
在WINCE600\PLATFORM\NANO\SRC\OAL\OALLIB\intr.c
BOOLBSPIntrInit() 中,系统中断ID 与中断服务ID:
OALIntrStaticTranslate(SYSINTR_CHARGEDONE,IRQ_CHARGEDONE);
UINT32BSPIntrEnableIrq(UINT32 irq) 中,增加case:
caseIRQ_CHARGEDONE:
if(!OALGpioIntrIsRegisterd(GPIO_NUM(GPIO_GROUTP_CHARGEDONE_INT, GPIO_INDEX_CHARGEDONE_INT)))
{
RETAILMSG(1,(TEXT("^^==========61=========^^^^IRQ_JACK enable 2\r\n")));
OALGpioRegisterIntr(GPIO_NUM(GPIO_GROUTP_CHARGEDONE_INT,GPIO_INDEX_CHARGEDONE_INT),
GPIO_INTTYPE_FALLING_EDGE,SYSINTR_CHARGEDONE, IRQ_CHARGEDONE);
GPIO_PAD_EN_SET(GPIO_GROUTP_CHARGEDONE_INT,1 << GPIO_INDEX_CHARGEDONE_INT);
PIO_OUTPUT_DISABLE(GPIO,GPIO_GROUTP_CHARGEDONE_INT, GPIO_INDEX_CHARGEDONE_INT);
//PIO_SET_PULL(GPIO,GPIO_GROUTP_CMMB_INT, GPIO_INDEX_CMMB_INT);
PIO_INT_ENABLE(GPIO,GPIO_GROUTP_CHARGEDONE_INT, GPIO_INDEX_CHARGEDONE_INT);
}
break;
其中定义中断的IO 口:(GPIO0_0 作中断)
#defineGPIO_GROUTP_CHARGEDONE_INT GPIO_GROUP(0)
#defineGPIO_INDEX_CHARGEDONE_INT GPIO_INDEX(0)
以上程序首先判断GPIO0_0 是否注册了,如果没有,进行注册:OALGpioRegisterIntr 把IO 口与系统中断关联,
还要考虑中断类型如下:
typedefenum
{
GPIO_INTTYPE_HIGH_LEVEL,
GPIO_INTTYPE_LOW_LEVEL,
GPIO_INTTYPE_RAISING_EDGE,
GPIO_INTTYPE_FALLING_EDGE,
GPIO_INTTYPE_HI_LO_LEVEL,
GPIO_INTTYPE_RISE_FALL_EDGE
}GPIO_INTTYPE;
其具体意义参考:SiRFatlasIV Developer Manual 的GPIO 部分GPIO Control Register Definition
此时GPIO0_0 注册成下降沿触发的中断类型。
UINT32BSPIntrDisableIrq(UINT32 irq) 中,增加case :
caseIRQ_CHARGEDONE:
PIO_INT_DISABLE(GPIO,GPIO_GROUTP_CHARGEDONE_INT,
GPIO_INDEX_CHARGEDONE_INT);
break;
UINT32BSPIntrDoneIrq(UINT32 irq) 中,增加case :
caseIRQ_CHARGEDONE:
PIO_INT_ENABLE(GPIO,GPIO_GROUTP_CHARGEDONE_INT, GPIO_INDEX_CHARGEDONE_INT);
break;
1.2 中断服务程序
添加驱动(比如:Key.c 中),在Key.c 中声明全局变量:
HANDLEm_hChargeDone = NULL;
驱动加载函数KEY_Init 中:
m_hChargeDone= CreateEvent(NULL, FALSE, FALSE, NULL);
if (!m_hChargeDone)
{
RETAILMSG(1,(TEXT("\r\nCreateEvent ERROR!!--\r\n")));
return FALSE;
}
else RETAILMSG(1,(TEXT("\r\nCreateEvent OK!!--\r\n")));
//以下:初始化中断:系统中断ID:SYSINTR_CHARGEDONE 与事件关联,此时会调用OAL 中UINT32
BSPIntrEnableIrq(UINT32irq) ,进行中断的注册
bSuccess= InterruptInitialize(SYSINTR_CHARGEDONE, m_hChargeDone, NULL, 0);
————由于存在 SYSINTR_CHARGEDONE,因此需要添加头文件oemintr.h,还要在 GPIO 的Source 文件中添加该头文件路径(需要编译该头文件)。
//以下创造中断服务线程,再此线程中等待事件m_hChargeDone 信号触发(即中断触发)
m_hChargeDoneThread = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)CheckChargeDoneThread,
NULL,
0,
NULL);
if (!m_hChargeDoneThread)
{
return FALSE;
}
中断服务线程如下:
voidCheckChargeDoneThread()
{
while(TRUE)
{
InterruptDone(SYSINTR_CHARGEDONE);
WaitForSingleObject(m_hChargeDone,INFINITE);//等待中断事件发生,即向下执行
RETAILMSG(1,(TEXT("CheckChargeDoneThread: WaitForSingleObject -m_hChargeDone!\r\n")));
}
}
BOOL GIO_Deinit(DWORD dwData)
{
RETAILMSG(1, (TEXT("KEY_Deinit++\r\n")));
if (m_hChargeDone)
CloseHandle(m_hChargeDone);
// if (m_hJackCheck)
// CloseHandle(m_hJackCheck);
RETAILMSG(1, (TEXT("KEY_Deinit--\r\n")));
return (TRUE);
}
Intr.c(wince600\platform\common\src\soc\atlasiv_sirf_v1\at8x0a\src\oal\oallib\intr):BOOLOALIntrInit()中:
if(g_oalSysInfo.warmrstInfo.bEnabled)
{
dwIrq= IRQ_WARMRESET;
g_oalSysInfo.warmrstInfo.dwSysIntr= SYSINTR_NOP;//无dwSysIntr
if(g_oalSysInfo.warmrstInfo.bEdge)
{
dwExtIntType= g_oalSysInfo.warmrstInfo.bFalling ?
GPIO_INTTYPE_FALLING_EDGE: GPIO_INTTYPE_RAISING_EDGE;
}
else
{
dwExtIntType= g_oalSysInfo.warmrstInfo.bFalling ?
GPIO_INTTYPE_LOW_LEVEL: GPIO_INTTYPE_HIGH_LEVEL;
}
if(!OALGpioRegisterIntr(g_oalSysInfo.warmrstInfo.dwRestBtnGpio, dwExtIntType,
g_oalSysInfo.warmrstInfo.dwSysIntr,IRQ_WARMRESET))
{
g_oalSysInfo.warmrstInfo.bEnabled= FALSE;
RETAILMSG(1,(TEXT("OALIntrInit: OALGpioRegisterIntr warmreset intr fail!\r\n")));
}
}
if(g_oalSysInfo.pwrbtnInfo.bEnabled)
{
dwIrq= IRQ_POWER;
g_oalSysInfo.pwrbtnInfo.dwSysIntr= OALIntrRequestSysIntr(1, &dwIrq, OAL_INTR_TRANSLATE);
if(g_oalSysInfo.pwrbtnInfo.dwSysIntr == SYSINTR_UNDEFINED)
g_oalSysInfo.pwrbtnInfo.bEnabled= FALSE;
else
{
if(g_oalSysInfo.pwrbtnInfo.bEdge)
{
dwExtIntType= g_oalSysInfo.pwrbtnInfo.bFalling ?
GPIO_INTTYPE_FALLING_EDGE: GPIO_INTTYPE_RAISING_EDGE;
}
else
{
dwExtIntType= g_oalSysInfo.pwrbtnInfo.bFalling ?
GPIO_INTTYPE_LOW_LEVEL: GPIO_INTTYPE_HIGH_LEVEL;
}
if(!OALGpioRegisterIntr(g_oalSysInfo.pwrbtnInfo.dwPwrBtnGpio, dwExtIntType,
g_oalSysInfo.pwrbtnInfo.dwSysIntr,IRQ_POWER))
g_oalSysInfo.pwrbtnInfo.bEnabled= FALSE;
}
}
- 2011-07-28 —— 杂记 —— GPIO(2)中断服务例程(Self's)
- (4.2)uboot详解——外部中断(GPIO)
- 一知半解学CubeMX——GPIO:外部(按键)中断
- STM32 GPIO——流水灯例程 学习总结
- STM32 GPIO之二——按键例程 学习总结
- ISR 中断服务例程
- 中断服务例程 学习
- ISR 中断服务例程
- 王爽《汇编语言》实验13——编写、应用中断例程
- request_irq()——注册中断服务
- request_irq()——注册中断服务
- request_irq()——注册中断服务
- 【DSP】TMS320F28035 GPIO外部中断例程
- 【连载】【STM32神舟III号实验例程】串口收发—中断方式(5)
- TI CC2530基础实验(GPIO通用I/O中断操作——一个中断处理程序处理一个端口的多个中断)
- 中断处理程序&中断服务例程
- 中断处理程序&中断服务例程
- 中断处理程序&中断服务例程
- OGNL, JSTL, STRUTS2 symbol #,$,% tag usage examples
- jQuery-利用上下左右鍵移動輸入焦點
- IIS日志分析方法及工具
- B树、B-树、B+树、B*树都是什么
- 中文编码问题解决方法汇总
- 2011-07-28 —— 杂记 —— GPIO(2)中断服务例程(Self's)
- 管理理念:如何让员工服从管理
- 《博客园精华集》分类索引
- C程序存储空间分布
- Deal with Multiple Stocks - Google Finance API
- Microsoft SQL Server 相关知识(资料整理)
- HDU3529 Bomberman - Just Search!重复覆盖DLX
- 网盘搜索(AppFen.com):搜索网络上分享的资源
- 缓冲字节流和文件操作