Skip to main content
Visitor II
July 2, 2019
Question

Timer output goes hi while starting DMA.

  • July 2, 2019
  • 2 replies
  • 846 views

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

    This topic has been closed for replies.

    2 replies

    Visitor II
    March 3, 2020

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

    Super User
    March 3, 2020
    Super User
    March 3, 2020

    It resets CCxE bit in CCER... :)

    JW