打印

外中断的问题

[复制链接]
1267|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
h_x_zhong|  楼主 | 2008-5-4 17:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
NXP2119 ARM 有一问题想请高手指点:

我的定时器0设为5MS中断一次,外中断0为10MS进来一次.当我断开外中断0,定时器0工作正常,

只要接上外中断,定时器0变成了10MS,且是可变的!外中断口是10MS变化一次,而在程序中测试

不是这样的,进外中断0相当频繁!!  不明白为何?

然后我把定时器0功能关掉,只保留外中断0,还是进外中断0相当频繁!!!

现附上代码:


/********************************************************************************************************
** 函数名称: IRQ_Time0()
** 功能描述: 定时器0中断服务程序.它作为一个基准时钟源实现5ms的定时.
**
** 输      入: 无
**
** 输      出: 无
**
** 全局变量: 无
** 调用模块: 无
**
** 作      者: 
** 日      期: 
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日      期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void __irq IRQ_Time0(void)
{
    if(P401_DAT_TST()==0 )    P401_SET();        // 测试脚 2008.05.04
    else                P401_CLR();        // 测试脚 2008.05.04
//-------------------------------------------------------------------------------------------------------
    T0IR = 0x01;    // 清除中断标志
}


/********************************************************************************************************
** 函数名称: Time0Init()
** 功能描述: 初始化定时器0,定时时间为5ms,并使能中断.
**
** 输      入: 无
**
** 输      出: 无
**
** 全局变量: 无
** 调用模块: 无
**
** 作      者: 
** 日      期: 
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日      期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Time0Init(void)
{    //    Fcclk = Fosc*4  = 11.0592MHz*4 = 44.2368MHz
    //    Fpclk = Fcclk/4 = 44.2368MHz/4 = 11.0592MHz                   
//-------------------------------------------------------------------------------------------------------
    T0IR  = 0xFFFFFFFF;

    T0TC  = 0x00;                // 定时器初值设置为0
    T0PR  = 00;                // 设置定时器0不分频
//-------------------------------------------------------------------------------------------------------
    T0MR0 = (Fpclk/200);            // 5ms  定时值  T0MR0 = (Fpclk / OS_TICKS_PER_SEC)
//-------------------------------------------------------------------------------------------------------
    T0TCR = 0x03;                // 启动并复位T0TC
    T0TCR = 0x01;
//-------------------------------------------------------------------------------------------------------
    /* 设置定时器0中断IRQ */
    VICIntSelect |= 0x00;        // 对应位为1则分配为FIQ  设置所有通道为IRQ中断
    VICVectCntl4  = 0x20|4;        // 定时器0中断通道分配为向量控制器4, 00,1,00100 (4为定时0中断编号)
    VICVectAddr4  = (uint32)IRQ_Time0;    // 设置定时器0中断服务程序地址向量
    VICIntEnable |= (1<<4);        // 使能定时器0中断.写入1使能中断请求或软件中断  读出1表示FIQ或IRQ
//-------------------------------------------------------------------------------------------------------
}



/********************************************************************************************************
** 函数名称: Eint0Init()
** 功能描述: 初始外部中断0,并使能IRQ中断. 把相应的引脚设为外部中断功能时,引
**             脚为输入模式,由于内部没上拉电阻,所以要上拉一个电阻,确保不会悬空.
** 输      入: 无
**
** 输      出: 无
**
** 全局变量: 无
** 调用模块: 无
**
** 作      者:
** 日      期:
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日      期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Eint0Init(void)
{
//-------------------------------------------------------------------------------------------------------
    PINSEL1 |= 0x01;            // 设置I/O连接到 Eint0    P0.16

    EXTMODE  = 0x01;            // 设置Eint0中断为边沿触发模式
    EXTPOLAR = 0x00;            // 设置Eint0中断下降沿触发模式
//-------------------------------------------------------------------------------------------------------
    /* 设置外部中断0 IRQ */
    VICIntSelect |= 0x00;        // 对应位为1则分配为FIQ  设置所有通道为IRQ中断
    VICVectCntl2  = 0x20|14;        // Eint0中断通道分配为向量控制器3, 00,1,01110 (14为外部中断0编号)
    VICVectAddr2  = (uint32)IRQ_Eint0;    // 设置外部中断0服务程序地址向量
    EXTINT = 0x01;                        // 清除Eint0中断标志
    VICIntEnable |= (1<<14);        // 使能外部中断0.写入1使能中断请求或软件中断  读出1表示FIQ或IRQ
//-------------------------------------------------------------------------------------------------------
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
/*$PAGE*/
/********************************************************************************************************
* 函数介绍:以下中断程式处理部分    包括了外部中断0    定时器中断1
* 输入参数:无
* 返 回 值:无
* 建    立:                日期:
* 修    改:                    日期:
*********************************************************************************************************/
//交流电的50Hz经过整流桥堆(二极管整流)产生100Hz中断 10ms

void __irq IRQ_Eint0(void)
{
    uint8 i;
//-------------------------------------------------------------------------------------------------------
    if(P403_DAT_TST()==0 )    P403_SET();        // 测试脚 2008.05.04
    else                P403_CLR();        // 测试脚 2008.05.04
//-------------------------------------------------------------------------------------------------------
    EXTINT = 0x01;                    // 清除Eint0中断标志
    VICVectAddr = 0x00;                    // 通知VIC中断处理结束
//-------------------------------------------------------------------------------------------------------
}

相关帖子

沙发
h_x_zhong|  楼主 | 2008-5-5 16:51 | 只看该作者

如此角法!!


按下以下的方法搞定:

1:  PINSEL1 |= 0x00000001;   // 设置I/O连接到 Eint0    P0.16
2:  是否端口坏了?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

54

帖子

1

粉丝