drv_pwm.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842
  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. * 2018-10-19 XXXXzzzz000 transplant from stm32f4xx-HAL drv_pwm.c
  10. */
  11. #include <rthw.h>
  12. #include <rtthread.h>
  13. #include <rtdevice.h>
  14. #include <board.h>
  15. #define MAX_PERIOD 65535
  16. #define MIN_PERIOD 3
  17. #define MIN_PULSE 2
  18. static rt_err_t drv_pwm_control(struct rt_device_pwm *device, int cmd, void *arg);
  19. static struct rt_pwm_ops drv_ops =
  20. {
  21. drv_pwm_control};
  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. tim_clock = SystemCoreClock;
  40. if (__HAL_TIM_GET_CLOCKDIVISION(htim) == TIM_CLOCKDIVISION_DIV2)
  41. {
  42. tim_clock = tim_clock / 2;
  43. }
  44. else if (__HAL_TIM_GET_CLOCKDIVISION(htim) == TIM_CLOCKDIVISION_DIV4)
  45. {
  46. tim_clock = tim_clock / 4;
  47. }
  48. tim_clock /= 1000000UL;
  49. configuration->period = (__HAL_TIM_GET_AUTORELOAD(htim) + 1) * (htim->Instance->PSC + 1) * 1000UL / tim_clock;
  50. configuration->pulse = (__HAL_TIM_GET_COMPARE(htim, channel) + 1) * (htim->Instance->PSC + 1) * 1000UL / tim_clock;
  51. return RT_EOK;
  52. }
  53. static rt_err_t drv_pwm_set(TIM_HandleTypeDef *htim, struct rt_pwm_configuration *configuration)
  54. {
  55. rt_uint32_t period, pulse;
  56. rt_uint32_t tim_clock, psc;
  57. rt_uint32_t channel = 0x04 * (configuration->channel - 1);
  58. tim_clock = SystemCoreClock;
  59. tim_clock /= 1000000UL;
  60. period = (unsigned long long)configuration->period * tim_clock / 1000ULL;
  61. psc = period / MAX_PERIOD + 1;
  62. period = period / psc;
  63. __HAL_TIM_SET_PRESCALER(htim, psc - 1);
  64. if (period < MIN_PERIOD)
  65. {
  66. period = MIN_PERIOD;
  67. }
  68. __HAL_TIM_SET_AUTORELOAD(htim, period - 1);
  69. pulse = (unsigned long long)configuration->pulse * tim_clock / psc / 1000ULL;
  70. if (pulse < MIN_PULSE)
  71. {
  72. pulse = MIN_PULSE;
  73. }
  74. else if (pulse > period)
  75. {
  76. pulse = period;
  77. }
  78. __HAL_TIM_SET_COMPARE(htim, channel, pulse - 1);
  79. __HAL_TIM_SET_COUNTER(htim, 0);
  80. return RT_EOK;
  81. }
  82. static rt_err_t drv_pwm_control(struct rt_device_pwm *device, int cmd, void *arg)
  83. {
  84. struct rt_pwm_configuration *configuration = (struct rt_pwm_configuration *)arg;
  85. TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)device->parent.user_data;
  86. switch (cmd)
  87. {
  88. case PWM_CMD_ENABLE:
  89. return drv_pwm_enable(htim, configuration, RT_TRUE);
  90. case PWM_CMD_DISABLE:
  91. return drv_pwm_enable(htim, configuration, RT_FALSE);
  92. case PWM_CMD_SET:
  93. return drv_pwm_set(htim, configuration);
  94. case PWM_CMD_GET:
  95. return drv_pwm_get(htim, configuration);
  96. default:
  97. return RT_EINVAL;
  98. }
  99. }
  100. static void HAL_TIM_MspPostInit(TIM_HandleTypeDef *timHandle);
  101. #ifdef BSP_USING_PWM1
  102. TIM_HandleTypeDef htim1;
  103. #endif
  104. #ifdef BSP_USING_PWM2
  105. TIM_HandleTypeDef htim2;
  106. #endif
  107. #ifdef BSP_USING_PWM3
  108. TIM_HandleTypeDef htim3;
  109. #endif
  110. #ifdef BSP_USING_PWM4
  111. TIM_HandleTypeDef htim4;
  112. #endif
  113. #ifdef BSP_USING_PWM5
  114. TIM_HandleTypeDef htim5;
  115. #endif
  116. #ifdef BSP_USING_PWM8
  117. TIM_HandleTypeDef htim8;
  118. #endif
  119. #ifdef BSP_USING_PWM1
  120. static void MX_TIM1_Init(void)
  121. {
  122. TIM_MasterConfigTypeDef sMasterConfig;
  123. TIM_OC_InitTypeDef sConfigOC;
  124. TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;
  125. htim1.Instance = TIM1;
  126. htim1.Init.Prescaler = 0;
  127. htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  128. htim1.Init.Period = 0;
  129. htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  130. htim1.Init.RepetitionCounter = 0;
  131. if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
  132. {
  133. RT_ASSERT(0);
  134. }
  135. if (HAL_TIM_OC_Init(&htim1) != HAL_OK)
  136. {
  137. RT_ASSERT(0);
  138. }
  139. sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  140. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  141. if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  142. {
  143. RT_ASSERT(0);
  144. }
  145. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  146. sConfigOC.Pulse = 0;
  147. sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  148. sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  149. sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  150. sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  151. sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  152. #ifdef BSP_USING_PWM1_CH1
  153. if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  154. {
  155. RT_ASSERT(0);
  156. }
  157. #endif /* BSP_USING_PWM1_CH1 */
  158. #ifdef BSP_USING_PWM1_CH2
  159. if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  160. {
  161. RT_ASSERT(0);
  162. }
  163. #endif /* BSP_USING_PWM1_CH2 */
  164. sConfigOC.OCMode = TIM_OCMODE_TIMING;
  165. #ifdef BSP_USING_PWM1_CH3
  166. if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  167. {
  168. RT_ASSERT(0);
  169. }
  170. #endif /* BSP_USING_PWM1_CH3 */
  171. #ifdef BSP_USING_PWM1_CH4
  172. if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  173. {
  174. RT_ASSERT(0);
  175. }
  176. #endif /* BSP_USING_PWM1_CH4 */
  177. sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  178. sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  179. sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  180. sBreakDeadTimeConfig.DeadTime = 0;
  181. sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  182. sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  183. sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  184. if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
  185. {
  186. RT_ASSERT(0);
  187. }
  188. HAL_TIM_MspPostInit(&htim1);
  189. }
  190. #endif /* BSP_USING_PWM1 */
  191. #ifdef BSP_USING_PWM2
  192. static void MX_TIM2_Init(void)
  193. {
  194. TIM_MasterConfigTypeDef sMasterConfig;
  195. TIM_OC_InitTypeDef sConfigOC;
  196. htim2.Instance = TIM2;
  197. htim2.Init.Prescaler = 0;
  198. htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  199. htim2.Init.Period = 0;
  200. htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  201. if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
  202. {
  203. RT_ASSERT(0);
  204. }
  205. sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  206. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  207. if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  208. {
  209. RT_ASSERT(0);
  210. }
  211. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  212. sConfigOC.Pulse = 0;
  213. sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  214. sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  215. #ifdef BSP_USING_PWM2_CH1
  216. if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  217. {
  218. RT_ASSERT(0);
  219. }
  220. #endif /* BSP_USING_PWM2_CH1 */
  221. #ifdef BSP_USING_PWM2_CH2
  222. if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  223. {
  224. RT_ASSERT(0);
  225. }
  226. #endif /* BSP_USING_PWM2_CH2 */
  227. #ifdef BSP_USING_PWM2_CH3
  228. if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  229. {
  230. RT_ASSERT(0);
  231. }
  232. #endif /* BSP_USING_PWM2_CH3 */
  233. #ifdef BSP_USING_PWM2_CH4
  234. if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  235. {
  236. RT_ASSERT(0);
  237. }
  238. #endif /* BSP_USING_PWM2_CH3 */
  239. HAL_TIM_MspPostInit(&htim2);
  240. }
  241. #endif /* BSP_USING_PWM2 */
  242. #ifdef BSP_USING_PWM3
  243. void MX_TIM3_Init(void)
  244. {
  245. TIM_MasterConfigTypeDef sMasterConfig;
  246. TIM_OC_InitTypeDef sConfigOC;
  247. htim3.Instance = TIM3;
  248. htim3.Init.Prescaler = 0;
  249. htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  250. htim3.Init.Period = 0;
  251. htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  252. if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
  253. {
  254. RT_ASSERT(0);
  255. }
  256. sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  257. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  258. if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  259. {
  260. RT_ASSERT(0);
  261. }
  262. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  263. sConfigOC.Pulse = 0;
  264. sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  265. sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  266. #ifdef BSP_USING_PWM3_CH1
  267. if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  268. {
  269. RT_ASSERT(0);
  270. }
  271. #endif /* BSP_USING_PWM3_CH1 */
  272. #ifdef BSP_USING_PWM3_CH2
  273. if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  274. {
  275. RT_ASSERT(0);
  276. }
  277. #endif /* BSP_USING_PWM3_CH2 */
  278. #ifdef BSP_USING_PWM3_CH3
  279. if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  280. {
  281. RT_ASSERT(0);
  282. }
  283. #endif /* BSP_USING_PWM3_CH3 */
  284. #ifdef BSP_USING_PWM3_CH4
  285. if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  286. {
  287. RT_ASSERT(0);
  288. }
  289. #endif /* BSP_USING_PWM3_CH4 */
  290. HAL_TIM_MspPostInit(&htim3);
  291. }
  292. #endif /* BSP_USING_PWM3 */
  293. #ifdef BSP_USING_PWM4
  294. void MX_TIM4_Init(void)
  295. {
  296. TIM_MasterConfigTypeDef sMasterConfig;
  297. TIM_OC_InitTypeDef sConfigOC;
  298. htim4.Instance = TIM4;
  299. htim4.Init.Prescaler = 0;
  300. htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  301. htim4.Init.Period = 0;
  302. htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  303. if (HAL_TIM_PWM_Init(&htim4) != HAL_OK)
  304. {
  305. RT_ASSERT(0);
  306. }
  307. sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  308. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  309. if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
  310. {
  311. RT_ASSERT(0);
  312. }
  313. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  314. sConfigOC.Pulse = 0;
  315. sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  316. sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  317. #ifdef BSP_USING_PWM4_CH1
  318. if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  319. {
  320. RT_ASSERT(0);
  321. }
  322. #endif /* BSP_USING_PWM4_CH1 */
  323. #ifdef BSP_USING_PWM4_CH2
  324. if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  325. {
  326. RT_ASSERT(0);
  327. }
  328. #endif /* BSP_USING_PWM4_CH2 */
  329. #ifdef BSP_USING_PWM4_CH3
  330. if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  331. {
  332. RT_ASSERT(0);
  333. }
  334. #endif /* BSP_USING_PWM4_CH3 */
  335. #ifdef BSP_USING_PWM4_CH4
  336. if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  337. {
  338. RT_ASSERT(0);
  339. }
  340. #endif /* BSP_USING_PWM4_CH4 */
  341. HAL_TIM_MspPostInit(&htim4);
  342. }
  343. #endif /* BSP_USING_PWM4 */
  344. #ifdef BSP_USING_PWM5
  345. void MX_TIM5_Init(void)
  346. {
  347. TIM_MasterConfigTypeDef sMasterConfig;
  348. TIM_OC_InitTypeDef sConfigOC;
  349. htim5.Instance = TIM5;
  350. htim5.Init.Prescaler = 0;
  351. htim5.Init.CounterMode = TIM_COUNTERMODE_UP;
  352. htim5.Init.Period = 0;
  353. htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  354. if (HAL_TIM_PWM_Init(&htim5) != HAL_OK)
  355. {
  356. RT_ASSERT(0);
  357. }
  358. sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  359. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  360. if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK)
  361. {
  362. RT_ASSERT(0);
  363. }
  364. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  365. sConfigOC.Pulse = 0;
  366. sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  367. sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  368. #ifdef BSP_USING_PWM5_CH1
  369. if (HAL_TIM_PWM_ConfigChannel(&htim5, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  370. {
  371. RT_ASSERT(0);
  372. }
  373. #endif /* BSP_USING_PWM5_CH1 */
  374. #ifdef BSP_USING_PWM5_CH2
  375. if (HAL_TIM_PWM_ConfigChannel(&htim5, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  376. {
  377. RT_ASSERT(0);
  378. }
  379. #endif /* BSP_USING_PWM5_CH2 */
  380. #ifdef BSP_USING_PWM5_CH3
  381. if (HAL_TIM_PWM_ConfigChannel(&htim5, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  382. {
  383. RT_ASSERT(0);
  384. }
  385. #endif /* BSP_USING_PWM5_CH3 */
  386. #ifdef BSP_USING_PWM5_CH4
  387. if (HAL_TIM_PWM_ConfigChannel(&htim5, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  388. {
  389. RT_ASSERT(0);
  390. }
  391. #endif /* BSP_USING_PWM5_CH3 */
  392. HAL_TIM_MspPostInit(&htim5);
  393. }
  394. #endif /* BSP_USING_PWM5 */
  395. #ifdef BSP_USING_PWM8
  396. static void MX_TIM8_Init(void)
  397. {
  398. TIM_MasterConfigTypeDef sMasterConfig;
  399. TIM_OC_InitTypeDef sConfigOC;
  400. TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;
  401. htim8.Instance = TIM8;
  402. htim8.Init.Prescaler = 0;
  403. htim8.Init.CounterMode = TIM_COUNTERMODE_UP;
  404. htim8.Init.Period = 0;
  405. htim8.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  406. htim8.Init.RepetitionCounter = 0;
  407. if (HAL_TIM_PWM_Init(&htim8) != HAL_OK)
  408. {
  409. RT_ASSERT(0);
  410. }
  411. sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  412. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  413. if (HAL_TIMEx_MasterConfigSynchronization(&htim8, &sMasterConfig) != HAL_OK)
  414. {
  415. RT_ASSERT(0);
  416. }
  417. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  418. sConfigOC.Pulse = 0;
  419. sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  420. sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  421. sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  422. sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  423. sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  424. #ifdef BSP_USING_PWM8_CH1
  425. if (HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  426. {
  427. RT_ASSERT(0);
  428. }
  429. #endif /* BSP_USING_PWM8_CH1 */
  430. #ifdef BSP_USING_PWM8_CH2
  431. if (HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  432. {
  433. RT_ASSERT(0);
  434. }
  435. #endif /* BSP_USING_PWM8_CH2 */
  436. #ifdef BSP_USING_PWM8_CH3
  437. if (HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  438. {
  439. RT_ASSERT(0);
  440. }
  441. #endif /* BSP_USING_PWM8_CH3 */
  442. #ifdef BSP_USING_PWM8_CH4
  443. if (HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  444. {
  445. RT_ASSERT(0);
  446. }
  447. #endif /* BSP_USING_PWM8_CH4 */
  448. sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  449. sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  450. sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  451. sBreakDeadTimeConfig.DeadTime = 0;
  452. sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  453. sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  454. sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  455. if (HAL_TIMEx_ConfigBreakDeadTime(&htim8, &sBreakDeadTimeConfig) != HAL_OK)
  456. {
  457. RT_ASSERT(0);
  458. }
  459. HAL_TIM_MspPostInit(&htim8);
  460. }
  461. #endif /* BSP_USING_PWM8 */
  462. void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *tim_pwmHandle)
  463. {
  464. if (tim_pwmHandle->Instance == TIM1)
  465. {
  466. __HAL_RCC_TIM1_CLK_ENABLE();
  467. }
  468. else if (tim_pwmHandle->Instance == TIM2)
  469. {
  470. __HAL_RCC_TIM2_CLK_ENABLE();
  471. }
  472. else if (tim_pwmHandle->Instance == TIM3)
  473. {
  474. __HAL_RCC_TIM3_CLK_ENABLE();
  475. }
  476. else if (tim_pwmHandle->Instance == TIM4)
  477. {
  478. __HAL_RCC_TIM4_CLK_ENABLE();
  479. }
  480. else if (tim_pwmHandle->Instance == TIM5)
  481. {
  482. __HAL_RCC_TIM5_CLK_ENABLE();
  483. }
  484. else if (tim_pwmHandle->Instance == TIM8)
  485. {
  486. __HAL_RCC_TIM8_CLK_ENABLE();
  487. }
  488. }
  489. static void HAL_TIM_MspPostInit(TIM_HandleTypeDef *timHandle)
  490. {
  491. GPIO_InitTypeDef GPIO_InitStruct;
  492. if (timHandle->Instance == TIM1)
  493. {
  494. /**TIM1 GPIO Configuration
  495. PE9 ------> TIM1_CH1
  496. PE11 ------> TIM1_CH2
  497. PE13 ------> TIM1_CH3
  498. PE14 ------> TIM1_CH4
  499. */
  500. #if defined(BSP_USING_PWM1_CH1) || defined(BSP_USING_PWM1_CH2) || defined(BSP_USING_PWM1_CH3) || defined(BSP_USING_PWM1_CH4)
  501. __HAL_RCC_GPIOE_CLK_ENABLE();
  502. GPIO_InitStruct.Pin = 0x00;
  503. #ifdef BSP_USING_PWM1_CH1
  504. GPIO_InitStruct.Pin |= GPIO_PIN_9;
  505. #endif
  506. #ifdef BSP_USING_PWM1_CH2
  507. GPIO_InitStruct.Pin |= GPIO_PIN_11;
  508. #endif
  509. /* FIXME:通道3,4无输出
  510. #ifdef BSP_USING_PWM1_CH3
  511. GPIO_InitStruct.Pin |= GPIO_PIN_13;
  512. #endif
  513. #ifdef BSP_USING_PWM1_CH4
  514. GPIO_InitStruct.Pin |= GPIO_PIN_14;
  515. #endif
  516. */
  517. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  518. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  519. HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
  520. __HAL_AFIO_REMAP_TIM1_ENABLE();
  521. #endif
  522. }
  523. else if (timHandle->Instance == TIM2)
  524. {
  525. /**TIM2 GPIO Configuration
  526. PB10 ------> TIM2_CH3
  527. PB11 ------> TIM2_CH4
  528. PA15 ------> TIM2_CH1
  529. PB3 ------> TIM2_CH2
  530. */
  531. #if defined(BSP_USING_PWM2_CH1) || defined(BSP_USING_PWM2_CH2) || defined(BSP_USING_PWM2_CH4)
  532. __HAL_RCC_GPIOB_CLK_ENABLE();
  533. GPIO_InitStruct.Pin = 0x00;
  534. #ifdef BSP_USING_PWM2_CH1
  535. GPIO_InitStruct.Pin |= GPIO_PIN_10;
  536. #endif
  537. #ifdef BSP_USING_PWM2_CH2
  538. GPIO_InitStruct.Pin |= GPIO_PIN_11;
  539. #endif
  540. #ifdef BSP_USING_PWM2_CH4
  541. GPIO_InitStruct.Pin |= GPIO_PIN_3;
  542. #endif
  543. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  544. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  545. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  546. #endif
  547. #if defined(BSP_USING_PWM2_CH3)
  548. __HAL_RCC_GPIOA_CLK_ENABLE();
  549. GPIO_InitStruct.Pin = 0x00;
  550. #ifdef BSP_USING_PWM2_CH3
  551. GPIO_InitStruct.Pin |= GPIO_PIN_15;
  552. #endif
  553. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  554. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  555. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  556. __HAL_AFIO_REMAP_TIM2_ENABLE();
  557. #endif
  558. }
  559. else if (timHandle->Instance == TIM3)
  560. {
  561. /**TIM3 GPIO Configuration
  562. PA6 ------> TIM3_CH1
  563. PA7 ------> TIM3_CH2
  564. PB0 ------> TIM3_CH3
  565. PB1 ------> TIM3_CH4
  566. */
  567. #if defined(BSP_USING_PWM3_CH1) || defined(BSP_USING_PWM3_CH2)
  568. __HAL_RCC_GPIOA_CLK_ENABLE();
  569. GPIO_InitStruct.Pin = 0x00;
  570. #ifdef BSP_USING_PWM3_CH1
  571. GPIO_InitStruct.Pin |= GPIO_PIN_6;
  572. #endif
  573. #ifdef BSP_USING_PWM3_CH2
  574. GPIO_InitStruct.Pin |= GPIO_PIN_7;
  575. #endif
  576. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  577. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  578. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  579. GPIO_InitStruct.Pin = 0x00;
  580. #endif
  581. #if defined(BSP_USING_PWM3_CH3) || defined(BSP_USING_PWM3_CH4)
  582. __HAL_RCC_GPIOB_CLK_ENABLE();
  583. GPIO_InitStruct.Pin = 0x00;
  584. #ifdef BSP_USING_PWM3_CH3
  585. GPIO_InitStruct.Pin |= GPIO_PIN_0;
  586. #endif
  587. #ifdef BSP_USING_PWM3_CH4
  588. GPIO_InitStruct.Pin |= GPIO_PIN_1;
  589. #endif
  590. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  591. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  592. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  593. #endif
  594. }
  595. else if (timHandle->Instance == TIM4)
  596. {
  597. /**TIM4 GPIO Configuration
  598. PD12 ------> TIM4_CH1
  599. PD13 ------> TIM4_CH2
  600. PD14 ------> TIM4_CH3
  601. PD15 ------> TIM4_CH4
  602. */
  603. #if defined(BSP_USING_PWM4_CH1) || defined(BSP_USING_PWM4_CH2) || defined(BSP_USING_PWM4_CH3) || defined(BSP_USING_PWM4_CH4)
  604. __HAL_RCC_GPIOD_CLK_ENABLE();
  605. GPIO_InitStruct.Pin = 0x00;
  606. #ifdef BSP_USING_PWM4_CH1
  607. GPIO_InitStruct.Pin |= GPIO_PIN_12;
  608. #endif
  609. #ifdef BSP_USING_PWM4_CH2
  610. GPIO_InitStruct.Pin |= GPIO_PIN_13;
  611. #endif
  612. #ifdef BSP_USING_PWM4_CH3
  613. GPIO_InitStruct.Pin |= GPIO_PIN_14;
  614. #endif
  615. #ifdef BSP_USING_PWM4_CH4
  616. GPIO_InitStruct.Pin |= GPIO_PIN_15;
  617. #endif
  618. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  619. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  620. HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  621. __HAL_AFIO_REMAP_TIM4_ENABLE();
  622. #endif
  623. }
  624. else if (timHandle->Instance == TIM5)
  625. {
  626. /**TIM5 GPIO Configuration
  627. PA0-WKUP ------> TIM5_CH1
  628. PA1 ------> TIM5_CH2
  629. PA2 ------> TIM5_CH3
  630. PA3 ------> TIM5_CH4
  631. */
  632. #if defined(BSP_USING_PWM5_CH1) || defined(BSP_USING_PWM5_CH2) || defined(BSP_USING_PWM5_CH3) || defined(BSP_USING_PWM5_CH4)
  633. __HAL_RCC_GPIOA_CLK_ENABLE();
  634. GPIO_InitStruct.Pin = 0x00;
  635. #ifdef BSP_USING_PWM5_CH1
  636. GPIO_InitStruct.Pin |= GPIO_PIN_0;
  637. #endif
  638. #ifdef BSP_USING_PWM5_CH2
  639. GPIO_InitStruct.Pin |= GPIO_PIN_1;
  640. #endif
  641. #ifdef BSP_USING_PWM5_CH3
  642. GPIO_InitStruct.Pin |= GPIO_PIN_2;
  643. #endif
  644. #ifdef BSP_USING_PWM5_CH4
  645. GPIO_InitStruct.Pin |= GPIO_PIN_3;
  646. #endif
  647. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  648. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  649. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  650. #endif
  651. }
  652. else if (timHandle->Instance == TIM8)
  653. {
  654. /**TIM8 GPIO Configuration
  655. PC6 ------> TIM8_CH1
  656. PC7 ------> TIM8_CH2
  657. PC8 ------> TIM8_CH3
  658. PC9 ------> TIM8_CH4
  659. */
  660. #if defined(BSP_USING_PWM8_CH1) || defined(BSP_USING_PWM8_CH2) || defined(BSP_USING_PWM8_CH3) || defined(BSP_USING_PWM8_CH4)
  661. __HAL_RCC_GPIOC_CLK_ENABLE();
  662. GPIO_InitStruct.Pin = 0x00;
  663. #ifdef BSP_USING_PWM8_CH1
  664. GPIO_InitStruct.Pin |= GPIO_PIN_6;
  665. #endif
  666. #ifdef BSP_USING_PWM8_CH2
  667. GPIO_InitStruct.Pin |= GPIO_PIN_7;
  668. #endif
  669. #ifdef BSP_USING_PWM8_CH3
  670. GPIO_InitStruct.Pin |= GPIO_PIN_8;
  671. #endif
  672. #ifdef BSP_USING_PWM8_CH4
  673. GPIO_InitStruct.Pin |= GPIO_PIN_9;
  674. #endif
  675. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  676. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  677. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  678. #endif
  679. }
  680. }
  681. void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *tim_pwmHandle)
  682. {
  683. if (tim_pwmHandle->Instance == TIM1)
  684. {
  685. __HAL_RCC_TIM1_CLK_DISABLE();
  686. }
  687. else if (tim_pwmHandle->Instance == TIM2)
  688. {
  689. __HAL_RCC_TIM2_CLK_DISABLE();
  690. }
  691. else if (tim_pwmHandle->Instance == TIM3)
  692. {
  693. __HAL_RCC_TIM3_CLK_DISABLE();
  694. }
  695. else if (tim_pwmHandle->Instance == TIM4)
  696. {
  697. __HAL_RCC_TIM4_CLK_DISABLE();
  698. }
  699. else if (tim_pwmHandle->Instance == TIM5)
  700. {
  701. __HAL_RCC_TIM5_CLK_DISABLE();
  702. }
  703. else if (tim_pwmHandle->Instance == TIM8)
  704. {
  705. __HAL_RCC_TIM8_CLK_DISABLE();
  706. }
  707. }
  708. int drv_pwm_init(void)
  709. {
  710. #ifdef BSP_USING_PWM1
  711. MX_TIM1_Init();
  712. rt_device_pwm_register(rt_calloc(1, sizeof(struct rt_device_pwm)), "pwm1", &drv_ops, &htim1);
  713. #endif
  714. #ifdef BSP_USING_PWM2
  715. MX_TIM2_Init();
  716. rt_device_pwm_register(rt_calloc(1, sizeof(struct rt_device_pwm)), "pwm2", &drv_ops, &htim2);
  717. #endif
  718. #ifdef BSP_USING_PWM3
  719. MX_TIM3_Init();
  720. rt_device_pwm_register(rt_calloc(1, sizeof(struct rt_device_pwm)), "pwm3", &drv_ops, &htim3);
  721. #endif
  722. #ifdef BSP_USING_PWM4
  723. MX_TIM4_Init();
  724. rt_device_pwm_register(rt_calloc(1, sizeof(struct rt_device_pwm)), "pwm4", &drv_ops, &htim4);
  725. #endif
  726. #ifdef BSP_USING_PWM5
  727. MX_TIM5_Init();
  728. rt_device_pwm_register(rt_calloc(1, sizeof(struct rt_device_pwm)), "pwm5", &drv_ops, &htim5);
  729. #endif
  730. #ifdef BSP_USING_PWM8
  731. MX_TIM8_Init();
  732. rt_device_pwm_register(rt_calloc(1, sizeof(struct rt_device_pwm)), "pwm8", &drv_ops, &htim8);
  733. #endif
  734. return 0;
  735. }
  736. INIT_DEVICE_EXPORT(drv_pwm_init);
  737. /* pwm test cmd */
  738. static int pwm_test(int argc, char **argv)
  739. {
  740. char *pwmc = argv[1];
  741. rt_device_t pwmd = rt_device_find(argv[1]);
  742. struct rt_pwm_configuration cfg =
  743. {
  744. .channel = 0, /* 0-n */
  745. .period = 100, /* unit:ns 1ns~4.29s:1Ghz~0.23hz */
  746. .pulse = 50 /* unit:ns (pulse<=period) */
  747. };
  748. for (int i = 1; i < 5; i++)
  749. {
  750. cfg.channel = i;
  751. rt_device_control(pwmd, PWM_CMD_SET, &cfg);
  752. rt_device_control(pwmd, PWM_CMD_ENABLE, &cfg);
  753. }
  754. }
  755. MSH_CMD_EXPORT(pwm_test, pwm_test pwm1);