Answers:
绝对是CMSIS。它不完全是一个库,它主要包含各种寄存器的定义。
正是为了轻松实现自己的HAL而需要轻松访问微控制器的寄存器。由于您仅访问寄存器,因此没有开销。
请记住,与其他两个不同,CMSIS是由ARM而非ST定义的。这意味着用于各种微控制器的各种CMSIS库非常相似,这极大地促进了可移植性。
此外,CMSIS是更简单的一种,因此(IMO)是CMSIS中最通用,最可靠的,可能有更少(或没有)错误。我使用过的各种MCU的一些hal库因其错误而臭名昭著。
另一方面,CMSIS需要您做更多的工作。但是,这是我个人的选择,因为我更愿意花时间创建符合我的需求的高质量库,并了解芯片的工作原理,所以只花时间学习一个新的库。
要了解其工作原理,请不要使用上述任何一种方法。从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文档非常好。来自微芯片,它的文档成绩很差,您应该不会有问题。
到目前为止,我一直使用CMSIS定义,并喜欢直接使用寄存器。同时,我在几个项目中使用了HAL库。它对代码运行时间有相当大的影响,因此我退出了。尽管CMSIS符合我的兴趣,但是最近这些天我将成为libopencm3的粉丝。就像LL
ST提供的库一样。但是,即使在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.
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.
Libraries/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h
或Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h
分别。