ls1c_delay.c 1.6 KB
Newer Older
1 2 3 4 5 6 7 8 9
/*
 * Copyright (c) 2006-2018, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2017-09-06     勤为本       first version
 */
10 11 12 13 14 15 16 17 18 19 20 21 22


#include "ls1c_clock.h"




/*
 * 延时指定时间,单位ms
 * @j 延时时间,单位ms
 */
void delay_ms(int j)
{
23
    int k_max = clk_get_cpu_rate()/1000/92;  // 除以1000表示ms,另外一个除数为实验测得的经验值
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
    int k = k_max;

    for ( ; j > 0; j--)
    {
        for (k = k_max; k > 0; k--)
        {
            __asm__ ("nop");        // 注意,这里必须用内联汇编,否则会被优化掉
        }
    }

    return ;
}


/*
 * 延时指定时间,单位us
 * @n 延时时间,单位us
 */
void delay_us(int n)
{
44 45
    int count_1us = 252000000 / 1000000 / 84;           // 延时1us的循环次数
                    // 252000000为cpu频率,除以1000000表示延时单位为us,92为实验测得的经验值
46 47 48
    int count_max;                                      // 延时n微秒的循环次数
    int tmp;

49 50
    // 微调
    count_max = n * count_1us;
51 52
    if (10 >= n)                // <=10us
    {
53
        count_max = count_max / 3;
54 55 56
    }
    else if (100 >= n)          // <= 100us
    {
57
        count_max = count_max - count_max / 5;
58 59 60
    }
    else                        // > 100us
    {
61
        count_max = count_max - count_max / 10;
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
    }

    // 延时
    for (tmp = count_max; tmp > 0; tmp--)
    {
        __asm__ ("nop");        // 注意,这里必须用内联汇编,否则会被优化掉            
    }

    return ;
}


/*
 * 延时指定时间,单位s
 * @i 延时时间,单位s
 */
void delay_s(int i)
{
    for ( ; i > 0; i--)
    {
        delay_ms(1000);
    }

    return ;
}