Timer 如何修复代码,使STM32 Nucleo板上的LED闪烁与1秒50%占空比PWM同步?

Timer 如何修复代码,使STM32 Nucleo板上的LED闪烁与1秒50%占空比PWM同步?,timer,stm32,hal,pwm,stm32cubeide,Timer,Stm32,Hal,Pwm,Stm32cubeide,我的董事会是 我将TIM4、CH2配置为PWM,这样TIM4输出应为HI半秒,LO半秒。以下是block.ioc时钟和引脚配置 我自动生成了代码,并尝试添加我自己的代码,用PWM的H/L切换LED。我想做的是: if(定时器4==高)发光二极管状态=!LED_状态 以下是实际代码: HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */

我的董事会是

我将TIM4、CH2配置为PWM,这样TIM4输出应为HI半秒,LO半秒。以下是block.ioc时钟和引脚配置

我自动生成了代码,并尝试添加我自己的代码,用PWM的H/L切换LED。我想做的是:

if(定时器4==高)发光二极管状态=!LED_状态

以下是实际代码:

HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ETH_Init();
  MX_USART3_UART_Init();
  MX_USB_OTG_FS_PCD_Init();
  MX_DAC1_Init();
  MX_TIM3_Init();
  MX_TIM4_Init();
  /* USER CODE BEGIN 2 */

  HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_2);
  uint16_t timer_init_val = __HAL_TIM_GET_COUNTER(&htim4);
  uint16_t timer_poll;

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

      timer_poll = __HAL_TIM_GET_COUNTER(&htim4);
      if(timer_poll - timer_init_val >= 500) {
          HAL_GPIO_TogglePin(GPIOB,LD1_Pin);
      }



    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

我知道这很可能行不通。事实上我很困惑,因为将>=500替换为您所写的内容会执行以下操作:

  • 对于500次计时器计数,什么也不做
  • 之后,反复打开和关闭LED(速度比眼睛能看到的快),直到计时器结束
  • 当计时器结束时(65.536秒?)转到(1)
  • 使用GPIO_TogglePin无法真正做到这一点,因为在计数器的同一个值期间,您将多次调用它

    尝试以下方法:

    if (((timer_poll - timer_init_val) % 1000) < 500)
    {
        HAL_GPIO_WritePin(GPIOB, LD1_Pin, 0);
    }
    else
    {
        HAL_GPIO_WritePin(GPIOB, LD1_Pin, 1);
    }
    
    if((计时器轮询-计时器初始化值)%1000)<500)
    {
    HAL_GPIO_WritePin(GPIOB,LD1_引脚,0);
    }
    其他的
    {
    HAL_GPIO_WritePin(GPIOB,LD1_引脚,1);
    }
    

    但当计时器结束时,这仍然不是完全干净的。要进行排序,您可以将计时器的周期调整为序列周期的倍数。

    这确实有效!但我不明白的是为什么我必须使用这个模和减法。我不是在block.ioc中设置了它吗?这样定时器4在50%占空比、1秒周期PWM?的情况下是高还是低。这样我就可以在定时器4高时写入LED状态1?你根本不用PWM!PWM是一种硬件输出,直接从定时器输出到交替功能模式下的引脚。您在软件中读取计时器,然后在GPIO模式下从软件输出到引脚。这对于LED这样的计时不需要纳秒精度的东西来说是绝对好的。它的优点是,您可以使用任何引脚,而不仅仅是具有正确替代功能的引脚。