delay_loop()
{
long i;
for (i = 0; i < 1000; i++) {}
}
实验板用的是F2812型DSP芯片。工作频率在150Mhz,Datasheet说其最小指令周期为6nS。
实验是这样的,先把相关的GPIO引脚设置为高、低电平,然后用延时函数延时一段时间,再把GPIO相应引脚翻转,再进行延时。就这样循环,然后输出一个一定频率的信号。这个信号用示波器量了一下是6.xx Khz。然后我把延时函数的1000改为2000,再用示波器去量GPIO的引脚,发现频率变成了3.xx Khz。
就是这个时间是怎么来算的?怎么就成了6Khz了呢?
源程序如下:
//就是通过这个循环来实现信号的输入
while(1)
{
GpioDataRegs.GPADAT.all =0xAAAA;
GpioDataRegs.GPBDAT.all =0xAAAA;
GpioDataRegs.GPDDAT.all =0x0022;
GpioDataRegs.GPEDAT.all =0x0002;
GpioDataRegs.GPFDAT.all =0xAAAA;
GpioDataRegs.GPGDAT.all =0x0020;
delay_loop();//´ËÐÐÌí¼Ó¶Ïµã
GpioDataRegs.GPADAT.all =0x5555;
GpioDataRegs.GPBDAT.all =0x5555;
GpioDataRegs.GPDDAT.all =0x0041; // Four I/Os only
GpioDataRegs.GPEDAT.all =0x0005; // ThreeI/Os only
GpioDataRegs.GPFDAT.all =0x5555;
GpioDataRegs.GPGDAT.all =0x0010; // Two I/Os only
delay_loop();//´ËÐÐÌí¼Ó¶Ïµã
}
反汇编程序如下:
3F819A L1:
3F819A 761F MOVW DP,#0x01C3
3F819C 2820 MOV @32,#0xAAAA
3F819E 2824 MOV @36,#0xAAAA
3F81A0 282C MOV @44,#0x0022
3F81A2 2830 MOV @48,#0x0002
3F81A4 2834 MOV @52,#0xAAAA
3F81A6 2838 MOV @56,#0x0020
3F81A8 767F .word 0x767F
3F81A9 81BB SUB ACC,*0++ << 1
3F81AA 761F MOVW DP,#0x01C3
3F81AC 2820 MOV @32,#0x5555
3F81AE 2824 MOV @36,#0x5555
3F81B0 282C MOV @44,#0x0041
3F81B2 2830 MOV @48,#0x0005
3F81B4 2834 MOV @52,#0x5555
3F81B6 2838 MOV @56,#0x0010
3F81B8 767F .word 0x767F
3F81B9 81BB SUB ACC,*0++ << 1
3F81BA 6FE0 SB L1,UNC
3F81BB delay_loop:
3F81BB FE01 ADDB SP,#1
3F81BC 2B41 MOV *-SP[1],#0
3F81BD 1B41 CMP *-SP[1],#1000
3F81BF 6305 SB L3,GEQ
3F81C0 L2:
3F81C0 0A41 INC *-SP[1]
3F81C1 1B41 CMP *-SP[1],#1000
3F81C3 64FD SB L2,LT
3F81C4 L3:
3F81C4 FE81 SUBB SP,#1
3F81C5 0006 .word 0x0006
2 个解决方案
#1
要精确的延时就别算指令了,你又没关中断,没有啥意义的
看看定时器啥的吧,要不用RTOS
呵呵。。。
看看定时器啥的吧,要不用RTOS
呵呵。。。
#2
我也使用LZ的方法延时,但是很不精确,需要精确定时必须用定时器。
#1
要精确的延时就别算指令了,你又没关中断,没有啥意义的
看看定时器啥的吧,要不用RTOS
呵呵。。。
看看定时器啥的吧,要不用RTOS
呵呵。。。
#2
我也使用LZ的方法延时,但是很不精确,需要精确定时必须用定时器。