ST意法半导体
直播中

李麒铭

8年用户 1498经验值
私信 关注
[问答]

是什么原因造成HAL_TIM_TriggerCallback函数不起作用的呢?

嗨,大家好,
我正在研究电机控制,我需要同时设置组合 PWM 和 ADC 触发器同步。最后一种情况是 PWM 工作并且 ADC 被触发,所以当 ADC 被触发时,中断事件正在我放入的 HAL_ADCEx_InjectedConvCpltCallback 中运行 Led Toggle what我看到触发事件在每个 pwm 周期都没有运行。触发事件运行 1 次,没有中断 2 次,然后再次运行中断。如果我要用不同的方式告诉它 --> 运行等待运行等待运行.. . 像那样,我不确定绘图是否正确但可能足够了。而且 HAL_tiM_TriggerCallback 不起作用。
_____-----_-----_______-----_----_______-----_----________-----_----_______- ----_--------___ 脉宽调制 1
____--------_--------____--------_--------____--------_--------_____- ------_--------____----------------___ 脉宽调制 2
___--------_--------___--------_--------___--------_---- ----___--------------------___--------_--------___ 脉宽调制 3
-  -  -  -  -  - -______________________________________________ -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - - 引领内部中断
下面的代码
  • //----------------------- tim.c -----------------------//
  • #include "tim.h"
  • extern uint32_t timerPeriod;
  • TIM_HandleTypeDef htim1;
  • void MX_TIM1_Init(void)
  • {
  •   TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  •   TIM_MasterConfigTypeDef sMasterConfig = {0};
  •   TIM_OC_InitTypeDef sConfigOC = {0};
  •   TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
  •   htim1.Instance = TIM1;
  •   htim1.Init.Prescaler = 0;
  •   htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED2;
  •   htim1.Init.Period = timerPeriod;
  •   htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  •   htim1.Init.RepetitionCounter = 0;
  •   htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  •   if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  •   if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  •   sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_OC5REF_RISING_OC6REF_FALLING;
  •   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;
  •   if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   sConfigOC.OCMode = TIM_OCMODE_PWM1;
  •   sConfigOC.Pulse = 0;
  •   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  •   sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  •   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  •   sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  •   sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  •   if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  •   { Error_Handler(); }
  •   sConfigOC.Pulse = 0;
  •   if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  •   { Error_Handler(); }
  •   sConfigOC.Pulse = 0;
  •   if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  •   { Error_Handler(); }
  •   sConfigOC.OCMode = TIM_OCMODE_PWM2;
  •   sConfigOC.Pulse = 1000;
  •   if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_5) != HAL_OK)
  •   { Error_Handler(); }
  •   sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  •   sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  •   sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  •   sBreakDeadTimeConfig.DeadTime = 200;
  •   sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  •   sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  •   sBreakDeadTimeConfig.BreakFilter = 0;
  •   sBreakDeadTimeConfig.BreakAFMode = TIM_BREAK_AFMODE_INPUT;
  •   sBreakDeadTimeConfig.Break2State = TIM_BREAK2_DISABLE;
  •   sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH;
  •   sBreakDeadTimeConfig.Break2Filter = 0;
  •   sBreakDeadTimeConfig.Break2AFMode = TIM_BREAK_AFMODE_INPUT;
  •   sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  •   if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
  •   {  Error_Handler(); }
  •   HAL_TIM_MspPostInit(&htim1);
  • }
  • void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
  • {
  •   if(tim_baseHandle->Instance==TIM1)
  •   {
  •     __HAL_RCC_TIM1_CLK_ENABLE();
  •     HAL_NVIC_SetPriority(TIM1_UP_TIM16_IRQn, 0, 0);
  •     HAL_NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn);
  •     HAL_NVIC_SetPriority(TIM1_TRG_COM_TIM17_IRQn, 0, 0);
  •     HAL_NVIC_EnableIRQ(TIM1_TRG_COM_TIM17_IRQn);
  •   }
  • }
  • void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
  • {
  •   GPIO_InitTypeDef GPIO_InitStruct = {0};
  •   if(timHandle->Instance==TIM1)
  •   {
  •     __HAL_RCC_GPIOA_CLK_ENABLE();
  •     __HAL_RCC_GPIOB_CLK_ENABLE();
  •     /**TIM1 GPIO Configuration
  •     PA7     ------> TIM1_CH1N
  •     PB0     ------> TIM1_CH2N
  •     PB1     ------> TIM1_CH3N
  •     PA8     ------> TIM1_CH1
  •     PA9     ------> TIM1_CH2
  •     PA10     ------> TIM1_CH3
  •     */
  •     GPIO_InitStruct.Pin = PWM_UL_Pin|PWM_UH_Pin|PWM_VH_Pin|PWM_WH_Pin;
  •     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  •     GPIO_InitStruct.Pull = GPIO_NOPULL;
  •     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  •     GPIO_InitStruct.Alternate = GPIO_AF6_TIM1;
  •     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  •     GPIO_InitStruct.Pin = PWM_VL_Pin|PWM_WL_Pin;
  •     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  •     GPIO_InitStruct.Pull = GPIO_NOPULL;
  •     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  •     GPIO_InitStruct.Alternate = GPIO_AF6_TIM1;
  •     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  •   }
  • }
  • //----------------------- main.c -----------------------//
  • int main(void)
  • {
  •   HAL_Init();
  •   SystemClock_Config();
  •   mcuFreq = HAL_RCC_GetSysClockFreq();
  •   timerPeriod = (uint32_t)((mcuFreq / 10000) - 1);
  •   MX_GPIO_Init();
  •   MX_TIM1_Init();
  •   MX_ADC1_Init();
  •   MX_USART1_UART_Init();
  •   __HAL_UART_FLUSH_DRREGISTER(&huart1);
  •   __HAL_TIM_ENABLE_IT(&htim1,TIM_IT_TRIGGER | TIM_IT_UPDATE);
  •   if(HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED) != HAL_OK); Error_Handler();
  •    HAL_ADCEx_InjectedStart_IT(&hadc1);
  •   valBuf[0] = setDutyPercentage(40);
  •   valBuf[1] = setDutyPercentage(50);
  •   valBuf[2] = setDutyPercentage(80);
  • if(HAL_TIMEx_GroupChannel5(&htim1, (TIM_GROUPCH5_OC1REFC |
  •                                           TIM_GROUPCH5_OC2REFC |
  •                                           TIM_GROUPCH5_OC3REFC)) != HAL_OK)        Error_Handler();
  •   //if(HAL_TIMEx_GroupChannel5(&htim1, TIM_GROUPCH5_OC3REFC) != HAL_OK)        Error_Handler();
  •   if( HAL_TIM_Base_Start(&htim1) != HAL_OK )        Error_Handler();
  •   if(HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_1) != HAL_OK)         Error_Handler();
  •   if(HAL_TIMEx_PWMN_Start_IT(&htim1, TIM_CHANNEL_1) != HAL_OK)        Error_Handler();
  •   if(HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_2) != HAL_OK)         Error_Handler();
  •   if(HAL_TIMEx_PWMN_Start_IT(&htim1, TIM_CHANNEL_2) != HAL_OK)        Error_Handler();
  •   if(HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_3) != HAL_OK)         Error_Handler();
  •   if(HAL_TIMEx_PWMN_Start_IT(&htim1, TIM_CHANNEL_3) != HAL_OK)        Error_Handler();
  •   if(HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_5) != HAL_OK)                Error_Handler(); //ADC Trigger
  •   TIM1->CCR1 = valBuf[0];
  •   TIM1->CCR2 = valBuf[1];
  •   TIM1->CCR3 = valBuf[2];
  •   HAL_UART_Receive_IT(&huart1, uartRxBuf, 1);
  •   while (1)
  •   {
  •           u16TimerVal = __HAL_TIM_GET_COUNTER(&htim1);
  •   }
  • }
  • void SystemClock_Config(void)
  • {
  •   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  •   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  •   RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  •   HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1_BOOST);
  •   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(); }
  •   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(); }
  •   PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_ADC12;
  •   PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
  •   PeriphClkInit.Adc12ClockSelection = RCC_ADC12CLKSOURCE_SYSCLK;
  •   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  •   {Error_Handler(); }
  • }
  • uint32_t setDutyPercentage(uint32_t val)
  • {
  •         return (( val * (timerPeriod - 1)) / 100);
  • }
  • void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef *hadc)
  • {
  •         ADConvertedValues[2] = HAL_ADCEx_InjectedGetValue(&hadc1, ADC_INJECTED_RANK_3);
  •         HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
  • }
  • //This interrupt doesn't work
  • void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim)
  • {
  •         //HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
  •         __HAL_TIM_CLEAR_FLAG(&htim1,TIM_IT_TRIGGER);
  • }


回帖(1)

王雷

2023-1-12 15:57:33
因为不连续模式。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分