我即将开始一个基于经典STM32L4产品的新项目。 我对ARM开发有着丰富的经验,但对STM32并不熟悉。 我想知道STmicro提供的STM32 HAL和低级驱动程序(在STM32Cube软件包中)的质量和性能如何。 我想收集开发者在这个主题上的经验和反馈。 基本上,我想知道你们是否满意这段代码,或者相反地,如果你遇到了一些问题,是否有人为某些原因开发了自己的驱动程序等等... 谢谢!
我即将开始一个基于经典STM32L4产品的新项目。 我对ARM开发有着丰富的经验,但对STM32并不熟悉。 我想知道STmicro提供的STM32 HAL和低级驱动程序(在STM32Cube软件包中)的质量和性能如何。 我想收集开发者在这个主题上的经验和反馈。 基本上,我想知道你们是否满意这段代码,或者相反地,如果你遇到了一些问题,是否有人为某些原因开发了自己的驱动程序等等... 谢谢!
出于多种原因,我不喜欢HAL:
但另一方面,我使用HAL(实际上是由我进行了深度修改),来控制两个外设USB和以太网。因为编写代码需要太多时间。但正如我之前所写的,我知道它如何在硬件/底层上工作,并对其进行了修改,以符合我的喜好。
在从小型8位微控制器转换到ARM后,我立即开始使用STM32上的HAL库,并获得了一个或多个令人满意的体验,但如前所述,它会带来一些额外开销,以及一些文档不足的功能,可能会导致某些混淆。
然而,使用HAL相比手写代码的一个重要优点是其提供的抽象层次。当我需要从一种类型的STM32切换到另一种类型时,这非常有用;同时也有助于快速启动。我在一些非常不同的STM32微控制器类型/系列(L0,L1,F1,F4,F7)上使用了相似的代码,它实际上大部分时间都能工作。使用HAL库使过渡变得比较容易,不像需要了解特定微控制器的确切内存映射和寄存器布局时那样痛苦...
话虽如此,我需要承认,当涉及到现代嵌入式软件时,我仍然是一名新手,并且在进行了大约2年的不同基于STM32的项目原型工作(业余和专业)后仍在学习。例如,我仍然需要了解更多关于提供的LL代码的内容。
通过以不同的软件背景进入嵌入式领域,使用HAL级别代码而不是在正确的顺序中操纵不同寄存器的单个位,并考虑所有不同的限制以使基本的UART / SPI / I2C通信工作,为我带来了很大的便利。在我看来,STM32 HAL处于纯手写代码和mbed(例如C++ /供应商无关抽象层)之间的中间地带。 - 它将复杂的东西变得可控,以便像我这样的普通软件开发人员可以处理它。这也带来了一些折衷,正如其他人所提到的那样...
毕竟,STM32 HAL还充当一种锅炉板代码库,有时比某些情况下的晦涩参考手册更易于阅读/理解。 - 使用STM32CubeMX生成的HAL代码总是使我在启动时间上更加顺利,当我需要快速测试新板时。它还可以帮助尝试和测试各种功能。当需要手动优化性能关键部分时,稍后仍然可以进行,例如在设置项目后甚至是增量调整STM32CubeMX代码时。您可以将手写代码与HAL代码混合使用。
自2016年以来,一些问题已被确认:
缺乏良好的文档(代码文件中的注释)和干净的示例代码(过于具体,且文档不完善)。
复杂混乱的代码,有时效率较低。
拼写错误。
我喜欢ST的标准外设库,它只是一个汇编到C的转换器,非常容易使用。
我喜欢HAL和Cube,但你必须阅读驱动程序并准备好承受痛苦。 我曾经像那些唱衰者一样摇晃位,你可以选择自己的毒药。 在我的情况下,如果我使用HAL,我可以骗一个真正的程序员来维护我的代码。不用再说了,我支持HAL。 请注意,Cube只是创建了一个大致可行的东西。