【问题标题】:STM32 BluePill LED flasher acts strange using HAL_GPIO_TogglePinSTM32 BluePill LED 闪光灯使用 HAL_GPIO_TogglePin 表现异常
【发布时间】:2020-09-15 09:47:21
【问题描述】:

我有两个简单的 LED 闪光灯以 1 秒的间隔为我的 BluePills 编程闪光。一种方法使用 HAL_GPIO_TogglePin 切换 LED 状态,另一种使用 Set 和 Reset 切换 LED 状态。设置和重置按预期运行,但 HAL_GPIO_TogglePin 确实在工作,但它在某些时候几乎具有 PWM 效果。我已经在 2 种不同的 Bluepills 上尝试了这两种方法,结果都相同。

 while (1)
  {  
        if (__HAL_TIM_GET_COUNTER(&htim1) >= 32000)
        {
          HAL_GPIO_TogglePin(User_LED_GPIO_Port, User_LED_Pin);
        }

 while (1)
  {  
        if (__HAL_TIM_GET_COUNTER(&htim1) >= 32000)
        {
              HAL_GPIO_WritePin(User_LED_GPIO_Port, User_LED_Pin, GPIO_PIN_SET);
        }
        else {
              HAL_GPIO_WritePin(User_LED_GPIO_Port, User_LED_Pin, GPIO_PIN_RESET);
        }

【问题讨论】:

  • 你没有提到定时器是如何配置的。让我们假设它计数到 64,000。因此,查看您的第一个代码 sn-p:从 0 到 32,000,LED 没有变化。从 32,000 到 64,000,LED 在每次循环迭代时都会更改(切换),可能每秒数千次,即它看起来像 PWM。您的代码与您观察到的完全一致。

标签: stm32 bluepill


【解决方案1】:

感谢 Codo,您 100% 正确。我修改为

if ((__HAL_TIM_GET_COUNTER(&htim1) == 32000) || (__HAL_TIM_GET_COUNTER(&htim1)==0))
        {
          HAL_GPIO_TogglePin(User_LED_GPIO_Port, User_LED_Pin);
          timer_val = __HAL_TIM_GET_COUNTER(&htim1);
        }

有趣的是,我最初是按照 Digikey 的例子做的。

  while (1)
  {
    // If enough time has passed (1 second), toggle LED and get new timestamp
    if (__HAL_TIM_GET_COUNTER(&htim16) - timer_val >= 10000)
    {
      HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
      timer_val = __HAL_TIM_GET_COUNTER(&htim16);
    }

哦,好吧,对于我想要的,设置重置效果更好。谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    相关资源
    最近更新 更多