counter.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include "counter.h"
  2. #include "gd32e23x.h"
  3. static uint32_t ic1value = 0, ic2value = 0;
  4. static uint32_t dutycycle = 0;
  5. static uint32_t frequency = 0;
  6. static uint32_t store_frequency = 0;
  7. static uint8_t data_valid = 0;
  8. static uint8_t has_data = 0;
  9. uint32_t counter_get_dutycycle()
  10. {
  11. return dutycycle;
  12. }
  13. uint32_t counter_get_frequency()
  14. {
  15. if(has_data == 1)
  16. {
  17. has_data = 0;
  18. return frequency;
  19. }else{
  20. frequency = 0;
  21. dutycycle = 0;
  22. return 0;
  23. }
  24. }
  25. void counter_set_store_frequency()
  26. {
  27. store_frequency = counter_get_frequency();
  28. }
  29. uint32_t counter_get_store_frequency()
  30. {
  31. return store_frequency;
  32. }
  33. void counter_timer_configuration(void)
  34. {
  35. /* TIMER2 configuration: PWM input mode ------------------------
  36. the external signal is connected to TIMER2 CH0 pin(PA6)
  37. the rising edge is used as active edge
  38. the TIMER2 CH0CV is used to compute the frequency value
  39. the TIMER2 CH1CV is used to compute the duty cycle value
  40. ------------------------------------------------------------ */
  41. timer_ic_parameter_struct timer_icinitpara;
  42. timer_parameter_struct timer_initpara;
  43. /* enable the TIMER clock */
  44. rcu_periph_clock_enable(RCU_TIMER2);
  45. /* deinit a TIMER */
  46. timer_deinit(TIMER2);
  47. /* initialize TIMER init parameter struct */
  48. timer_struct_para_init(&timer_initpara);
  49. /* TIMER2 configuration */
  50. timer_initpara.prescaler = 71;
  51. timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
  52. timer_initpara.counterdirection = TIMER_COUNTER_UP;
  53. timer_initpara.period = 65535;
  54. timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
  55. timer_init(TIMER2, &timer_initpara);
  56. /* TIMER2 configuration */
  57. /* initialize TIMER channel input parameter struct */
  58. timer_channel_input_struct_para_init(&timer_icinitpara);
  59. /* TIMER2 CH0 PWM input capture configuration */
  60. timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING;
  61. timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;
  62. timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;
  63. timer_icinitpara.icfilter = 0x0;
  64. timer_input_pwm_capture_config(TIMER2, TIMER_CH_0, &timer_icinitpara);
  65. /* slave mode selection: TIMER2 */
  66. timer_input_trigger_source_select(TIMER2, TIMER_SMCFG_TRGSEL_CI0FE0);
  67. /* select TIMER slave mode: restart mode */
  68. timer_slave_mode_select(TIMER2, TIMER_SLAVE_MODE_RESTART);
  69. /* select the master slave mode */
  70. timer_master_slave_mode_config(TIMER2, TIMER_MASTER_SLAVE_MODE_ENABLE);
  71. /* auto-reload preload enable */
  72. timer_auto_reload_shadow_enable(TIMER2);
  73. /* clear channel 0 interrupt bit */
  74. timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_CH0);
  75. /* channel 0 interrupt enable */
  76. timer_interrupt_enable(TIMER2, TIMER_INT_CH0);
  77. /* TIMER2 counter enable */
  78. timer_enable(TIMER2);
  79. }
  80. void counter_init()
  81. {
  82. /*configure PA6(TIMER2 CH0) as alternate function*/
  83. gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_6);
  84. gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_6);
  85. gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_6);
  86. nvic_irq_enable(TIMER2_IRQn, 0);
  87. counter_timer_configuration();
  88. }
  89. void counter_timer_handler()
  90. {
  91. if(SET == timer_interrupt_flag_get(TIMER2, TIMER_INT_FLAG_CH0)){
  92. /* clear channel 0 interrupt bit */
  93. timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_CH0);
  94. /* read channel 0 capture value */
  95. ic1value = timer_channel_capture_value_register_read(TIMER2, TIMER_CH_0) + 1;
  96. if(0 != ic1value){
  97. /* read channel 1 capture value */
  98. ic2value = timer_channel_capture_value_register_read(TIMER2, TIMER_CH_1) + 1;
  99. /* calculate the duty cycle value */
  100. dutycycle = (ic2value * 10000.0) / ic1value;
  101. /* calculate the frequency value */
  102. frequency = 100000000U / ic1value;
  103. /* output calculation value */
  104. if(0 != data_valid)
  105. {
  106. has_data = 1;
  107. }else{
  108. /* discard the first data */
  109. /* the first number is inaccurate */
  110. data_valid = 1;
  111. }
  112. }else{
  113. /* clear calculation value */
  114. dutycycle = 0;
  115. frequency = 0;
  116. }
  117. }
  118. }