Не запускается ШИМ на TIM8

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
charoit
Родился
Сообщения: 4
Зарегистрирован: Чт май 12, 2016 15:53:17

Не запускается ШИМ на TIM8

Сообщение charoit »

Всем привет.

Хочу запустить ШИМ на TIM8 (процессор STM32F429) на третьем канале. Судя по даташиту это нога PH15.
Сгенерил настройки в CubeMX, вставил в свой проект, но на выходе какой-то шум (смотрю осциллом).

В похожей теме прочитал про бит MOE в регистре BDTR - сделал также, но не помогло..

Вот мой код:

Код: Выделить всё

void MX_TIM8_Init(void)
{

  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef sMasterConfig;
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;
  TIM_OC_InitTypeDef sConfigOC;

  htim8.Instance = TIM8;
  htim8.Init.Prescaler = 0;
  htim8.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim8.Init.Period = 65535;
  htim8.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim8.Init.RepetitionCounter = 0;
  
  TIM8->BDTR |= TIM_BDTR_MOE;
  
  HAL_TIM_Base_Init(&htim8);
  
  

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  HAL_TIM_ConfigClockSource(&htim8, &sClockSourceConfig);

  HAL_TIM_PWM_Init(&htim8);

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  HAL_TIMEx_MasterConfigSynchronization(&htim8, &sMasterConfig);

  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  sBreakDeadTimeConfig.DeadTime = 0;
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  HAL_TIMEx_ConfigBreakDeadTime(&htim8, &sBreakDeadTimeConfig);

  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 500;
  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;
  HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_3);

  HAL_TIM_MspPostInit(&htim8);
  

}
Ножка порта инициализируется так:

Код: Выделить всё

void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(htim->Instance==TIM8)
  {
  /* USER CODE BEGIN TIM8_MspPostInit 0 */

  /* USER CODE END TIM8_MspPostInit 0 */
  
    /**TIM8 GPIO Configuration    
    PH15     ------> TIM8_CH3N 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_15;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    //GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;//GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF3_TIM8;
    HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);

  /* USER CODE BEGIN TIM8_MspPostInit 1 */

  /* USER CODE END TIM8_MspPostInit 1 */
  }

} 

Тактирование таймера включается в HAL_TIM_Base_MspInit :

Код: Выделить всё

 if(htim_base->Instance==TIM8)
  {
  /* USER CODE BEGIN TIM8_MspInit 0 */

  /* USER CODE END TIM8_MspInit 0 */
    /* Peripheral clock enable */

    __HAL_RCC_TIM8_CLK_ENABLE();

  /* USER CODE BEGIN TIM8_MspInit 1 */

  /* USER CODE END TIM8_MspInit 1 */
  }
Ну а в main.c сначала вызываю MX_TIM8_Init() , а потом HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_3).

На выходе ерунда..

Подскажите пжлста, куда копать..
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Не запускается ШИМ на TIM8

Сообщение dosikus »

Ну и где этот пресловутый супер_легкий порог вхождения с калокубом?
Если на элементарной задачи сплошной геморрой, и визуальные тыкалки не помогают ...

Для 429 дискаверины , Center Aligned PWM на PC8 . CH3, причем прямой канал - инверсные или заняты или отсутствуют (PH15)

Код: Выделить всё

    RCC->AHB1ENR |=  RCC_AHB1ENR_GPIOCEN ;
	RCC->APB2ENR |=RCC_APB2ENR_TIM8EN;
	
	GPIOC->MODER &=  ~(GPIO_MODER_MODER8);
	GPIOC->MODER |= (GPIO_MODER_MODER8_1);
	
  GPIOC->AFR[1]|=0x03;
	
	TIM8->PSC = 1680-1; 
  TIM8->ARR = 256-1; 
  TIM8->CCR3 =50; 
  TIM8->CCMR2 |= TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3PE; 
  TIM8->CCER |= TIM_CCER_CC3E; 
  TIM8->BDTR |= TIM_BDTR_MOE; 
  TIM8->CR1 |= TIM_CR1_CMS_0 | TIM_CR1_CEN; 
  TIM8->EGR |= TIM_EGR_UG; 

Изображение
Реклама
charoit
Родился
Сообщения: 4
Зарегистрирован: Чт май 12, 2016 15:53:17

Re: Не запускается ШИМ на TIM8

Сообщение charoit »

Я вроде не писал, что у меня 429 Дискавери?:) Проц 429-й, да, но железка не Дискавери.

Инверсный канал TIM8_CH3N есть и свободен для использования и надо было выставить бит CC3NE в единицу :

TIM8->CCER |= TIM_CCER_CC3NE;
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_3);

Куб - он в помощь, документацию читать надо, это никто не оспаривает..
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Не запускается ШИМ на TIM8

Сообщение dosikus »

charoit писал(а):Я вроде не писал, что у меня 429 Дискавери?:) Проц 429-й, да, но железка не Дискавери.
У меня только дискавери. :))) А помогать без проверки в железе ...
А по образу и подобию сляпать надеюсь не составит труда? Или все так плохо?

А куб не может быть в помощь - калокуб зло, что вы и доказали...
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «ARM»