📄 我的精确延时记录.txt
字号:
一)1M晶振for函数
time 起始时间 运行完毕时间
10 64 127
20 64 177
30 64 227
1 64 82
0 64 77
2 64 87
综上,1M晶振调用for函数的延时=13+time*5 us-----包含调用和返回的时间了
附 for函数
void delay_1us(uchar time)
{
for (;time>0;time--)
;
}
二)1M晶振asm函数
起始时间 运行完毕时间
89 97
综上,1M晶振调用asm函数的延时=8us------包含调用和返回的时间了
附asm函数
void asm_delay_1us(void)
{
asm("nop");
}
三)1M晶振for_asm函数1 :固定for循环次数为10,这样就可以避免调用函数时检测time是否合法
===非常精确的做法=====
不要弄函数了,直接来asm语句即可
四)c的汇编延时内嵌 //精确延时,要CLI屏蔽中断
一重循环
n 起始 结束时间
20 64 125
10 64 95
结论,延时=1+n*3
附代码
/*us级精确延时 255us以内 延时=1+n*3 */
// CLI;
asm("LDI R16,n");//1t ,寄存器R15~R30
asm("CLZ");//1t
asm("LOOP1:DEC R16");//1t
asm("BRNE LOOP1");//1t或2t//标志位Z是0就转移
//asm("NOP");//1t
//asm("NOP");//1t
// SEI;
/*us级精确延时 255us以内,可用nop补足余数*/
二重循环
n m 起始 结束时间 延时
10 20 112 762 650
1 2 112 123 11
1 1 112 120 8
2 1 112 128 16
2 2 112 134 22
综上,延时=n*(m*3+5)
/*us级 196348us即196ms以内 延时=n*(m*3+5)*/
// CLI;
asm("LDI R18,n");//外圈循环n
asm("LOOP3:LDI R17,m");//内圈循环m
asm("CLZ");//1t
asm("LOOP2:DEC R17");//1t
asm("BRNE LOOP2");
asm("CLZ");//1t
asm("DEC R18");//1t
asm("BRNE LOOP3");
//asm("NOP");//1t
// SEI;
/*us级精确延时 196348us即196ms以内,可用nop补足余数*/
五)调用汇编函数的时间
晶振MHz 来回的时间us
1 7
4 7/4
8 7/8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -