timer_count32.c 3.0 KB

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