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.

241 lines
4.7 KiB

2 years ago
2 years ago
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. // // no tim1
  100. // TIM2_IRQn
  101. // TIM3_IRQn
  102. // TIM4_IRQn
  103. // TIM5_IRQn
  104. // TIM6_DAC_IRQn
  105. // TIM7_IRQn
  106. // //no tim8
  107. // TIM1_BRK_TIM9_IRQn
  108. // TIM1_UP_TIM10_IRQn
  109. // TIM1_TRG_COM_TIM11_IRQn
  110. // TIM8_BRK_TIM12_IRQn
  111. // TIM8_UP_TIM13_IRQn
  112. // TIM8_TRG_COM_TIM14_IRQn
  113. IRQn_Type chip_tim_get_irq(TIM_HandleTypeDef* tim) {
  114. if (tim->Instance == TIM1) {
  115. EARLY_ASSERT(false);
  116. }
  117. if (tim->Instance == TIM2) {
  118. return TIM2_IRQn;
  119. }
  120. if (tim->Instance == TIM3) {
  121. return TIM3_IRQn;
  122. }
  123. if (tim->Instance == TIM4) {
  124. return TIM4_IRQn;
  125. }
  126. if (tim->Instance == TIM5) {
  127. return TIM5_IRQn;
  128. }
  129. if (tim->Instance == TIM6) {
  130. return TIM6_DAC_IRQn;
  131. }
  132. if (tim->Instance == TIM7) {
  133. return TIM7_IRQn;
  134. }
  135. if (tim->Instance == TIM8) {
  136. EARLY_ASSERT(false);
  137. }
  138. if (tim->Instance == TIM9) {
  139. return TIM1_BRK_TIM9_IRQn;
  140. }
  141. if (tim->Instance == TIM10) {
  142. return TIM1_UP_TIM10_IRQn;
  143. }
  144. if (tim->Instance == TIM11) {
  145. return TIM1_TRG_COM_TIM11_IRQn;
  146. }
  147. if (tim->Instance == TIM12) {
  148. return TIM8_BRK_TIM12_IRQn;
  149. }
  150. if (tim->Instance == TIM13) {
  151. return TIM8_UP_TIM13_IRQn;
  152. }
  153. if (tim->Instance == TIM14) {
  154. return TIM8_TRG_COM_TIM14_IRQn;
  155. }
  156. //
  157. EARLY_ASSERT(false);
  158. return (IRQn_Type)0;
  159. }
  160. uint32_t chip_get_timer_clock_sorce_freq(TIM_HandleTypeDef* tim) {
  161. uint32_t timClkFreq = 0;
  162. uint32_t pclk1Freq = HAL_RCC_GetPCLK1Freq();
  163. uint32_t pclk2Freq = HAL_RCC_GetPCLK2Freq();
  164. uint32_t sysClkFreq = HAL_RCC_GetSysClockFreq();
  165. uint32_t pFLatency;
  166. RCC_ClkInitTypeDef clkconfig;
  167. HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);
  168. bool isAPB2 = false;
  169. #ifdef TIM1
  170. if (tim->Instance == TIM1) isAPB2 = true;
  171. #endif
  172. #ifdef TIM8
  173. if (tim->Instance == TIM8) isAPB2 = true;
  174. #endif
  175. #ifdef TIM9
  176. if (tim->Instance == TIM9) isAPB2 = true;
  177. #endif
  178. #ifdef TIM10
  179. if (tim->Instance == TIM10) isAPB2 = true;
  180. #endif
  181. #ifdef TIM11
  182. if (tim->Instance == TIM11) isAPB2 = true;
  183. #endif
  184. if (isAPB2) {
  185. if (clkconfig.APB2CLKDivider == RCC_HCLK_DIV1) {
  186. timClkFreq = HAL_RCC_GetPCLK2Freq();
  187. } else {
  188. timClkFreq = 2 * HAL_RCC_GetPCLK2Freq();
  189. }
  190. } else {
  191. if (clkconfig.APB1CLKDivider == RCC_HCLK_DIV1) {
  192. timClkFreq = HAL_RCC_GetPCLK1Freq();
  193. } else {
  194. timClkFreq = 2 * HAL_RCC_GetPCLK1Freq();
  195. }
  196. }
  197. return timClkFreq;
  198. }
  199. }
  200. bool chip_calculate_prescaler_and_autoreload_by_expect_freq(uint32_t timerInClk, float infreqhz, uint32_t* prescaler, uint32_t* autoreload) {
  201. /**
  202. * @brief Ĵֵ
  203. */
  204. float psc_x_arr = timerInClk / infreqhz;
  205. uint32_t psc = 0;
  206. uint32_t arr = 65534;
  207. for (; arr > 2; arr--) {
  208. psc = psc_x_arr / arr;
  209. if (psc >= 1) {
  210. uint32_t tmparr = psc_x_arr / psc;
  211. if (tmparr >= 65534) continue;
  212. break;
  213. }
  214. }
  215. if (psc == 0) return false;
  216. if (arr <= 3) return false; // ��ʱ��һ���ڵķֱ���̫С��
  217. arr = psc_x_arr / psc;
  218. int psc_x_arr_real = arr * psc;
  219. float realfreq = timerInClk / psc_x_arr_real;
  220. arr = arr - 1;
  221. psc = psc - 1;
  222. uint16_t comparevalue = 50 / 100.0 * arr;
  223. *prescaler = psc;
  224. *autoreload = arr;
  225. return true;
  226. }