ls1c_delay.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2017-09-06 勤为本 first version
  9. */
  10. #include "ls1c_clock.h"
  11. /*
  12. * 延时指定时间,单位ms
  13. * @j 延时时间,单位ms
  14. */
  15. void delay_ms(int j)
  16. {
  17. int k_max = clk_get_cpu_rate()/1000/92; // 除以1000表示ms,另外一个除数为实验测得的经验值
  18. int k = k_max;
  19. for ( ; j > 0; j--)
  20. {
  21. for (k = k_max; k > 0; k--)
  22. {
  23. __asm__ ("nop"); // 注意,这里必须用内联汇编,否则会被优化掉
  24. }
  25. }
  26. return ;
  27. }
  28. /*
  29. * 延时指定时间,单位us
  30. * @n 延时时间,单位us
  31. */
  32. void delay_us(int n)
  33. {
  34. int count_1us = 252000000 / 1000000 / 84; // 延时1us的循环次数
  35. // 252000000为cpu频率,除以1000000表示延时单位为us,92为实验测得的经验值
  36. int count_max; // 延时n微秒的循环次数
  37. int tmp;
  38. // 微调
  39. count_max = n * count_1us;
  40. if (10 >= n) // <=10us
  41. {
  42. count_max = count_max / 3;
  43. }
  44. else if (100 >= n) // <= 100us
  45. {
  46. count_max = count_max - count_max / 5;
  47. }
  48. else // > 100us
  49. {
  50. count_max = count_max - count_max / 10;
  51. }
  52. // 延时
  53. for (tmp = count_max; tmp > 0; tmp--)
  54. {
  55. __asm__ ("nop"); // 注意,这里必须用内联汇编,否则会被优化掉
  56. }
  57. return ;
  58. }
  59. /*
  60. * 延时指定时间,单位s
  61. * @i 延时时间,单位s
  62. */
  63. void delay_s(int i)
  64. {
  65. for ( ; i > 0; i--)
  66. {
  67. delay_ms(1000);
  68. }
  69. return ;
  70. }