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中断处理结束 //------------------------------------------------------------------------------------------------------- } |