timer_count32.c 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include "bsp/bsp.h"
  2. #include "timer_count32.h"
  3. #include "os/os_task.h"
  4. static void init_master_timer(void);
  5. static void init_slave_timer(void);
  6. #define MASTER TIMER3
  7. #define MASTER_CK RCU_TIMER3
  8. #define SLAVE TIMER4
  9. #define SLAVE_CK RCU_TIMER4
  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 200KHz, 5us
  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 1
  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(u32 now, u32 prev) {
  72. if (now >= prev) {
  73. return (now - prev);
  74. }
  75. return (0xFFFFFFFF + prev - now + 1);
  76. }