本帖最后由 JerryWu75 于 2013-1-7 13:18 编辑
一个类似这样的延时函数,你需要通过C的编译后,查看这段函数的汇编代码有多少个指令,然后检查每一个指令的执行周期是多少,再检查你的方案设计,得到你的CPU的基本指令周期是多少,例如:
1, 12MHz的晶振输入,1:1分频,即1个时钟脉冲就是一个指令周期,指令周期T=83.3ns,如果是2:1分频,就是指指令周期T=166.67ns.T=n*Clk, n是分频数,Clk是时钟,不过有一些CPU的时钟不是直接晶振频率分频到指令周期的,可能还有倍频,这些需要你查看你的CPU的数据手册。
2,你的延时函数有多少条汇编指令,例如
C的原形是Delay(unsigned char Dly),通过C编译后行成以下汇编代码,然后我们假定这些指令的执行周期分别是:
_Delay:
mov AX,BX ; 指令周期1T AX与BX都是8位
_Delay1:
dec BX :指令周期2T 如果Dly=0,则BX的初值为0,0-1=FF,即最大延时!
jmp _Delay, BX>0 ;指令周期2T
ret ;指令周期1T
那么这个程序的延时=1T+Dly*(2T+2T)+1T,T=n*Clk,Clk=1/12mHz,这样你就可以算出这个延时程序的延时了,不过需要注意的是这里没有考虑中断导致的延时误差,即我们默认在执行这个函数时不发生中断,如果会有中断在这个函数中发生,那计算就比较麻烦了。
|