[应用相关] STM32定时器DMA正常单次模式出现问题

[复制链接]
545|0
 楼主| 两只袜子 发表于 2022-7-26 09:00 | 显示全部楼层 |阅读模式
我想通过以下函数去实现TIM2定时器一次出两个通道脉冲,一次出单个通道脉冲,我用定时6每隔10ms去重新调用一下定时器2的配置,希望出现的单通道和双通道来回切换,但是从单通道切换到双通道的时候出现的波形不对,没有实现我的延时,而且出现两个脉冲

static void MX_TIM2_Init(uint8_t Flag_out)
{

  /* USER CODE BEGIN TIM2_Init 0 */

  /* USER CODE END TIM2_Init 0 */
        if(Flag_out)
        {
                TIM_ClockConfigTypeDef sClockSourceConfig = {0};
                TIM_MasterConfigTypeDef sMasterConfig = {0};
                TIM_OC_InitTypeDef sConfigOC = {0};

                /* USER CODE BEGIN TIM2_Init 1 */

                /* USER CODE END TIM2_Init 1 */
                htim2.Instance = TIM2;
                htim2.Init.Prescaler = 35;
                htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
                htim2.Init.Period = 20000;
                htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
                htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
                if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
                {
                        Error_Handler();
                }
                sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
                if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
                {
                        Error_Handler();
                }
                if (HAL_TIM_OC_Init(&htim2) != 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 = Data_Pwm[1];
                sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
                sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
                if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
                {
                        Error_Handler();
                }
                sConfigOC.Pulse = Data_Pwm1[1];
                if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
                {
                        Error_Handler();
                }
                /* USER CODE BEGIN TIM2_Init 2 */

                /* USER CODE END TIM2_Init 2 */
                HAL_TIM_MspPostInit(&htim2);
                __HAL_TIM_DISABLE_OCxPRELOAD(&htim2,TIM_CHANNEL_1);
                __HAL_TIM_DISABLE_OCxPRELOAD(&htim2,TIM_CHANNEL_2);
                HAL_TIM_OC_Start_DMA(&htim2, TIM_CHANNEL_1,Data_Pwm,2);
                htim2.State = HAL_TIM_STATE_READY;
                HAL_TIM_OC_Start_DMA(&htim2, TIM_CHANNEL_2,Data_Pwm1,2);
        }
        else
        {
                TIM_ClockConfigTypeDef sClockSourceConfig = {0};
                TIM_MasterConfigTypeDef sMasterConfig = {0};
                TIM_OC_InitTypeDef sConfigOC = {0};

                /* USER CODE BEGIN TIM2_Init 1 */

                /* USER CODE END TIM2_Init 1 */
                htim2.Instance = TIM2;
                htim2.Init.Prescaler = 35;
                htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
                htim2.Init.Period = 20000;
                htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
                htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
                if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
                {
                        Error_Handler();
                }
                sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
                if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
                {
                        Error_Handler();
                }
                if (HAL_TIM_OC_Init(&htim2) != 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 = Data_Pwm1[1];
                sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
                sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
                if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
                {
                        Error_Handler();
                }
                /* USER CODE BEGIN TIM2_Init 2 */

                /* USER CODE END TIM2_Init 2 */
                HAL_TIM_MspPostInit(&htim2);
               
                __HAL_TIM_DISABLE_OCxPRELOAD(&htim2,TIM_CHANNEL_2);
                HAL_TIM_OC_Start_DMA(&htim2, TIM_CHANNEL_2,Data_Pwm1,2);
        }

}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2122

主题

8121

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部