drv_pwm.c 20 KB

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