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.

317 lines
6.1 KiB

2 years ago
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. const char* chip_gpio_group_get_name(GPIO_TypeDef* gpio_group) {
  100. if (gpio_group == GPIOA) {
  101. return "GPIOA";
  102. }
  103. if (gpio_group == GPIOB) {
  104. return "GPIOB";
  105. }
  106. if (gpio_group == GPIOC) {
  107. return "GPIOC";
  108. }
  109. if (gpio_group == GPIOD) {
  110. return "GPIOD";
  111. }
  112. if (gpio_group == GPIOE) {
  113. return "GPIOE";
  114. }
  115. if (gpio_group == GPIOF) {
  116. return "GPIOF";
  117. }
  118. if (gpio_group == GPIOG) {
  119. return "GPIOG";
  120. }
  121. return "unknown gpio group";
  122. }
  123. const char* chip_pinoff_get_name(uint16_t pinoff) {
  124. if (pinoff == GPIO_PIN_0) {
  125. return "0";
  126. }
  127. if (pinoff == GPIO_PIN_1) {
  128. return "1";
  129. }
  130. if (pinoff == GPIO_PIN_2) {
  131. return "2";
  132. }
  133. if (pinoff == GPIO_PIN_3) {
  134. return "3";
  135. }
  136. if (pinoff == GPIO_PIN_4) {
  137. return "4";
  138. }
  139. if (pinoff == GPIO_PIN_5) {
  140. return "5";
  141. }
  142. if (pinoff == GPIO_PIN_6) {
  143. return "6";
  144. }
  145. if (pinoff == GPIO_PIN_7) {
  146. return "7";
  147. }
  148. if (pinoff == GPIO_PIN_8) {
  149. return "8";
  150. }
  151. if (pinoff == GPIO_PIN_9) {
  152. return "9";
  153. }
  154. if (pinoff == GPIO_PIN_10) {
  155. return "10";
  156. }
  157. if (pinoff == GPIO_PIN_11) {
  158. return "11";
  159. }
  160. if (pinoff == GPIO_PIN_12) {
  161. return "12";
  162. }
  163. if (pinoff == GPIO_PIN_13) {
  164. return "13";
  165. }
  166. if (pinoff == GPIO_PIN_14) {
  167. return "14";
  168. }
  169. if (pinoff == GPIO_PIN_15) {
  170. return "15";
  171. }
  172. return "unknown pinoff";
  173. }
  174. // // no tim1
  175. // TIM2_IRQn
  176. // TIM3_IRQn
  177. // TIM4_IRQn
  178. // TIM5_IRQn
  179. // TIM6_DAC_IRQn
  180. // TIM7_IRQn
  181. // //no tim8
  182. // TIM1_BRK_TIM9_IRQn
  183. // TIM1_UP_TIM10_IRQn
  184. // TIM1_TRG_COM_TIM11_IRQn
  185. // TIM8_BRK_TIM12_IRQn
  186. // TIM8_UP_TIM13_IRQn
  187. // TIM8_TRG_COM_TIM14_IRQn
  188. IRQn_Type chip_tim_get_irq(TIM_HandleTypeDef* tim) {
  189. if (tim->Instance == TIM1) {
  190. EARLY_ASSERT(false);
  191. }
  192. if (tim->Instance == TIM2) {
  193. return TIM2_IRQn;
  194. }
  195. if (tim->Instance == TIM3) {
  196. return TIM3_IRQn;
  197. }
  198. if (tim->Instance == TIM4) {
  199. return TIM4_IRQn;
  200. }
  201. if (tim->Instance == TIM5) {
  202. return TIM5_IRQn;
  203. }
  204. if (tim->Instance == TIM6) {
  205. return TIM6_DAC_IRQn;
  206. }
  207. if (tim->Instance == TIM7) {
  208. return TIM7_IRQn;
  209. }
  210. if (tim->Instance == TIM8) {
  211. EARLY_ASSERT(false);
  212. }
  213. if (tim->Instance == TIM9) {
  214. return TIM1_BRK_TIM9_IRQn;
  215. }
  216. if (tim->Instance == TIM10) {
  217. return TIM1_UP_TIM10_IRQn;
  218. }
  219. if (tim->Instance == TIM11) {
  220. return TIM1_TRG_COM_TIM11_IRQn;
  221. }
  222. if (tim->Instance == TIM12) {
  223. return TIM8_BRK_TIM12_IRQn;
  224. }
  225. if (tim->Instance == TIM13) {
  226. return TIM8_UP_TIM13_IRQn;
  227. }
  228. if (tim->Instance == TIM14) {
  229. return TIM8_TRG_COM_TIM14_IRQn;
  230. }
  231. //
  232. EARLY_ASSERT(false);
  233. return (IRQn_Type)0;
  234. }
  235. uint32_t chip_get_timer_clock_sorce_freq(TIM_HandleTypeDef* tim) {
  236. uint32_t timClkFreq = 0;
  237. uint32_t pclk1Freq = HAL_RCC_GetPCLK1Freq();
  238. uint32_t pclk2Freq = HAL_RCC_GetPCLK2Freq();
  239. uint32_t sysClkFreq = HAL_RCC_GetSysClockFreq();
  240. uint32_t pFLatency;
  241. RCC_ClkInitTypeDef clkconfig;
  242. HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);
  243. bool isAPB2 = false;
  244. #ifdef TIM1
  245. if (tim->Instance == TIM1) isAPB2 = true;
  246. #endif
  247. #ifdef TIM8
  248. if (tim->Instance == TIM8) isAPB2 = true;
  249. #endif
  250. #ifdef TIM9
  251. if (tim->Instance == TIM9) isAPB2 = true;
  252. #endif
  253. #ifdef TIM10
  254. if (tim->Instance == TIM10) isAPB2 = true;
  255. #endif
  256. #ifdef TIM11
  257. if (tim->Instance == TIM11) isAPB2 = true;
  258. #endif
  259. if (isAPB2) {
  260. if (clkconfig.APB2CLKDivider == RCC_HCLK_DIV1) {
  261. timClkFreq = HAL_RCC_GetPCLK2Freq();
  262. } else {
  263. timClkFreq = 2 * HAL_RCC_GetPCLK2Freq();
  264. }
  265. } else {
  266. if (clkconfig.APB1CLKDivider == RCC_HCLK_DIV1) {
  267. timClkFreq = HAL_RCC_GetPCLK1Freq();
  268. } else {
  269. timClkFreq = 2 * HAL_RCC_GetPCLK1Freq();
  270. }
  271. }
  272. return timClkFreq;
  273. }
  274. }
  275. bool chip_calculate_prescaler_and_autoreload_by_expect_freq(uint32_t timerInClk, float infreqhz, uint32_t* prescaler, uint32_t* autoreload) {
  276. /**
  277. * @brief Ĵֵ
  278. */
  279. float psc_x_arr = timerInClk / infreqhz;
  280. uint32_t psc = 0;
  281. uint32_t arr = 65534;
  282. for (; arr > 2; arr--) {
  283. psc = psc_x_arr / arr;
  284. if (psc >= 1) {
  285. uint32_t tmparr = psc_x_arr / psc;
  286. if (tmparr >= 65534) continue;
  287. break;
  288. }
  289. }
  290. if (psc == 0) return false;
  291. if (arr <= 3) return false; // ��ʱ��һ���ڵķֱ���̫С��
  292. arr = psc_x_arr / psc;
  293. int psc_x_arr_real = arr * psc;
  294. float realfreq = timerInClk / psc_x_arr_real;
  295. arr = arr - 1;
  296. psc = psc - 1;
  297. uint16_t comparevalue = 50 / 100.0 * arr;
  298. *prescaler = psc;
  299. *autoreload = arr;
  300. return true;
  301. }