CMSIS,HAL和标准外设库


29

因此,我从PIC切换到ARM,并购买了STM32F4发现板。到目前为止,我了解要进行编程,您可以直接(以明显的方式)访问内存中的所有寄存器,还可以使用3个主要的库来简化生活。现在我的问题是,这3个中的哪一个(CMSIS,HAL,Std Peripherals Lib)是最低电平的?即。开销较小的那一种。我的目标是学习控制器的内部工作原理,而不是让我的生活变得更轻松(仅一点点),因此我想知道其中哪些更接近核心而不使用组装。


10
[CMSIS的STM32端本质上只是寄存器定义而没有代码,因此CMSIS ==直接访问寄存器。AFAIK ST没有仅针对CMSIS的单独下载,但是当您下载StdPeriph Lib或STM32Cube时,您可以选择仅使用CMSIS部分。的STM32寄存器定义在任一发现Libraries/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.hDrivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h分别。
Aleksi Torhamo

Answers:


27

绝对是CMSIS。它不完全是一个库,它主要包含各种寄存器的定义。

正是为了轻松实现自己的HAL而需要轻松访问微控制器的寄存器。由于您仅访问寄存器,因此没有开销。

请记住,与其他两个不同,CMSIS是由ARM而非ST定义的。这意味着用于各种微控制器的各种CMSIS库非常相似,这极大地促进了可移植性。

此外,CMSIS是更简单的一种,因此(IMO)是CMSIS中最通用,最可靠的,可能有更少(或没有)错误。我使用过的各种MCU的一些hal库因其错误而臭名昭著。

另一方面,CMSIS需要您做更多的工作。但是,这是我个人的选择,因为我更愿意花时间创建符合我的需求的高质量库,并了解芯片的工作原理,所以只花时间学习一个新的库。


我不确定ST是否仍支持CMSIS库
Scott Seidman

1
好吧...类似的东西。没有直接链接,他们不鼓励这样做(好像他们想将用户尽可能地绑定到他们的代码上,不鼓励他们离开其他品牌),但是它在其他库中使用。您可以从那里提取它。它很简单,没有包含太多代码,并且看起来很成熟。无论他们是否将其市场化为受支持产品,它看起来都可以安全地用于生产。
Fotis Panagiotopoulos

是的,他们停止朝那个方向发展真是令人遗憾。首先,使CMSIS符合性是吸引我进入ST的原因之一。我仍然在使用它,但是我感觉如果不方便的话,一天将会到来。
斯科特·塞德曼

3
@ScottSeidman,我认为您将CMSIS与StdPeriph混淆了。CMSIS得到很好的支持,并且将得到无限期的支持。它的StdPeriph现在已基本弃用,但CMSIS仍与10年前一样活跃。
ScienceSamovar

14

要了解其工作原理,请不要使用上述任何一种方法。从st完成,获得arm cross编译器和文档。开始编码。这些芯片通常真的很容易编程。该文档告诉您哪些寄存器中的哪些位做什么。

这些库中的任何一个/全部都旨在消除您的理解/负担/工作,使您感觉像是像应用程序编程经验一样的api调用。这是很多人想要的。您可以使用这些库的所有源代码来帮助理解,但是随着您对它的了解加深,您会发现库中的漏洞和问题,有时代码非常可怕。将代码组合在一起,以通用的方式编写,并大致从一个芯片移植到另一芯片,也许支持您的芯片不具备的功能,等等。而且它们都具有过多的开销。该任务的代码太多了10到100倍,可以肯定其中的许多代码可能会优化掉,但是为什么首先要在其中呢?

无论您自己使用还是使用其中一个库,您仍应查看所使用库的源代码,以了解自己对它们所做的工作是否满意,是否有意义,是否与芯片文档相匹配等。出问题了,您可能需要尽可能多地挖掘他们的东西,以找出原因。

请注意,芯片文档也不是完美的,这很有趣。

我不明白为什么在有关裸机编程的讨论中会出现汇编语言。您只需很少的组装就可以解决问题。对于这些cortex-m芯片,从技术上讲,您仅需要这么多的asm即可启动:

.globl _start
_start:
.word 0x20001000
.word main

您不能依靠数据也不能依靠bss,并且不能以最小的asm从main返回。但这就是您需要的最裸露金属的组件。现在,如果要进行中断,则需要在向量表中添加更多条目。更多.word线。我建议使用更多的asm,但建议增加10或20行。

这通常是我使用的所有asm。

.cpu cortex-m0
.thumb
.thumb_func
.global _start
_start:
stacktop: .word 0x20001000
.word reset
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.thumb_func
reset:
    bl notmain
    b hang
.thumb_func
hang:   b .
.align
.thumb_func
.globl PUT16
PUT16:
    strh r1,[r0]
    bx lr
.thumb_func
.globl PUT32
PUT32:
    str r1,[r0]
    bx lr
.thumb_func
.globl GET32
GET32:
    ldr r0,[r0]
    bx lr
.thumb_func
.globl GET16
GET16:
    ldrh r0,[r0]
    bx lr
.thumb_func
.globl dummy
dummy:
    bx lr
.end

是的,它说的是cortex-m0,但这是我的m4代码的实际引导程序。我希望这是大拇指,而不是thumb2。我只是将这些代码从一个皮层m复用到另一个皮层,并根据需要更改堆栈指针地址,因此适用于m0,m3和m4。我还没有m7,也没有对其进行过多研究。

启用fpu可能需要更多行asm,因为需要特定的说明。但是重点是不要混淆底层编程和asm。C具有配置芯片和编写应用程序所需的功能。您正在谈论的库是用C而不是asm编写的,因此显然它们也不需要使用asm。

如果您想学习内部工作原理,请编写自己的代码。请勿将这些库用作参考。有时,仅仅破解它比尝试阅读其代码要容易。(不仅是ST,还包括所有供应商。其中一个供应商提供了一行代码,因此让我感到震惊的是,我将其用作面试问题,不打算在此处发布)。

毫无疑问,意法半导体(ST)以及其他供应商也为节省电源,为芯片的各个部分提供了时钟启用功能,因此,在尝试闪烁LED指示灯之前,您需要找到该gpio模块的启用位,然后查看是否出现启用复位功能,如果没有启用该功能,则在不启用时钟的情况下与该gpio逻辑通信,它只是在挂起处理器,因为它正在等待永远不会响应的逻辑的响应。他们并不总是告诉您有关这些启用的信息。一旦启用,它们有时会引导您完成某些特定外设的初始化。ST文档非常好。来自微芯片,它的文档成绩很差,您应该不会有问题。


2
OP并未询问启动程序或类似程序。哪个图书馆最适合他/她使用。
Fotis Panagiotopoulos

提到了自动
取款机

2
CMSIS也不包含代码,除了一些最低限度的要求。它不包括启动代码,链接脚本或类似内容。它仅包含寄存器的定义。为什么要编写加密代码或重新发明轮子,而不是使用漂亮的名称直接访问寄存器?
Fotis Panagiotopoulos

2
@John您可以轻松高效地启动完全没有ASM的ARM微控制器。如果有兴趣,请提出一个新问题,并在此处评论链接以向您展示一些示例。
Fotis Panagiotopoulos

1
@ user3634713我实际上非常感兴趣。感谢electronics.stackexchange.com/questions/224618/…–
约翰

2

我都使用过,只是裸机寄存器访问和std外设库。我发现处理登记册更加容易。同样,如果您使用的是调试器,则可以查看寄存器并确认它们包含您对其进行编程的内容。我想您确实也以这种方式了解有关芯片操作的更多信息。


2

来自8bit的世界,我一直习惯于通过寄存器对外围设备进行编程。微控制器数据手册(即STM32参考手册)仅以寄存器符号描述外设。由于程序员在尝试使用它之前必须阅读相同的文档以了解外围功能和特性,所以对我来说开始对寄存器进行编程似乎很自然。通过精心的代码布局和注释,我发现即使在几个月后重新使用它也可以轻松阅读和修改代码。


2

到目前为止,我一直使用CMSIS定义,并喜欢直接使用寄存器。同时,我在几个项目中使用了HAL库。它对代码运行时间有相当大的影响,因此我退出了。尽管CMSIS符合我的兴趣,但是最近这些天我将成为libopencm3的粉丝。就像LLST提供的库一样。但是,即使在ST系列中,它也涵盖了更多的微控制器:

libopencm3项目(以前称为libopenstm32)旨在为各种ARM Cortex-M3微控制器(包括ST STM32,Toshiba TX03,Atmel SAM3U,NXP LPC1000等)创建免费/自由/开源固件库。

请注意:

尽管有名称,libopencm3也支持其他ARM Cortex“相关”微控制器,例如Cortex-M0或Cortex-M4 / Cortex-M4F。

you can find the list of supported micro-controllers here.


The actual problem is that ST has the wrong idea of what a HAL is supposed to do. A proper HAL will have a function like adc_get_result() which wraps in the complete ADC peripheral driver including real-time aspects, interrupts etc. The ST one seems to rather be write_to_scary_register which is basically just a bloated wrapper around the register access. In all fairness, ST isn't the only vendor to provide such excess bloat, Atmel ASF and others are equally bad.
Lundin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.