|
关于uC/OS-II下外部中断运行不正确的问题
[复制链接]
大家好,我最近在写一个ZLG7290、12864和ARM7 LPC2138实现键盘输入和显示的功能,这个模块使整个系统的基础,但是现在有一个问题把我卡住了,就是在ZLG7290的INT引脚与LPC2138的外部中断0(P0.16)口连接以实现键盘中断时,出线中断无法正确实现,现在将代码和思路列出来,望得以指教!
在IRQ.s中断声明文件中增加以下外部中断的代码:
;/* 外部中断 */
EINT0_Handler HANDLER EINT0_Exception
在target.c目标板初始化文件中配置好外部中断如下:
void VICInit(void)
{
extern void EINT0_Handler(void);
....
VICVectAddr3 = (uint32)EINT0_Handler; // 外部中断0中断优先级为3
VICVectCntl3 = (0x20 | 0x0e); // VIC通道号为14
VICIntEnable = 1 << 0x0e;
}
void TargetInit(void)
{
.....
KeyInit();
.....
}
key.c文件中实现键盘动作:
#include "key.h"
static OS_EVENT *KeySem; // 按键中断的信号量
/*****************按键外部中断初始化*************************/
boolean KeyInit(void)
{
PINSEL1 = (PINSEL1 & 0xfffffffc) | 0x01; // 设定P0.16接外部中断
EXTMODE = 0x01; // 设定外部中断为边沿触发
EXTPOLAR = 0x00; // 设定为下降沿触发
KeySem = OSSemCreate(0); // 建立按键信号量
EXTINT = 0x01; // 清除外部中断0标志
if(KeySem == NULL)
{
return FALSE;
}
return TRUE;
}
/********************外部中断服务函数*************************/
void EINT0_Exception(void)
{
OS_ENTER_CRITICAL();
OSSemPost(KeySem); // 发送键值触发的信号量
VICIntEnClr = 1 << 0x0e;
// 等待外部中断信号恢复为高电平
// 若信号保持为低电平,中断标志会一直置位
while ((EXTINT & 0x01) != 0)
{
EXTINT = 0x01; // 清除EINT0中断标志
}
VICVectAddr = 0; // 中断返回
OS_EXIT_CRITICAL();
}
/***********************按键消息处理函数***********************/
void KeyMsgOperation(void)
{
uint8 err;
uint16 key;
OSSemPend(KeySem, 0, &err); // 请求一个信号量
VICIntEnable = 1 << 0x0e;
key = ZLG7290_GetKey();
ClearLCD();
DispOneChar(0, 0, (key / 10) + '0');
DispOneChar(0, 1, (key % 10) + '0');
}
ZLG7290_GetKey()函数是通过I2C从ZLG7290内部寄存器拿到的,这部分已经验证正确,在没有使用外部中断之前我采用查询方式来获取按键键值是正确的,但采用外部中断之后就出现键值显示不正确和不稳定的问题了,程序上有什么不对的地方,还望大家指教!
|
|