You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

142 lines
4.1 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <stdbool.h>
  4. #if 0
  5. void trigger_pwm(int32_t freq, float duty, int32_t pluse_num) {
  6. //无论怎样先停止PWM输
  7. HAL_TIM_PWM_Stop_IT(&htim3, TIM_CHANNEL_1);
  8. if (freq == 0) {
  9. LOGE("E:trigger pwm fail,freq == 0\n");
  10. return;
  11. }
  12. // 确定预分频参数,重载值
  13. float psc_x_arr = 90 * 1000 /*系统时钟*/ * 1000 / freq;
  14. uint32_t psc = 0;
  15. uint32_t arr = 65534;
  16. for (; arr > 2; arr--) {
  17. psc = psc_x_arr / arr;
  18. if (psc >= 1) {
  19. uint32_t tmparr = psc_x_arr / psc;
  20. if (tmparr >= 65534) continue;
  21. break;
  22. }
  23. }
  24. if (psc == 0) return;
  25. if (arr <= 3) return; //定时器一周期的分辨率太小了
  26. arr = psc_x_arr / psc;
  27. arr = arr - 1;
  28. psc = psc - 1;
  29. __HAL_TIM_SET_AUTORELOAD(&htim3, arr);
  30. __HAL_TIM_SET_PRESCALER(&htim3, psc);
  31. // 确定PWM通道占空比
  32. uint16_t comparevalue = duty * arr;
  33. __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, comparevalue);
  34. if (pluse_num == 0) {
  35. g_continue_output_mode = true;
  36. } else {
  37. g_pulse_num = pluse_num - 1;
  38. g_continue_output_mode = false;
  39. }
  40. __HAL_TIM_SET_COUNTER(&htim3, 0);
  41. LOGD("a[%d] p[%d]c[%d]\r\n", arr, psc, comparevalue);
  42. HAL_TIM_PWM_Start_IT(&htim3, TIM_CHANNEL_1);
  43. }
  44. #endif
  45. typedef struct
  46. {
  47. int autoreload;
  48. int prescaler;
  49. float realfreq;
  50. } timer_config_t;
  51. bool compute_timer_parameter(timer_config_t *config, int timer_in_clk /*mhz*/, int infreq /*hz*/)
  52. {
  53. float psc_x_arr = timer_in_clk * 1000 /*定时器模块时钟*/ * 1000 / infreq;
  54. uint32_t psc = 0;
  55. uint32_t arr = 65534;
  56. for (; arr > 2; arr--)
  57. {
  58. psc = psc_x_arr / arr;
  59. if (psc >= 1)
  60. {
  61. uint32_t tmparr = psc_x_arr / psc;
  62. if (tmparr >= 65534)
  63. continue;
  64. break;
  65. }
  66. }
  67. if (psc == 0)
  68. return false;
  69. if (arr <= 3)
  70. return false; //定时器一周期的分辨率太小了
  71. arr = psc_x_arr / psc;
  72. int psc_x_arr_real = arr * psc;
  73. float realfreq = timer_in_clk * 1000.0 /*定时器模块时钟*/ * 1000 / psc_x_arr_real;
  74. arr = arr - 1;
  75. psc = psc - 1;
  76. config->autoreload = arr;
  77. config->prescaler = psc;
  78. config->realfreq = realfreq;
  79. // config->compare = arr / 2;
  80. return false;
  81. }
  82. void dumpconfig_info(timer_config_t *config)
  83. {
  84. printf("* freq : %f \n", config->realfreq);
  85. printf("* prescaler : %d \n", config->prescaler);
  86. printf("* autoreload: %d \n", config->autoreload);
  87. }
  88. int main(int argc, char const *argv[])
  89. {
  90. if (argc != 3)
  91. {
  92. printf("%s system_clk mhz expect_freq khz\n", argv[0]);
  93. return -1;
  94. }
  95. float expect_freq = 0;
  96. float systemclk = 0;
  97. sscanf(argv[1], "%f", &systemclk);
  98. sscanf(argv[2], "%f", &expect_freq);
  99. printf("systemclk : %f mhz\n", systemclk);
  100. printf("expect freq: %f khz\n", expect_freq);
  101. int32_t infreq = (int32_t)(expect_freq * 1000);
  102. timer_config_t timerconfig_apb1;
  103. timer_config_t timerconfig_apb2;
  104. //apb1
  105. compute_timer_parameter(&timerconfig_apb1, systemclk / 2, infreq);
  106. //apb2
  107. compute_timer_parameter(&timerconfig_apb2, systemclk, infreq);
  108. printf("******************************************************\n");
  109. printf("* APB1: TIM2 TIM3 TIM4 TIM5 TIM6 TIM7 TIM12 TIM13 TIM14\n");
  110. printf("*\n");
  111. printf("* timer_module_clk: %f mhz\n", systemclk / 2);
  112. printf("* freq : %f khz\n", timerconfig_apb1.realfreq / 1000.0);
  113. printf("* period : %f ms\n", (1.0 / timerconfig_apb1.realfreq * 1000));
  114. printf("* prescaler : %d \n", timerconfig_apb1.prescaler);
  115. printf("* autoreload : %d \n", timerconfig_apb1.autoreload);
  116. printf("*\n");
  117. printf("**\n");
  118. printf("* APB2: TIM1 TIM8 TIM9 TIM10 TIM11\n");
  119. printf("*\n");
  120. printf("* timer_module_clk: %f mhz\n", systemclk);
  121. printf("* freq : %f khz\n", timerconfig_apb2.realfreq / 1000.0);
  122. printf("* period : %f ms\n", (1.0 / timerconfig_apb2.realfreq * 1000));
  123. printf("* prescaler : %d \n", timerconfig_apb2.prescaler);
  124. printf("* autoreload : %d \n", timerconfig_apb2.autoreload);
  125. printf("***\n");
  126. return 0;
  127. }