timer_count32.c 3.0 KB

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