【问题标题】:STM32F103C8 project - I can't get HAL to work in my own functionsSTM32F103C8 项目 - 我无法让 HAL 在我自己的函数中工作
【发布时间】:2020-08-25 16:15:07
【问题描述】:

这对我来说很奇怪,我当然没想到在学习 STM32CubeIDE 的第一天左右就完全被难住了。当天的第一件事是让板载 LED 闪烁

HAL_GPIO_TogglePin(GPIOC, LED1_Pin);
HAL_Delay(500);

通过新项目/pin 配置和代码生成器,这在 main.c 文件中提供的 while 循环内运行良好,但是当我使用 HAL 命令在循环内调用我自己的函数时,它停止工作。代码循环并调用我的函数 mainLoop() 但我的函数内的任何 HAL 命令都不执行任何操作。

这是为什么 - 我是否缺少某种必须传递的句柄或 #include 以扩展源文件中 HAL 命令的范围,而不仅仅是 main() 本身?

      while (1)
      {
          HAL_GPIO_TogglePin(GPIOC, LED1_Pin);
          void mainLoop(void);
    //    HAL_Delay(500);         // works fine when uncommented
      }
    }   // end of main()

    void mainLoop(void)
    {
          HAL_Delay(200);         // this does nothing

}                             // no HAL commands actioned

是的,你说的很对,谢谢。我的愚蠢问题是我实际上试图将 mainLoop() 放在另一个 .cpp 文件中,并使用包含原型的适当 .h 头文件并从 main.c while 循环中调用它。由于我得到了对 mainLoop 链接器错误的未定义引用,我将 mainloop() 移回 main.c,然后尝试运行原型。呵呵!

因此,尽管我尝试简化问题存在缺陷,但我仍然无法调用我的 mainloop() 函数,其 HAL 命令位于另一个 .cpp 文件中。此外,虽然我还没有达到这一点,但 HAL 命令是否在每个项目源文件中都可用,或者我需要#include 一个特定的头文件吗?

【问题讨论】:

    标签: c stm32 hal


    【解决方案1】:
    void mainLoop(void);  //function declaration (prototype) needed as mainLoop is defined after the call
    
    int main(void)
    {
        while (1)
        {
            HAL_GPIO_TogglePin(GPIOC, LED1_Pin);
            mainLoop(); //call to the function
        }
    }
    
    void mainLoop(void)  // function definition
    {
        HAL_Delay(200);         // this does nothing
    
    }   
    

    由于您的mainLoop 调用在函数定义之前,您需要提供函数原型来告诉编译器参数接受函数以及它返回什么。

    那么你需要通过mainLoop()调用函数——而不是void mainLoop()

    【讨论】:

      【解决方案2】:

      你应该通过以下方式调用函数。

        while (1)
            {
                HAL_GPIO_TogglePin(GPIOC, LED1_Pin);
                mainLoop();
          //    HAL_Delay(500);         // works fine when uncommented
            }
          }   // end of main()
      
          void mainLoop(void)
          {
                HAL_Delay(200);         // this does nothing
      
      }    
      

      这不是调用函数的方式。

      【讨论】:

      • 更好的解释是:void mainLoop(void); 声明了一个函数但没有调用它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-14
      • 1970-01-01
      • 1970-01-01
      • 2020-09-01
      • 2020-12-10
      • 1970-01-01
      相关资源
      最近更新 更多