你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32g473vet6定时器2&5输出pwm有问题.

[复制链接]
2513185116 提问时间:2024-6-22 18:38 / 已解决

对定时器2和5重新赋值后再启动定时器 pwm会在定时器启动后15秒左右才有输出,其余6个定时器的pwm输出正常工程使用CUBEMX创建

/ USER CODE BEGIN Header / /**


  • @file : main.c
  • @brief : Main program body

  • @attention
  • Copyright (c) 2024 STMicroelectronics.
  • All rights reserved.
  • This software is licensed under terms that can be found in the LICENSE file
  • in the root directory of this software component.
  • If no LICENSE file comes with this software, it is provided AS-IS.

/ / USER CODE END Header / / Includes ------------------------------------------------------------------*/

include "main.h"

include "tim.h"

include "usart.h"

include "gpio.h"

include "stdio.h"

/ Private includes ----------------------------------------------------------/ / USER CODE BEGIN Includes /

/ USER CODE END Includes /

/ Private typedef -----------------------------------------------------------/ / USER CODE BEGIN PTD /

/ USER CODE END PTD /

/ Private define ------------------------------------------------------------/ / USER CODE BEGIN PD /

/ USER CODE END PD /

/ Private macro -------------------------------------------------------------/ / USER CODE BEGIN PM /

/ USER CODE END PM /

/ Private variables ---------------------------------------------------------/

/ USER CODE BEGIN PV / / USER CODE END PV /

/ Private function prototypes -----------------------------------------------/ void SystemClock_Config(void); / USER CODE BEGIN PFP /

if _user_debug

void user_debug(void);

endif

/ USER CODE END PFP /

/ Private user code ---------------------------------------------------------/ / USER CODE BEGIN 0 /

/ USER CODE END 0 /

/**

  • @brief The application entry point.
  • @retval int / int main(void) { / USER CODE BEGIN 1 / / USER CODE END 1 */

/ MCU Configuration--------------------------------------------------------/

/ Reset of all peripherals, Initializes the Flash interface and the Systick. / HAL_Init();

/ USER CODE BEGIN Init /

/ USER CODE END Init /

/ Configure the system clock / SystemClock_Config();

/ USER CODE BEGIN SysInit / __disable_irq(); / USER CODE END SysInit /

/ Initialize all configured peripherals / MX_GPIO_Init(); MX_TIM15_Init(); MX_TIM16_Init(); MX_TIM17_Init(); MX_TIM1_Init(); MX_TIM2_Init(); MX_TIM3_Init(); MX_TIM5_Init(); MX_TIM20_Init(); MX_USART1_UART_Init();

/ USER CODE BEGIN 2 /

// HAL_Delay(1000);

if _user_debug

user_debug();

endif

TIM15->PSC = 1 - 1; TIM15->ARR = 42500 - 1; TIM15->CCR1 = 42500 / 2;

TIM3->PSC = 1 - 1; TIM3->ARR = 42500 - 1; TIM3->CCR2 = 42500 / 2;

TIM16->PSC = 1 - 1; TIM16->ARR = 42500 - 1; TIM16->CCR1 = 42500 / 2;

TIM17->PSC = 1 - 1; TIM17->ARR = 42500 - 1; TIM17->CCR1 = 42500 / 2;

TIM20->PSC = 1 - 1; TIM20->ARR = 42500 - 1; TIM20->CCR1 = 42500 / 2;

TIM5->PSC = 1 - 1; TIM5->ARR = 42500 - 1; TIM5->CCR3 = 42500 / 2;

TIM1->PSC = 1 - 1; TIM1->ARR = 42500 - 1; TIM1->CCR2 = 42500 / 2;

TIM2->PSC = 1 - 1; TIM2->ARR = 42500 - 1; TIM2->CCR3 = 42500 / 2;

HAL_TIM_PWM_Start(&htim15, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2); HAL_TIM_PWM_Start(&htim16, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim17, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim20, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_3); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2); HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);

HAL_GPIO_WritePin(Relay_1_GPIO_Port, Relay_1_Pin, GPIO_PIN_SET); user_debug(); // HAL_Delay(1000);

HAL_TIM_PWM_Stop(&htim15, TIM_CHANNEL_1); HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_2); HAL_TIM_PWM_Stop(&htim16, TIM_CHANNEL_1); HAL_TIM_PWM_Stop(&htim17, TIM_CHANNEL_1); HAL_TIM_PWM_Stop(&htim20, TIM_CHANNEL_1); HAL_TIM_PWM_Stop(&htim5, TIM_CHANNEL_3); HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2); HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_3);

HAL_GPIO_WritePin(Relay_1_GPIO_Port, Relay_1_Pin, GPIO_PIN_RESET); // HAL_Delay(1000); user_debug(); / USER CODE END 2 /

/ Infinite loop / / USER CODE BEGIN WHILE / HAL_GPIO_WritePin(Relay_1_GPIO_Port, Relay_1_Pin, GPIO_PIN_SET); TIM5->PSC = 1 - 1; TIM5->ARR = 11333 - 1; TIM5->CCR3 = 11333 / 2;

TIM2->PSC = 1 - 1; TIM2->ARR = 11333 - 1; TIM2->CCR3 = 11333 / 2; /TIM2和TIM5重新赋值后 启动8路PWM输出 TIM2和TIM5大约会延时15s后再输出 其他6路正常/ HAL_TIM_PWM_Start(&htim15, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2); HAL_TIM_PWM_Start(&htim16, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim17, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim20, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_3); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2); HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3); while (1) {

if 0

/**/ HAL_GPIO_WritePin(Relay_1_GPIO_Port, Relay_1_Pin, GPIO_PIN_RESET);

endif

/ USER CODE END WHILE /

/ USER CODE BEGIN 3 / } / USER CODE END 3 / }

/**

  • @brief System Clock Configuration
  • @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

/* Configure the main internal regulator output voltage / HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1_BOOST);

/** Initializes the RCC Oscillators according to the specified parameters

  • in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV6; RCC_OscInitStruct.PLL.PLLN = 85; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); }

/* Initializes the CPU, AHB and APB buses clocks / RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) { Error_Handler(); } }

/ USER CODE BEGIN 4 / void HAL_IncTick(void) {

uwTick += uwTickFreq; } int fputc(int ch, FILE f) { HAL_UART_Transmit(&huart1, (uint8_t )&ch, 1, 1000);

return (ch); }

if _user_debug

void user_debug(void) {

uint32_t CPU_Sn0, CPU_Sn1, CPU_Sn2; CPU_Sn0 = (__IO uint32_t )(0x1FFF7590); CPU_Sn1 = (__IO uint32_t )(0x1FFF7590 + 4); CPU_Sn2 = (__IO uint32_t )(0x1FFF7590 + 8);

printf("CPU : STM32G473VET6, LQFP100, Fre: %dMHz\r\n", SystemCoreClock / 1000000); printf("UID = %08X %08X %08X\n\r", CPU_Sn2, CPU_Sn1, CPU_Sn0); }

endif

/ USER CODE END 4 /

/**

  • @brief This function is executed in case of error occurrence.
  • @retval None / void Error_Handler(void) { / USER CODE BEGIN Error_Handler_Debug / / User can add his own implementation to report the HAL error return state / __disable_irq(); while (1) { } / USER CODE END Error_Handler_Debug */ }

ifdef USE_FULL_ASSERT

/**

  • @brief Reports the name of the source file and the source line number
  • where the assert_param error has occurred.
    • @param file: pointer to the source file name
    • @param line: assert_param error line source number
    • @retval None / void assert_failed(uint8_t file, uint32_t line) { / USER CODE BEGIN 6 / / User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) / / USER CODE END 6 / }

      endif / USE_FULL_ASSERT /

收藏 评论5 发布时间:2024-6-22 18:38

举报

5个回答
xmshao 最优答案 回答时间:2024-6-24 13:00:45

2513185116 发表于 2024-6-24 10:37
你好</p>
<p>1.我这边就是TIM15-&gtSC,可能是上传文本格式乱了

[md]另外,每次赋值后都把计数器清零,从头开始计数,即 TIMx->CNT=0。

xmshao 回答时间:2024-6-24 10:29:52
你下面这个写法,编译能通过吗?


TIM15->SC = 1 - 1;


正常来讲,应该是写成TIM15->PSC。


另外,你每次做完时基参数的修改赋值后,
紧跟着来一句下面代码:


TIMx->EGR = TIM_EGR_UG;


其中x根据你使用的TIMER编号来定。
2513185116 回答时间:2024-6-24 10:37:25

xmshao 发表于 2024-6-24 10:29
你下面这个写法,编译能通过吗?</p>
<p>

你好

1.我这边就是TIM15->PSC,可能是上传文本格式乱了

2.我这边没有开影子寄存器,应该是不需要触发更新事件的;并且我这边配置了8个定时器(配置都一样),其余6个可以正常输出PWM,就是TIM2&TIM5重新赋值后使能会延时大约15s后输出pwm(在mdk debug查看寄存器可以看到CEN位置1了,计数器正常计数),(其余6个定时器重新赋值使能后也能马上输出pwm)

xmshao 回答时间:2024-6-24 12:59:25
请你再次确认下有关ARR和CCR的预装控制位,分别是ARPE@TIMx->CR1


和 OCnPE@TIMx->CCMR,确保他们都被清零了。


这边也会找G4的板验证下。
2513185116 回答时间:2024-6-24 13:20:42

xmshao 发表于 2024-6-24 13:00
另外,每次赋值后都把计数器清零,从头开始计数,即 TIMx-&gt;CNT=0。

确实是没有重新清零CNT,并且TIM2&TIM5刚好是32位定时器,按照170MHZ计数,约25s溢出,应该就是这个问题,晚一点试一下,感谢

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版