我曾与STM、NXP和Atmel MCU合作过,但在启动过程中,我们一直使用供应商提供的启动脚本来启动硬件。我知道我们这么做是因为我们不想从头开始重写链接器脚本和启动序列,这几乎没有效率。但是从学习者的角度来看,如果给了一个MCU,我们怎么知道它需要引导的顺序呢?我在想,也许应该有一个地方记录了序列,但我们很少去看它。
供应商是否会为特定的芯片或芯片系列记录启动顺序(在ResetHandler()函数中执行的步骤)?我试着在Cortex-M4和ARMv7技术参考手册中查看程序员的模型。但我没能找到。我现在用在STM32G431RBT6上学习的芯片
发布于 2022-05-23 11:39:40
芯片供应商通常不会指定这样的事情;这是特定的应用程序--即取决于您如何使用该芯片。它通常是由示例/引用代码“记录”的,而不是显式描述的。
尽管如此,还是有一些一般性原则:
将有硬件初始化,这将是部分具体,并为此,单片机参考手册和/或数据表将是您的来源。例如,对于您的STM32,如果您希望在超过默认的内部RC振荡器的16 the以上运行MCU,则通常会配置PLL,而在此之前,您通常需要配置内存定时和等待状态。如果您正在使用外部内存,您还可以在此配置总线和内存控制器--如果外部内存位于链接映射中,则这是必要的,以便您的工具链的链接器可以将代码和数据定位在那里。
在硬件初始化之后,必须建立软件运行时环境.C运行时通常会建立堆栈,初始化静态数据,并初始化库(用于堆等)。C++运行时还将为全局范围内的对象调用构造函数.这通常是编译器/工具链提供的在main()之前调用的代码--例如,您通常会看到启动代码调用__main (ARMCC)或_start (GCC) --它们不是对main()的直接调用,而是C/C++运行时初始化(它最终调用了main(),您可以在这里进行更多特定于应用程序的初始化和/或启动实时操作系统内核)。
对于有一个名为CMSIS的框架的ARM Cortex-M,硬件初始化放在用户提供的函数SystemInit()中。如果您有供应商提供的SystemInit(),您应该在那里修改它以适应您的应用程序。或者你可以从零开始实现你自己的。SystemInit()将从Reset_Handler (通常作为汇编程序实现)调用,后者是重置向量处理程序。
例如,请参阅:https://developer.arm.com/documentation/ka001193,它描述了按照CMSIS约定的Cortex-M7设备的典型启动。
https://stackoverflow.com/questions/72346758
复制相似问题