clock.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include "clock.h"
  2. #include "gd32f3x0.h"
  3. extern uint32_t SystemCoreClock;
  4. static u8 delay_ticks_enable = 0;
  5. void delay_us(uint32_t us){
  6. if (delay_ticks_enable) {
  7. task_udelay(us);
  8. return;
  9. }
  10. uint32_t insr_num = (SystemCoreClock /1000000) * us * 4;// 1000000;
  11. while(insr_num-->0); //have 4 instr
  12. }
  13. void task_ticks_enable(void)
  14. {
  15. CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
  16. DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
  17. delay_ticks_enable = 1;
  18. }
  19. u32 task_ticks_abs(void)
  20. {
  21. return DWT->CYCCNT;
  22. }
  23. u32 task_ticks_rel(u32 start)
  24. {
  25. u32 ticks = DWT->CYCCNT;
  26. if (ticks >= start) {
  27. return ticks - start;
  28. }
  29. return 0xFFFFFFFF - start + ticks + 1;
  30. }
  31. void task_ticks_delay(u32 ticks)
  32. {
  33. u32 start;
  34. start = task_ticks_abs();
  35. while (task_ticks_rel(start) < ticks);
  36. }
  37. void task_udelay(u32 delay)
  38. {
  39. task_ticks_delay(delay * (SystemCoreClock / 1000000));
  40. }
  41. uint32_t get_sys_clock(void){
  42. return SystemCoreClock;
  43. }
  44. uint32_t get_ahb_clock(void){
  45. return rcu_clock_freq_get(CK_AHB);
  46. }
  47. uint32_t get_apb1_clock(void){
  48. return rcu_clock_freq_get(CK_APB1);
  49. }
  50. uint32_t get_apb2_clock(void){
  51. return rcu_clock_freq_get(CK_APB2);
  52. }
  53. uint32_t get_adc_clock(void){
  54. return rcu_clock_freq_get(CK_ADC);
  55. }
  56. uint32_t get_apb1_timer_clock(void){
  57. uint32_t apb1psc = 0U;
  58. apb1psc = RCU_CFG0;
  59. uint32_t div = GET_BITS(apb1psc, 8, 10);
  60. if (div == 0){ //DIV1
  61. return get_apb1_clock();
  62. }
  63. return get_apb1_clock() * 2;
  64. }
  65. uint32_t get_apb2_timer_clock(void){
  66. uint32_t apb2psc = 0U;
  67. apb2psc = RCU_CFG0;
  68. uint32_t div = GET_BITS(apb2psc, 11, 13);
  69. if (div == 0){ //DIV1
  70. return get_apb2_clock();
  71. }
  72. return get_apb2_clock() * 2;
  73. }