打印
[应用相关]

STM32定时器DMA正常单次模式出现问题

[复制链接]
280|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);
        }

}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2038

主题

7366

帖子

10

粉丝