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.

178 lines
3.5 KiB

2 years ago
  1. #include "chip_helper.hpp"
  2. extern "C" {
  3. static uint8_t g_port_exit_critical_count;
  4. void chip_critical_enter(void) {
  5. if (g_port_exit_critical_count == 0) {
  6. __disable_irq();
  7. }
  8. g_port_exit_critical_count++;
  9. }
  10. void chip_critical_exit(void) {
  11. g_port_exit_critical_count--;
  12. if (g_port_exit_critical_count == 0) {
  13. __enable_irq();
  14. }
  15. }
  16. GPIO_TypeDef* chip_get_gpio(Pin_t pin) {
  17. int port = pin >> 4;
  18. switch (port) {
  19. case 1:
  20. #ifdef GPIOA
  21. return GPIOA;
  22. #endif
  23. break;
  24. case 2:
  25. #ifdef GPIOB
  26. return GPIOB;
  27. #endif
  28. break;
  29. case 3:
  30. #ifdef GPIOC
  31. return GPIOC;
  32. #endif
  33. break;
  34. case 4:
  35. #ifdef GPIOD
  36. return GPIOD;
  37. #endif
  38. break;
  39. case 5:
  40. #ifdef GPIOE
  41. return GPIOE;
  42. #endif
  43. break;
  44. case 6:
  45. #ifdef GPIOF
  46. return GPIOF;
  47. #endif
  48. break;
  49. case 7:
  50. #ifdef GPIOG
  51. return GPIOG;
  52. #endif
  53. break;
  54. default:
  55. break;
  56. }
  57. return NULL;
  58. }
  59. uint16_t chip_get_pinoff(Pin_t pin) {
  60. uint16_t pinoff = pin & 0x0F;
  61. switch (pinoff) {
  62. case 0:
  63. return GPIO_PIN_0;
  64. case 1:
  65. return GPIO_PIN_1;
  66. case 2:
  67. return GPIO_PIN_2;
  68. case 3:
  69. return GPIO_PIN_3;
  70. case 4:
  71. return GPIO_PIN_4;
  72. case 5:
  73. return GPIO_PIN_5;
  74. case 6:
  75. return GPIO_PIN_6;
  76. case 7:
  77. return GPIO_PIN_7;
  78. case 8:
  79. return GPIO_PIN_8;
  80. case 9:
  81. return GPIO_PIN_9;
  82. case 10:
  83. return GPIO_PIN_10;
  84. case 11:
  85. return GPIO_PIN_11;
  86. case 12:
  87. return GPIO_PIN_12;
  88. case 13:
  89. return GPIO_PIN_13;
  90. case 14:
  91. return GPIO_PIN_14;
  92. case 15:
  93. return GPIO_PIN_15;
  94. default:
  95. break;
  96. };
  97. return 0;
  98. }
  99. uint32_t chip_get_timer_clock_sorce_freq(TIM_HandleTypeDef* tim) {
  100. uint32_t timClkFreq = 0;
  101. uint32_t pclk1Freq = HAL_RCC_GetPCLK1Freq();
  102. uint32_t pclk2Freq = HAL_RCC_GetPCLK2Freq();
  103. uint32_t sysClkFreq = HAL_RCC_GetSysClockFreq();
  104. uint32_t pFLatency;
  105. RCC_ClkInitTypeDef clkconfig;
  106. HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);
  107. bool isAPB2 = false;
  108. #ifdef TIM1
  109. if (tim->Instance == TIM1) isAPB2 = true;
  110. #endif
  111. #ifdef TIM8
  112. if (tim->Instance == TIM8) isAPB2 = true;
  113. #endif
  114. #ifdef TIM9
  115. if (tim->Instance == TIM9) isAPB2 = true;
  116. #endif
  117. #ifdef TIM10
  118. if (tim->Instance == TIM10) isAPB2 = true;
  119. #endif
  120. #ifdef TIM11
  121. if (tim->Instance == TIM11) isAPB2 = true;
  122. #endif
  123. if (isAPB2) {
  124. if (clkconfig.APB2CLKDivider == RCC_HCLK_DIV1) {
  125. timClkFreq = HAL_RCC_GetPCLK2Freq();
  126. } else {
  127. timClkFreq = 2 * HAL_RCC_GetPCLK2Freq();
  128. }
  129. } else {
  130. if (clkconfig.APB1CLKDivider == RCC_HCLK_DIV1) {
  131. timClkFreq = HAL_RCC_GetPCLK1Freq();
  132. } else {
  133. timClkFreq = 2 * HAL_RCC_GetPCLK1Freq();
  134. }
  135. }
  136. return timClkFreq;
  137. }
  138. }
  139. bool chip_calculate_prescaler_and_autoreload_by_expect_freq(uint32_t timerInClk, float infreqhz, uint32_t* prescaler, uint32_t* autoreload) {
  140. /**
  141. * @brief Ĵֵ
  142. */
  143. float psc_x_arr = timerInClk / infreqhz;
  144. uint32_t psc = 0;
  145. uint32_t arr = 65534;
  146. for (; arr > 2; arr--) {
  147. psc = psc_x_arr / arr;
  148. if (psc >= 1) {
  149. uint32_t tmparr = psc_x_arr / psc;
  150. if (tmparr >= 65534) continue;
  151. break;
  152. }
  153. }
  154. if (psc == 0) return false;
  155. if (arr <= 3) return false; // ��ʱ��һ���ڵķֱ���̫С��
  156. arr = psc_x_arr / psc;
  157. int psc_x_arr_real = arr * psc;
  158. float realfreq = timerInClk / psc_x_arr_real;
  159. arr = arr - 1;
  160. psc = psc - 1;
  161. uint16_t comparevalue = 50 / 100.0 * arr;
  162. *prescaler = psc;
  163. *autoreload = arr;
  164. return true;
  165. }