如何计算DSP芯片F2812中delay_loop()函数的延时时间长度?

时间:2023-01-18 23:42:19
延时函数如下所示:
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

呵呵。。。

#2


我也使用LZ的方法延时,但是很不精确,需要精确定时必须用定时器。

#1


要精确的延时就别算指令了,你又没关中断,没有啥意义的

看看定时器啥的吧,要不用RTOS

呵呵。。。

#2


我也使用LZ的方法延时,但是很不精确,需要精确定时必须用定时器。