cancel
Showing results for 
Search instead for 
Did you mean: 

Timer output goes hi while starting DMA.

dirk2399
Associate

My CPU is STM32H750VBTx

My Configuration of the timer is

void MX_TIM2_Init(void)
{
  TIM_SlaveConfigTypeDef sSlaveConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};
 
  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 0;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 0xFFFFFFFF;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_OC_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }
  sSlaveConfig.SlaveMode = TIM_SLAVEMODE_EXTERNAL1;
  sSlaveConfig.InputTrigger = TIM_TS_ITR2;
  if (HAL_TIM_SlaveConfigSynchro(&htim2, &sSlaveConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_TOGGLE;
  sConfigOC.Pulse = 0;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_TIMING;
  if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_TOGGLE;
  if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_TIMING;
  if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  {
    Error_Handler();
  }
  HAL_TIM_MspPostInit(&htim2);
 
}
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
 
{
 
 
 if(tim_baseHandle->Instance==TIM2)
 
 {
 
 /* USER CODE BEGIN TIM2_MspInit 0 */
 
 
 /* USER CODE END TIM2_MspInit 0 */
 
   /* TIM2 clock enable */
 
   __HAL_RCC_TIM2_CLK_ENABLE();
 
 
   /* TIM2 DMA Init */
 
   /* TIM2_CH1 Init */
 
   hdma_tim2_ch1.Instance = DMA1_Stream6;
 
   hdma_tim2_ch1.Init.Request = DMA_REQUEST_TIM2_CH1;
 
   hdma_tim2_ch1.Init.Direction = DMA_MEMORY_TO_PERIPH;
 
   hdma_tim2_ch1.Init.PeriphInc = DMA_PINC_DISABLE;
 
   hdma_tim2_ch1.Init.MemInc = DMA_MINC_ENABLE;
 
   hdma_tim2_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
 
   hdma_tim2_ch1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
 
   hdma_tim2_ch1.Init.Mode = DMA_NORMAL;
 
   hdma_tim2_ch1.Init.Priority = DMA_PRIORITY_HIGH;
 
   hdma_tim2_ch1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
 
   if (HAL_DMA_Init(&hdma_tim2_ch1) != HAL_OK)
 
   {
 
     Error_Handler();
 
   }
 
 

I start the DMA transfer like this

m_oRet = HAL_TIM_OC_Start_DMA(&htim2, TIM_CHANNEL_1, &m_aunTimer[0], 4);

But the function

void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState)
{
  uint32_t tmp;
 
  /* Check the parameters */
  assert_param(IS_TIM_CC1_INSTANCE(TIMx));
  assert_param(IS_TIM_CHANNELS(Channel));
 
  tmp = TIM_CCER_CC1E << (Channel & 0x1FU); /* 0x1FU = 31 bits max shift */
 
  /* Reset the CCxE Bit */
  TIMx->CCER &= ~tmp;
 
  /* Set or reset the CCxE Bit */
  TIMx->CCER |= (uint32_t)(ChannelState << (Channel & 0x1FU)); /* 0x1FU = 31 bits max shift */
}

rise the output for one timer clock.

If I change the function to

void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState)
{
  uint32_t tmp;
 
  /* Check the parameters */
  assert_param(IS_TIM_CC1_INSTANCE(TIMx));
  assert_param(IS_TIM_CHANNELS(Channel));
 
  tmp = TIM_CCER_CC1E << (Channel & 0x1FU); /* 0x1FU = 31 bits max shift */
 
  /* Reset the CCxE Bit */
  //TIMx->CCER &= ~tmp;
 
  /* Set or reset the CCxE Bit */
  TIMx->CCER = (TIMx->CCER & ~tmp) | (uint32_t)(ChannelState << (Channel & 0x1FU)); /* 0x1FU = 31 bits max shift */
}

It is ok.

Can some one change the library.

My version is STM32Cube FW_H7 V1.4.0

3 REPLIES 3
kotesoft
Associate II

And would be great to have a support of TIM_CHANNEL_ALL argument in TIM_CCxChannelCmd

Pavel A.
Evangelist III

It resets CCxE bit in CCER... 🙂

JW