基质喷涂
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.

214 lines
6.4 KiB

3 weeks ago
  1. //
  2. // Created by iflyt on 2025/3/2.
  3. //
  4. #include "tim.h"
  5. /* USER CODE BEGIN Header */
  6. /**
  7. ******************************************************************************
  8. * @file tim.c
  9. * @brief This file provides code for the configuration
  10. * of the TIM instances.
  11. ******************************************************************************
  12. * @attention
  13. *
  14. * Copyright (c) 2025 STMicroelectronics.
  15. * All rights reserved.
  16. *
  17. * This software is licensed under terms that can be found in the LICENSE file
  18. * in the root directory of this software component.
  19. * If no LICENSE file comes with this software, it is provided AS-IS.
  20. *
  21. ******************************************************************************
  22. */
  23. /* USER CODE END Header */
  24. /* Includes ------------------------------------------------------------------*/
  25. #include "tim.h"
  26. /* USER CODE BEGIN 0 */
  27. /* USER CODE END 0 */
  28. TIM_HandleTypeDef htim4;
  29. /* TIM4 init function */
  30. void MX_TIM4_Init(void)
  31. {
  32. /* USER CODE BEGIN TIM4_Init 0 */
  33. /* USER CODE END TIM4_Init 0 */
  34. TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  35. TIM_MasterConfigTypeDef sMasterConfig = {0};
  36. TIM_OC_InitTypeDef sConfigOC = {0};
  37. /* USER CODE BEGIN TIM4_Init 1 */
  38. /* USER CODE END TIM4_Init 1 */
  39. htim4.Instance = TIM4;
  40. htim4.Init.Prescaler = 32;
  41. htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  42. htim4.Init.Period = 1000;
  43. htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  44. htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  45. if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
  46. {
  47. Error_Handler();
  48. }
  49. sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  50. if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
  51. {
  52. Error_Handler();
  53. }
  54. if (HAL_TIM_PWM_Init(&htim4) != HAL_OK)
  55. {
  56. Error_Handler();
  57. }
  58. sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  59. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  60. if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
  61. {
  62. Error_Handler();
  63. }
  64. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  65. sConfigOC.Pulse = 0;
  66. sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  67. sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  68. if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  69. {
  70. Error_Handler();
  71. }
  72. if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  73. {
  74. Error_Handler();
  75. }
  76. if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  77. {
  78. Error_Handler();
  79. }
  80. /* USER CODE BEGIN TIM4_Init 2 */
  81. /* USER CODE END TIM4_Init 2 */
  82. HAL_TIM_MspPostInit(&htim4);
  83. }
  84. void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
  85. {
  86. if(tim_baseHandle->Instance==TIM4)
  87. {
  88. /* USER CODE BEGIN TIM4_MspInit 0 */
  89. /* USER CODE END TIM4_MspInit 0 */
  90. /* TIM4 clock enable */
  91. __HAL_RCC_TIM4_CLK_ENABLE();
  92. /* USER CODE BEGIN TIM4_MspInit 1 */
  93. /* USER CODE END TIM4_MspInit 1 */
  94. }
  95. }
  96. void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
  97. {
  98. GPIO_InitTypeDef GPIO_InitStruct = {0};
  99. if(timHandle->Instance==TIM4)
  100. {
  101. /* USER CODE BEGIN TIM4_MspPostInit 0 */
  102. /* USER CODE END TIM4_MspPostInit 0 */
  103. __HAL_RCC_GPIOD_CLK_ENABLE();
  104. /**TIM4 GPIO Configuration
  105. PD12 ------> TIM4_CH1
  106. PD13 ------> TIM4_CH2
  107. PD14 ------> TIM4_CH3
  108. */
  109. GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14;
  110. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  111. GPIO_InitStruct.Pull = GPIO_NOPULL;
  112. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  113. GPIO_InitStruct.Alternate = GPIO_AF2_TIM4;
  114. HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  115. /* USER CODE BEGIN TIM4_MspPostInit 1 */
  116. /* USER CODE END TIM4_MspPostInit 1 */
  117. }
  118. }
  119. void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
  120. {
  121. if(tim_baseHandle->Instance==TIM4)
  122. {
  123. /* USER CODE BEGIN TIM4_MspDeInit 0 */
  124. /* USER CODE END TIM4_MspDeInit 0 */
  125. /* Peripheral clock disable */
  126. __HAL_RCC_TIM4_CLK_DISABLE();
  127. /* USER CODE BEGIN TIM4_MspDeInit 1 */
  128. /* USER CODE END TIM4_MspDeInit 1 */
  129. }
  130. }
  131. /* USER CODE BEGIN 1 */
  132. void setPWM(uint32_t channel, uint16_t period, uint16_t pulse)
  133. {
  134. TIM_HandleTypeDef timer = htim4;
  135. // 第一步:停止 PWM 输出
  136. HAL_TIM_PWM_Stop(&timer, channel); // stop generation of pwm
  137. /*
  138. * HAL_TIM_PWM_Stop PWM
  139. * PWM PWM
  140. */
  141. // 第二步:配置定时器周期
  142. TIM_OC_InitTypeDef sConfigOC;
  143. timer.Init.Period = period; // set the period duration
  144. /*
  145. * TIM_OC_InitTypeDef sConfigOC
  146. * period Init.Period
  147. */
  148. // 第三步:重新初始化定时器
  149. HAL_TIM_PWM_Init(&timer); // reinititialise with new period value
  150. /*
  151. * HAL_TIM_PWM_Init 使
  152. * ARR PWM
  153. */
  154. // 第四步:配置 PWM 通道
  155. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  156. sConfigOC.Pulse = pulse; // set the pulse duration
  157. sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  158. sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  159. /*
  160. * sConfigOC
  161. * - OCMode PWM 1 PWM 1
  162. * - Pulse PWM
  163. * - OCPolarity
  164. * - OCFastMode
  165. */
  166. // 第五步:配置定时器通道的 PWM 参数
  167. HAL_TIM_PWM_ConfigChannel(&timer, &sConfigOC, channel);
  168. /*
  169. * HAL_TIM_PWM_ConfigChannel sConfigOC
  170. * /CCR PWM
  171. */
  172. // 第六步:启动 PWM 输出
  173. HAL_TIM_PWM_Start(&timer, channel); // start pwm generation
  174. /*
  175. * HAL_TIM_PWM_Start PWM
  176. * PWM
  177. */
  178. }
  179. /* USER CODE END 1 */