向使用STM32 NUCLEO的任何嵌入式系统工程师提问

时间:2019-05-12 18:20:15

标签: arm stm32 nucleo

我最近购买了一个STM32 NUCLEO开发套件,想知道在开发产品时,实际的嵌入式系统工程师是否会在行业中使用?

我正在使用Kiel Uvision 5,STMCubeMX和STM32 ST-LINK Utility开发某些项目。当我习惯使用PIC并使用PORTA,OSCCON,TIMER0等寄存器时,我看到Kiel Uvision 5使用了现成的函数,例如HAL_GPIO_TogglePin(.........)等。这是它们通常的操作方式在行业中还是直接与收银机合作?

4 个答案:

答案 0 :(得分:4)

这主要是基于观点的,如果这个问题因这个原因而结束,我也不会感到惊讶。该答案仅涉及您所要询问的几个方面。这是一个非常广泛的主题,要在一个帖子中包含所有内容(即使最终不会长达几页),将很难(即使不是不可能)。但是,为了给我提供有关该主题的观点,尽管尝试保持公正,但简短的答案取决于..

如果您询问最常见情况下使用的功能,很可能是您提到的HAL(以前是StdPeriph)功能。原因是-他们在大多数情况下都能完成工作。毕竟,总归结为创建产品的成本是多少。如果HAL函数“足够好”达到目的,那么它们将被简单地使用,因为它们的开发速度更快。开发成本越高,就越需要削减(或将其移动到其他位置),使用抽象是一种方法。

但是,尽管我认为可以安全地假定通常使用HAL / Std Periph /其他任何(包括专有的)抽象层,但出于至少两个原因,并非总是这样。想起:

  • 现有功能可能不适合您的目的。以HAL为例,它在大多数常见情况下都可以很好地工作,但是有时您的需求可能如此具体,以至于您不得不“摸索”,最终要么编写自己的功能变体,要么在HAL之上构建新的东西。就我个人而言,我可以想到至少几个例子,其中HAL功能并非我真正需要的。不一定意味着库是不好的,只是有时需求是非常具体的。

  • 出于性能方面的考虑,有时可能需要直接与寄存器联系。 HAL和类似层是一个抽象层,与任何抽象一样,它们比直接使用寄存器花费更多的时间来执行。如果您要从给定的外围设备中挤出绝对最大值,则有时必须下降到寄存器级别。

现在我的回答更加偏颇了。.我明白了你为什么问这个问题。来自Flash或CPU时钟更为珍贵的PIC世界,直接在其中使用寄存器确实有意义。在STM32的情况下,它不再那么重要了。话虽如此,您有时会偶然发现“使用注册簿是唯一的真正方法”的观点,但是我个人认为这样的讨论最终纯属学术性。我将寄存器或基于它的任何抽象构建为工具,并且您应该使用正确的工具来完成正确的工作。使用正确工具的两个 NOT 示例:

  • 您仅将寄存器用作“唯一正确的方法”,原因是您自己相信或被告知。您的产品需要两倍(甚至更多)的时间来开发,代码占用的闪存空间更少(因此现在您使用46%的1MB闪存,而不是48%的闪存)。关键性能代码可以实现其目标。具有宽松的执行时间限制的代码也非常有效,但是对最终客户的影响不大。您的代码也不太可重用-每次发布针对新MCU系列的新产品时,您就会发现自己不断重写相同部分的代码。

  • 您仅使用HAL /任何其他类似的抽象方法,是因为“您没有选择功能强大的MCU来降低寄存器级别”,或者因为您被告知永远不要触摸寄存器。您的开发速度大大加快,并且能够发布两种产品,而不仅仅是使用寄存器发布一种产品。但是,当必须执行时间限制/传输速度时,您会发现选择MCU的能力比理论上需要的要强大。有时,您发现自己在HAL周围编写包装程序是因为它们没有完全为您提供所需的功能-感觉好像使它变得本应更复杂。

因此,毕竟,如果我想说的话有什么要说的,那就是您应该根据具体情况使用适合该工作的内容。对于STM32,如今有3种选择:HAL(最高抽象级别),HAL LL(低级别抽象-通常是围绕寄存器访问的简单包装函数)或直接使用寄存器。您选择哪种应该来自您的要求。

答案 1 :(得分:1)

我一直都在使用Nucleo板。它允许我在实际硬件就绪之前就开始编写软件。

HAL和注册方式是程序员的选择,而不是“行业标准”。在编程更复杂的外围设备(如USB和以太网)时,我本人使用HAL驱动程序,以避免从头开始连接整个堆栈。

答案 2 :(得分:1)

我刚刚完成学业,并且我们将STM32平台与CMSIS和HAL一起大量使用。

这是优先事项。 HAL库提供了更高的抽象性,但是附带了一些不太直观的怪癖。 HAL(was /)有时有故障。我们遇到了SPI传输错误,由于每字节传输存在延迟,使得更高的SPI传输速率无法使用。

CMSIS提供了较低级别的访问,但仍然从简单的位操作中抽象出来。我认为直接寄存器访问不再是编程的好方法,至少应使用CMSIS。但这仍然是观点,偏好以及什么才是适合当前工作的问题。如果您需要快速处理:HAL。如果您需要非常精细的控制:CMSIS。

(旁注,我相信CMSIS已被淘汰,以支持HAL,但目前仍可使用)

答案 3 :(得分:0)

所有其他答案均有效。 只是想插话并说我在工作中(以及在两家公司)定期使用STM32。我们在两家公司都使用了HAL驱动程序。显然,它们存在一些问题,但经常被其他人经常使用,因此您可以轻松地在线找到支持。另外,CubeMx对它们进行了出色的处理,至少足以使您开始使用外围设备。因此,0->某些步骤的感觉会更小。但是,要获得真正优化的代码和设计,您可能需要更深入地研究,以真正了解每种HAL驱动程序在做什么,并确定哪种方法适合您的项目,目标和要求。

相关问题