timer_count32.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include "bsp/bsp.h"
  2. #include "timer_count32.h"
  3. #include "os/co_task.h"
  4. static void init_master_timer(void);
  5. static void init_slave_timer(void);
  6. #define MASTER TIMER1
  7. #define MASTER_CK RCU_TIMER1
  8. #define SLAVE TIMER2
  9. #define SLAVE_CK RCU_TIMER2
  10. void timer_count32_init(void) {
  11. init_master_timer();
  12. init_slave_timer();
  13. timer_enable(MASTER);
  14. timer_enable(SLAVE);
  15. }
  16. static void init_master_timer(void){
  17. timer_parameter_struct timer_initpara;
  18. rcu_periph_clock_enable(MASTER_CK);
  19. timer_deinit(MASTER);
  20. memset(&timer_initpara, 0, sizeof(timer_initpara));
  21. timer_initpara.prescaler = TIM_CLOCK/COUNT_CLK - 1; //clk 10MHz, 100ns/0.1us
  22. timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
  23. timer_initpara.counterdirection = TIMER_COUNTER_UP;
  24. timer_initpara.period = 0xFFFF;
  25. timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
  26. timer_initpara.repetitioncounter = 0;
  27. timer_init(MASTER,&timer_initpara);
  28. timer_counter_value_config(MASTER, 0);
  29. timer_autoreload_value_config(MASTER, 0xFFFF);
  30. timer_counter_up_direction(MASTER);
  31. timer_auto_reload_shadow_enable(MASTER);
  32. timer_master_slave_mode_config(MASTER, TIMER_MASTER_SLAVE_MODE_ENABLE);
  33. timer_master_output_trigger_source_select(MASTER, TIMER_TRI_OUT_SRC_UPDATE);
  34. }
  35. static void init_slave_timer(void) {
  36. timer_parameter_struct timer_initpara;
  37. rcu_periph_clock_enable(SLAVE_CK);
  38. timer_deinit(SLAVE);
  39. memset(&timer_initpara, 0, sizeof(timer_initpara));
  40. timer_initpara.prescaler = 0; //clk 10MHz/65535
  41. timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
  42. timer_initpara.counterdirection = TIMER_COUNTER_UP;
  43. timer_initpara.period = 0xFFFF;
  44. timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
  45. timer_initpara.repetitioncounter = 0;
  46. timer_init(SLAVE,&timer_initpara);
  47. timer_counter_value_config(SLAVE, 0);
  48. timer_autoreload_value_config(SLAVE, 0xFFFF);
  49. timer_counter_up_direction(SLAVE);
  50. timer_auto_reload_shadow_enable(SLAVE);
  51. timer_master_slave_mode_config(SLAVE, TIMER_MASTER_SLAVE_MODE_ENABLE);
  52. timer_slave_mode_select(SLAVE, TIMER_SLAVE_MODE_EXTERNAL0);
  53. timer_input_trigger_source_select(SLAVE, TIMER_SMCFG_TRGSEL_ITI1); //select timer1 output as the trigger input
  54. }
  55. static __inline__ u32 _timer_count32_get(void) {
  56. #if 0
  57. u16 high;
  58. u16 low;
  59. do {
  60. high = TIMER_CNT(SLAVE);
  61. low = TIMER_CNT(MASTER);
  62. }while((high != TIMER_CNT(SLAVE)) /*|| (low != TIMER_CNT(MASTER))*/);
  63. return (high<<16) | low;
  64. #else
  65. return cpu_counts_abs();
  66. #endif
  67. }
  68. u32 timer_count32_get(void) {
  69. return _timer_count32_get();
  70. }
  71. u32 timer_count32_delta_us(u32 count, u32 *p_update) {
  72. u32 now = timer_count32_get();
  73. u32 delta = now - count;
  74. if (now < count) { //wrap
  75. delta = 0xFFFFFFFF - count + now + 1;
  76. }
  77. if (p_update) {
  78. *p_update = now;
  79. }
  80. return COUNT_2_US(delta);
  81. }
  82. void time_measure_start(measure_time_t *m){
  83. m->intval_time = timer_count32_delta_us(m->intval_count, &m->intval_count);
  84. m->exec_count = timer_count32_get();
  85. }
  86. void time_measure_end(measure_time_t *m) {
  87. m->exec_time = timer_count32_delta_us(m->exec_count, NULL);
  88. if (m->exec_time > m->exec_max_time) {
  89. m->exec_time_error ++;
  90. m->exec_max_error_time = m->exec_time;
  91. }
  92. }