解释一下这段代码过程void CMP_ISR(void) interrupt 21 { u8 i; CMPCR1 &= ~0x40; // ÐèÈí¼þÇå³ýÖжϱê־λ if(XiaoCiCnt == 0) //Ïû´Åºó²Å¼ì²â¹ý0ʼþ, XiaoCiCnt=1:ÐèÒªÏû´Å, =2:ÕýÔÚÏû´Å, =0ÒѾÏû´Å { T4T3M &= ~(1<<3); // Timer3Í£Ö¹ÔËÐÐ P27 = 0; if(B_Timer3_OverFlow) //Çл»Ê±¼ä¼ä¸ô(Timer3)ÓÐÒç³ö { B_Timer3_OverFlow = 0; PhaseTime = 8000; //»»Ïàʱ¼ä×î´ó8ms, 2212µç»ú12V¿Õת×î¸ßËÙ130usÇл»Ò»Ïà(200RPS 12000RPM), 480mA } else { i=T3H; PhaseTime = (((u16)i << 8) + T3L) >> 1; //µ¥Î»Îª1us if(PhaseTime >= 8000) PhaseTime = 8000; //»»Ïàʱ¼ä×î´ó8ms, 2212µç»ú12V¿Õת×î¸ßËÙ130usÇл»Ò»Ïà(200RPS 12000RPM), 480mA } T3H = 0; T3L = 0; T4T3M |= (1<<3); //Timer3¿ªÊ¼ÔËÐÐ PhaseTimeTmp[TimeIndex] = PhaseTime; //±£´æÒ»´Î»»Ïàʱ¼ä if(++TimeIndex >= 16) TimeIndex = 0; //ÀÛ¼Ó8´Î for(PhaseTime=0, i=0; i<16; i++) PhaseTime += PhaseTimeTmp[i]; //Çó16´Î»»Ïàʱ¼äÀÛ¼ÓºÍ PhaseTime = PhaseTime >> 5; //Çó16´Î»»Ïàʱ¼äµÄƽ¾ùÖµµÄÒ»°ë, ¼´30¶Èµç½Ç¶È if((PhaseTime >= 40) && (PhaseTime <= 1000)) TimeOut = 150; //¶Âת600ms³¬Ê± if( PhaseTime >= 60) PhaseTime -= 40; //ÐÞÕýÓÉÓÚÂ˲¨µçÈÝÒýÆðµÄÖͺóʱ¼ä else PhaseTime = 20; // PhaseTime = 20; //Ö»¸ø20us, ÔòÎÞÖͺóÐÞÕý, ÓÃÓÚ¼ì²âÂ˲¨µçÈÝÒýÆðµÄÖͺóʱ¼ä T4T3M &= ~(1<<7); //Timer4Í£Ö¹ÔËÐÐ PhaseTime = PhaseTime << 1; //2¸ö¼ÆÊý1us PhaseTime = 0 - PhaseTime; T4H = (u8)(PhaseTime >> 8); //×°ÔØ30¶È½ÇÑÓʱ T4L = (u8)PhaseTime; T4T3M |= (1<<7); //Timer4¿ªÊ¼ÔËÐÐ XiaoCiCnt = 1; //1:ÐèÒªÏû´Å, 2:ÕýÔÚÏû´Å, 0ÒѾÏû´Å P27 = 1; } }
时间: 2024-04-08 12:32:21 浏览: 148
UCOS-II中OS_CPU_IRQ_ISR移植过程分析
这段代码是一个中断服务函数,用于处理 CMP 中。在函数中,首先通过 `CM1 &= ~0x40` 指令清 CMP 中断标志位。
然后,通过判断变量 `XiaoCiCnt` 的来确定是否需要执行一操作。如果 `XCiCnt` 的值为 0,表示需要进行中断处理。在这种情况下,首先关闭 Timer3 的中断,并将 P27 端口置为低电平。接着,检查变量 `B_Timer3_OverFlow` 的值,如果真(非零),则将 PhaseTime 设置为 8000,否则根据3 的计时值计算 PhaseTime。然后,将 Timer3 的计时值清零,并启动 Timer3 的计时。
接下来,将当前的 PhaseTime 存储在 PhaseTimeTmp 数组中,并更新 TimeIndex 的值。然后,通过遍历 PhaseTimeTmp 数组并求和得到 PhaseTime 的平均值,并将其右移 5 位(相当于除以 32),得到一个粗略的速度估计值。根据速度估计值的范围,设置 TimeOut 变量的值。
接下来,根据 PhaseTime 的值进行一些调整。如果 PhaseTime 大于等于 60,则将其减去 40;否则将其设置为 20。
最后,关闭 Timer4 的中断,并根据 PhaseTime 设置 Timer4 的计时值,重新启动 Timer4 的计时。最后,将 `XiaoCiCnt` 的值设置为 1,表示需要进行下一次中断处理,并将 P27 端口置为高电平。
请注意,这段代码可能是针对特定的硬件或嵌入式系统的效果。请确保你的开发环境正确配置并连接好点
阅读全文