drv_pwm.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-07-15 ZYH first version
  9. */
  10. #include <rthw.h>
  11. #include <rtthread.h>
  12. #include <rtdevice.h>
  13. #include <board.h>
  14. #define MAX_PERIOD 65535
  15. #define MIN_PERIOD 3
  16. #define MIN_PULSE 2
  17. static rt_err_t drv_pwm_control(struct rt_device_pwm *device, int cmd, void *arg);
  18. static struct rt_pwm_ops drv_ops =
  19. {
  20. drv_pwm_control
  21. };
  22. static rt_err_t drv_pwm_enable(TIM_HandleTypeDef *htim, struct rt_pwm_configuration *configuration, rt_bool_t enable)
  23. {
  24. rt_uint32_t channel = 0x04 * (configuration->channel - 1);
  25. if (!enable)
  26. {
  27. HAL_TIM_PWM_Stop(htim, channel);
  28. }
  29. else
  30. {
  31. HAL_TIM_PWM_Start(htim, channel);
  32. }
  33. return RT_EOK;
  34. }
  35. static rt_err_t drv_pwm_get(TIM_HandleTypeDef *htim, struct rt_pwm_configuration *configuration)
  36. {
  37. rt_uint32_t channel = 0x04 * (configuration->channel - 1);
  38. rt_uint32_t tim_clock;
  39. #if (RT_HSE_HCLK > 100000000UL)//100M
  40. if (htim->Instance == TIM1 && htim->Instance == TIM8)
  41. {
  42. tim_clock = SystemCoreClock;
  43. }
  44. else
  45. {
  46. tim_clock = SystemCoreClock / 2;
  47. }
  48. #else
  49. tim_clock = SystemCoreClock;
  50. #endif
  51. if (__HAL_TIM_GET_CLOCKDIVISION(htim) == TIM_CLOCKDIVISION_DIV2)
  52. {
  53. tim_clock = tim_clock / 2;
  54. }
  55. else if (__HAL_TIM_GET_CLOCKDIVISION(htim) == TIM_CLOCKDIVISION_DIV4)
  56. {
  57. tim_clock = tim_clock / 4;
  58. }
  59. tim_clock /= 1000000UL;
  60. configuration->period = (__HAL_TIM_GET_AUTORELOAD(htim) + 1) * (htim->Instance->PSC + 1) * 1000UL / tim_clock;
  61. configuration->pulse = (__HAL_TIM_GET_COMPARE(htim, channel) + 1) * (htim->Instance->PSC + 1) * 1000UL / tim_clock;
  62. return RT_EOK;
  63. }
  64. static rt_err_t drv_pwm_set(TIM_HandleTypeDef *htim, struct rt_pwm_configuration *configuration)
  65. {
  66. rt_uint32_t period, pulse;
  67. rt_uint32_t tim_clock, psc;
  68. rt_uint32_t channel = 0x04 * (configuration->channel - 1);
  69. #if (RT_HSE_HCLK > 100000000UL)//100M
  70. if (htim->Instance == TIM1 && htim->Instance == TIM8)
  71. {
  72. tim_clock = SystemCoreClock;
  73. }
  74. else
  75. {
  76. tim_clock = SystemCoreClock / 2;
  77. }
  78. #else
  79. tim_clock = SystemCoreClock;
  80. #endif
  81. tim_clock /= 1000000UL;
  82. period = (unsigned long long)configuration->period * tim_clock / 1000ULL ;
  83. psc = period / MAX_PERIOD + 1;
  84. period = period / psc;
  85. __HAL_TIM_SET_PRESCALER(htim, psc - 1);
  86. if (period < MIN_PERIOD)
  87. {
  88. period = MIN_PERIOD;
  89. }
  90. __HAL_TIM_SET_AUTORELOAD(htim, period - 1);
  91. pulse = (unsigned long long)configuration->pulse * tim_clock / psc / 1000ULL;
  92. if (pulse < MIN_PULSE)
  93. {
  94. pulse = MIN_PULSE;
  95. }
  96. else if (pulse > period)
  97. {
  98. pulse = period;
  99. }
  100. __HAL_TIM_SET_COMPARE(htim, channel, pulse - 1);
  101. __HAL_TIM_SET_COUNTER(htim, 0);
  102. return RT_EOK;
  103. }
  104. static rt_err_t drv_pwm_control(struct rt_device_pwm *device, int cmd, void *arg)
  105. {
  106. struct rt_pwm_configuration *configuration = (struct rt_pwm_configuration *)arg;
  107. TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)device->parent.user_data;
  108. switch (cmd)
  109. {
  110. case PWM_CMD_ENABLE:
  111. return drv_pwm_enable(htim, configuration, RT_TRUE);
  112. case PWM_CMD_DISABLE:
  113. return drv_pwm_enable(htim, configuration, RT_FALSE);
  114. case PWM_CMD_SET:
  115. return drv_pwm_set(htim, configuration);
  116. case PWM_CMD_GET:
  117. return drv_pwm_get(htim, configuration);
  118. default:
  119. return RT_EINVAL;
  120. }
  121. }
  122. static void HAL_TIM_MspPostInit(TIM_HandleTypeDef *timHandle);
  123. #ifdef BSP_USING_PWM1
  124. TIM_HandleTypeDef htim1;
  125. #endif
  126. #ifdef BSP_USING_PWM2
  127. TIM_HandleTypeDef htim2;
  128. #endif
  129. #ifdef BSP_USING_PWM3
  130. TIM_HandleTypeDef htim3;
  131. #endif
  132. #ifdef BSP_USING_PWM4
  133. TIM_HandleTypeDef htim4;
  134. #endif
  135. #ifdef BSP_USING_PWM5
  136. TIM_HandleTypeDef htim5;
  137. #endif
  138. #ifdef BSP_USING_PWM1
  139. static void MX_TIM1_Init(void)
  140. {
  141. TIM_MasterConfigTypeDef sMasterConfig;
  142. TIM_OC_InitTypeDef sConfigOC;
  143. TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;
  144. htim1.Instance = TIM1;
  145. htim1.Init.Prescaler = 0;
  146. htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  147. htim1.Init.Period = 0;
  148. htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  149. htim1.Init.RepetitionCounter = 0;
  150. if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
  151. {
  152. RT_ASSERT(0);
  153. }
  154. sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  155. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  156. if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  157. {
  158. RT_ASSERT(0);
  159. }
  160. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  161. sConfigOC.Pulse = 0;
  162. sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  163. sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  164. sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  165. sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  166. sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  167. #ifdef BSP_USING_PWM1_CH1
  168. if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  169. {
  170. RT_ASSERT(0);
  171. }
  172. #endif /* BSP_USING_PWM1_CH1 */
  173. #ifdef BSP_USING_PWM1_CH2
  174. if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  175. {
  176. RT_ASSERT(0);
  177. }
  178. #endif /* BSP_USING_PWM1_CH2 */
  179. #ifdef BSP_USING_PWM1_CH3
  180. if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  181. {
  182. RT_ASSERT(0);
  183. }
  184. #endif /* BSP_USING_PWM1_CH3 */
  185. #ifdef BSP_USING_PWM1_CH4
  186. if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  187. {
  188. RT_ASSERT(0);
  189. }
  190. #endif /* BSP_USING_PWM1_CH4 */
  191. sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  192. sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  193. sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  194. sBreakDeadTimeConfig.DeadTime = 0;
  195. sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  196. sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  197. sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  198. if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
  199. {
  200. RT_ASSERT(0);
  201. }
  202. HAL_TIM_MspPostInit(&htim1);
  203. }
  204. #endif /* BSP_USING_PWM1 */
  205. #ifdef BSP_USING_PWM2
  206. static void MX_TIM2_Init(void)
  207. {
  208. TIM_MasterConfigTypeDef sMasterConfig;
  209. TIM_OC_InitTypeDef sConfigOC;
  210. htim2.Instance = TIM2;
  211. htim2.Init.Prescaler = 0;
  212. htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  213. htim2.Init.Period = 0;
  214. htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  215. if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
  216. {
  217. RT_ASSERT(0);
  218. }
  219. sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  220. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  221. if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  222. {
  223. RT_ASSERT(0);
  224. }
  225. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  226. sConfigOC.Pulse = 0;
  227. sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  228. sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  229. #ifdef BSP_USING_PWM2_CH1
  230. if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  231. {
  232. RT_ASSERT(0);
  233. }
  234. #endif /* BSP_USING_PWM2_CH1 */
  235. #ifdef BSP_USING_PWM2_CH2
  236. if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  237. {
  238. RT_ASSERT(0);
  239. }
  240. #endif /* BSP_USING_PWM2_CH2 */
  241. #ifdef BSP_USING_PWM2_CH3
  242. if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  243. {
  244. RT_ASSERT(0);
  245. }
  246. #endif /* BSP_USING_PWM2_CH3 */
  247. #ifdef BSP_USING_PWM2_CH4
  248. if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  249. {
  250. RT_ASSERT(0);
  251. }
  252. #endif /* BSP_USING_PWM2_CH3 */
  253. HAL_TIM_MspPostInit(&htim2);
  254. }
  255. #endif /* BSP_USING_PWM2 */
  256. #ifdef BSP_USING_PWM3
  257. void MX_TIM3_Init(void)
  258. {
  259. TIM_MasterConfigTypeDef sMasterConfig;
  260. TIM_OC_InitTypeDef sConfigOC;
  261. htim3.Instance = TIM3;
  262. htim3.Init.Prescaler = 0;
  263. htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  264. htim3.Init.Period = 0;
  265. htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  266. if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
  267. {
  268. RT_ASSERT(0);
  269. }
  270. sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  271. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  272. if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  273. {
  274. RT_ASSERT(0);
  275. }
  276. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  277. sConfigOC.Pulse = 0;
  278. sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  279. sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  280. #ifdef BSP_USING_PWM3_CH1
  281. if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  282. {
  283. RT_ASSERT(0);
  284. }
  285. #endif /* BSP_USING_PWM3_CH1 */
  286. #ifdef BSP_USING_PWM3_CH2
  287. if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  288. {
  289. RT_ASSERT(0);
  290. }
  291. #endif /* BSP_USING_PWM3_CH2 */
  292. #ifdef BSP_USING_PWM3_CH3
  293. if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  294. {
  295. RT_ASSERT(0);
  296. }
  297. #endif /* BSP_USING_PWM3_CH3 */
  298. #ifdef BSP_USING_PWM3_CH4
  299. if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  300. {
  301. RT_ASSERT(0);
  302. }
  303. #endif /* BSP_USING_PWM3_CH4 */
  304. HAL_TIM_MspPostInit(&htim3);
  305. }
  306. #endif /* BSP_USING_PWM3 */
  307. #ifdef BSP_USING_PWM4
  308. void MX_TIM4_Init(void)
  309. {
  310. TIM_MasterConfigTypeDef sMasterConfig;
  311. TIM_OC_InitTypeDef sConfigOC;
  312. htim4.Instance = TIM4;
  313. htim4.Init.Prescaler = 0;
  314. htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  315. htim4.Init.Period = 0;
  316. htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  317. if (HAL_TIM_PWM_Init(&htim4) != HAL_OK)
  318. {
  319. RT_ASSERT(0);
  320. }
  321. sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  322. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  323. if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
  324. {
  325. RT_ASSERT(0);
  326. }
  327. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  328. sConfigOC.Pulse = 0;
  329. sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  330. sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  331. #ifdef BSP_USING_PWM4_CH1
  332. if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  333. {
  334. RT_ASSERT(0);
  335. }
  336. #endif /* BSP_USING_PWM4_CH1 */
  337. #ifdef BSP_USING_PWM4_CH2
  338. if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  339. {
  340. RT_ASSERT(0);
  341. }
  342. #endif /* BSP_USING_PWM4_CH2 */
  343. #ifdef BSP_USING_PWM4_CH3
  344. if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  345. {
  346. RT_ASSERT(0);
  347. }
  348. #endif /* BSP_USING_PWM4_CH3 */
  349. #ifdef BSP_USING_PWM4_CH4
  350. if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  351. {
  352. RT_ASSERT(0);
  353. }
  354. #endif /* BSP_USING_PWM4_CH4 */
  355. HAL_TIM_MspPostInit(&htim4);
  356. }
  357. #endif /* BSP_USING_PWM4 */
  358. #ifdef BSP_USING_PWM5
  359. void MX_TIM5_Init(void)
  360. {
  361. TIM_MasterConfigTypeDef sMasterConfig;
  362. TIM_OC_InitTypeDef sConfigOC;
  363. htim5.Instance = TIM5;
  364. htim5.Init.Prescaler = 0;
  365. htim5.Init.CounterMode = TIM_COUNTERMODE_UP;
  366. htim5.Init.Period = 0;
  367. htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  368. if (HAL_TIM_PWM_Init(&htim5) != HAL_OK)
  369. {
  370. RT_ASSERT(0);
  371. }
  372. sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  373. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  374. if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK)
  375. {
  376. RT_ASSERT(0);
  377. }
  378. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  379. sConfigOC.Pulse = 0;
  380. sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  381. sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  382. #ifdef BSP_USING_PWM5_CH1
  383. if (HAL_TIM_PWM_ConfigChannel(&htim5, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  384. {
  385. RT_ASSERT(0);
  386. }
  387. #endif /* BSP_USING_PWM5_CH1 */
  388. #ifdef BSP_USING_PWM5_CH2
  389. if (HAL_TIM_PWM_ConfigChannel(&htim5, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  390. {
  391. RT_ASSERT(0);
  392. }
  393. #endif /* BSP_USING_PWM5_CH2 */
  394. #ifdef BSP_USING_PWM5_CH3
  395. if (HAL_TIM_PWM_ConfigChannel(&htim5, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  396. {
  397. RT_ASSERT(0);
  398. }
  399. #endif /* BSP_USING_PWM5_CH3 */
  400. HAL_TIM_MspPostInit(&htim5);
  401. }
  402. #endif /* BSP_USING_PWM5 */
  403. void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *tim_pwmHandle)
  404. {
  405. if (tim_pwmHandle->Instance == TIM1)
  406. {
  407. __HAL_RCC_TIM1_CLK_ENABLE();
  408. }
  409. else if (tim_pwmHandle->Instance == TIM2)
  410. {
  411. __HAL_RCC_TIM2_CLK_ENABLE();
  412. }
  413. else if (tim_pwmHandle->Instance == TIM3)
  414. {
  415. __HAL_RCC_TIM3_CLK_ENABLE();
  416. }
  417. else if (tim_pwmHandle->Instance == TIM4)
  418. {
  419. __HAL_RCC_TIM4_CLK_ENABLE();
  420. }
  421. else if (tim_pwmHandle->Instance == TIM5)
  422. {
  423. __HAL_RCC_TIM5_CLK_ENABLE();
  424. }
  425. }
  426. static void HAL_TIM_MspPostInit(TIM_HandleTypeDef *timHandle)
  427. {
  428. GPIO_InitTypeDef GPIO_InitStruct;
  429. if (timHandle->Instance == TIM1)
  430. {
  431. /**TIM1 GPIO Configuration
  432. PA8 ------> TIM1_CH1
  433. PA9 ------> TIM1_CH2
  434. PA10 ------> TIM1_CH3
  435. PA11 ------> TIM1_CH4
  436. */
  437. #if defined(BSP_USING_PWM1_CH1) || defined(BSP_USING_PWM1_CH2) || defined(BSP_USING_PWM1_CH3) || defined(BSP_USING_PWM1_CH4)
  438. __HAL_RCC_GPIOA_CLK_ENABLE();
  439. GPIO_InitStruct.Pin = 0x00;
  440. #ifdef BSP_USING_PWM1_CH1
  441. GPIO_InitStruct.Pin |= GPIO_PIN_8;
  442. #endif
  443. #ifdef BSP_USING_PWM1_CH2
  444. GPIO_InitStruct.Pin |= GPIO_PIN_9;
  445. #endif
  446. #ifdef BSP_USING_PWM1_CH3
  447. GPIO_InitStruct.Pin |= GPIO_PIN_10;
  448. #endif
  449. #ifdef BSP_USING_PWM1_CH4
  450. GPIO_InitStruct.Pin |= GPIO_PIN_11;
  451. #endif
  452. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  453. GPIO_InitStruct.Pull = GPIO_NOPULL;
  454. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  455. GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
  456. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  457. #endif
  458. }
  459. else if (timHandle->Instance == TIM2)
  460. {
  461. /**TIM2 GPIO Configuration
  462. PA3 ------> TIM2_CH4
  463. PA5 ------> TIM2_CH1
  464. PB10 ------> TIM2_CH3
  465. PB3 ------> TIM2_CH2
  466. */
  467. #if defined(BSP_USING_PWM2_CH1) || defined(BSP_USING_PWM2_CH4)
  468. __HAL_RCC_GPIOA_CLK_ENABLE();
  469. GPIO_InitStruct.Pin = 0x00;
  470. #ifdef BSP_USING_PWM2_CH4
  471. GPIO_InitStruct.Pin |= GPIO_PIN_3;
  472. #endif
  473. #ifdef BSP_USING_PWM2_CH1
  474. GPIO_InitStruct.Pin |= GPIO_PIN_5;
  475. #endif
  476. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  477. GPIO_InitStruct.Pull = GPIO_NOPULL;
  478. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  479. GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
  480. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  481. #endif
  482. #if defined(BSP_USING_PWM2_CH2) || defined(BSP_USING_PWM2_CH3)
  483. __HAL_RCC_GPIOB_CLK_ENABLE();
  484. GPIO_InitStruct.Pin = 0x00;
  485. #ifdef BSP_USING_PWM2_CH2
  486. GPIO_InitStruct.Pin |= GPIO_PIN_3;
  487. #endif
  488. #ifdef BSP_USING_PWM2_CH3
  489. GPIO_InitStruct.Pin |= GPIO_PIN_10;
  490. #endif
  491. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  492. GPIO_InitStruct.Pull = GPIO_NOPULL;
  493. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  494. GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
  495. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  496. #endif
  497. }
  498. else if (timHandle->Instance == TIM3)
  499. {
  500. /**TIM3 GPIO Configuration
  501. PA6 ------> TIM3_CH1
  502. PA7 ------> TIM3_CH2
  503. PB0 ------> TIM3_CH3
  504. PB1 ------> TIM3_CH4
  505. */
  506. #if defined(BSP_USING_PWM3_CH1) || defined(BSP_USING_PWM3_CH2)
  507. __HAL_RCC_GPIOA_CLK_ENABLE();
  508. GPIO_InitStruct.Pin = 0x00;
  509. #ifdef BSP_USING_PWM3_CH1
  510. GPIO_InitStruct.Pin |= GPIO_PIN_6;
  511. #endif
  512. #ifdef BSP_USING_PWM3_CH2
  513. GPIO_InitStruct.Pin |= GPIO_PIN_7;
  514. #endif
  515. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  516. GPIO_InitStruct.Pull = GPIO_NOPULL;
  517. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  518. GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
  519. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  520. GPIO_InitStruct.Pin = 0x00;
  521. #endif
  522. #if defined(BSP_USING_PWM3_CH3) || defined(BSP_USING_PWM3_CH4)
  523. __HAL_RCC_GPIOB_CLK_ENABLE();
  524. GPIO_InitStruct.Pin = 0x00;
  525. #ifdef BSP_USING_PWM3_CH3
  526. GPIO_InitStruct.Pin |= GPIO_PIN_0;
  527. #endif
  528. #ifdef BSP_USING_PWM3_CH4
  529. GPIO_InitStruct.Pin |= GPIO_PIN_1;
  530. #endif
  531. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  532. GPIO_InitStruct.Pull = GPIO_NOPULL;
  533. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  534. GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
  535. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  536. #endif
  537. }
  538. else if (timHandle->Instance == TIM4)
  539. {
  540. /**TIM4 GPIO Configuration
  541. PB6 ------> TIM4_CH1
  542. PB7 ------> TIM4_CH2
  543. PB8 ------> TIM4_CH3
  544. PB9 ------> TIM4_CH4
  545. */
  546. #if defined(BSP_USING_PWM4_CH1) || defined(BSP_USING_PWM4_CH2) || defined(BSP_USING_PWM4_CH3) || defined(BSP_USING_PWM4_CH4)
  547. __HAL_RCC_GPIOB_CLK_ENABLE();
  548. GPIO_InitStruct.Pin = 0x00;
  549. #ifdef BSP_USING_PWM4_CH1
  550. GPIO_InitStruct.Pin |= GPIO_PIN_6;
  551. #endif
  552. #ifdef BSP_USING_PWM4_CH2
  553. GPIO_InitStruct.Pin |= GPIO_PIN_7;
  554. #endif
  555. #ifdef BSP_USING_PWM4_CH3
  556. GPIO_InitStruct.Pin |= GPIO_PIN_8;
  557. #endif
  558. #ifdef BSP_USING_PWM4_CH4
  559. GPIO_InitStruct.Pin |= GPIO_PIN_9;
  560. #endif
  561. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  562. GPIO_InitStruct.Pull = GPIO_NOPULL;
  563. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  564. GPIO_InitStruct.Alternate = GPIO_AF2_TIM4;
  565. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  566. #endif
  567. }
  568. else if (timHandle->Instance == TIM5)
  569. {
  570. /**TIM5 GPIO Configuration
  571. PA0-WKUP ------> TIM5_CH1
  572. PA1 ------> TIM5_CH2
  573. PA2 ------> TIM5_CH3
  574. */
  575. #if defined(BSP_USING_PWM5_CH1) || defined(BSP_USING_PWM5_CH2) || defined(BSP_USING_PWM5_CH3)
  576. __HAL_RCC_GPIOA_CLK_ENABLE();
  577. GPIO_InitStruct.Pin = 0x00;
  578. #ifdef BSP_USING_PWM5_CH1
  579. GPIO_InitStruct.Pin |= GPIO_PIN_0;
  580. #endif
  581. #ifdef BSP_USING_PWM5_CH2
  582. GPIO_InitStruct.Pin |= GPIO_PIN_1;
  583. #endif
  584. #ifdef BSP_USING_PWM5_CH3
  585. GPIO_InitStruct.Pin |= GPIO_PIN_2;
  586. #endif
  587. GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2;
  588. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  589. GPIO_InitStruct.Pull = GPIO_NOPULL;
  590. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  591. GPIO_InitStruct.Alternate = GPIO_AF2_TIM5;
  592. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  593. #endif
  594. }
  595. }
  596. void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *tim_pwmHandle)
  597. {
  598. if (tim_pwmHandle->Instance == TIM1)
  599. {
  600. __HAL_RCC_TIM1_CLK_DISABLE();
  601. }
  602. else if (tim_pwmHandle->Instance == TIM2)
  603. {
  604. __HAL_RCC_TIM2_CLK_DISABLE();
  605. }
  606. else if (tim_pwmHandle->Instance == TIM3)
  607. {
  608. __HAL_RCC_TIM3_CLK_DISABLE();
  609. }
  610. else if (tim_pwmHandle->Instance == TIM4)
  611. {
  612. __HAL_RCC_TIM4_CLK_DISABLE();
  613. }
  614. else if (tim_pwmHandle->Instance == TIM5)
  615. {
  616. __HAL_RCC_TIM5_CLK_DISABLE();
  617. }
  618. }
  619. int drv_pwm_init(void)
  620. {
  621. #ifdef BSP_USING_PWM1
  622. MX_TIM1_Init();
  623. rt_device_pwm_register(rt_calloc(1, sizeof(struct rt_device_pwm)), "pwm1", &drv_ops, &htim1);
  624. #endif
  625. #ifdef BSP_USING_PWM2
  626. MX_TIM2_Init();
  627. rt_device_pwm_register(rt_calloc(1, sizeof(struct rt_device_pwm)), "pwm2", &drv_ops, &htim2);
  628. #endif
  629. #ifdef BSP_USING_PWM3
  630. MX_TIM3_Init();
  631. rt_device_pwm_register(rt_calloc(1, sizeof(struct rt_device_pwm)), "pwm3", &drv_ops, &htim3);
  632. #endif
  633. #ifdef BSP_USING_PWM4
  634. MX_TIM4_Init();
  635. rt_device_pwm_register(rt_calloc(1, sizeof(struct rt_device_pwm)), "pwm4", &drv_ops, &htim4);
  636. #endif
  637. #ifdef BSP_USING_PWM5
  638. MX_TIM5_Init();
  639. rt_device_pwm_register(rt_calloc(1, sizeof(struct rt_device_pwm)), "pwm5", &drv_ops, &htim5);
  640. #endif
  641. return 0;
  642. }
  643. INIT_DEVICE_EXPORT(drv_pwm_init);