-1

我的板子是NUCLEO-H743ZI2

我将 TIM4、CH2 配置为 PWM,这样 TIM4 输出应为 HI 半秒和 LO 半秒。这是 block.ioc 时钟和引脚配置 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

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

if(timer_4 == HIGH) LED_state = !LED_state

这是实际的代码:

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 */
}

我知道这很可能不起作用。实际上。我很困惑,因为用 <=100 替换 >=500 实际上使它看起来像是在工作..但是 LED 只是以看似随机的间隔闪烁。我试图测试 !timer{..} (定时器达到 0)是否切换 LED,但我的方法似乎都不起作用。

我对计时器有误解吗?有什么非常明显的东西我错过了吗?用 1 秒 PWM 闪烁 LED 似乎并不困难

4

1 回答 1

0

你所写的内容如下:

  1. 对于 500 次计时器计数,什么也不做
  2. 之后反复打开和关闭 LED(比眼睛看到的更快)直到计时器结束
  3. 当计时器结束时(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);
}

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

于 2021-03-16T09:36:02.070 回答