在哪里可以找到 MCU 的预期启动顺序
Where to find the intended boot sequence of an MCU
我曾使用过 STM、NXP 和 Atmel MCU,但在电路板启动期间,我们一直使用供应商提供的启动脚本来启动硬件。我知道我们这样做是因为我们不想从头开始重写链接描述文件和启动序列,这很难产生效果。但是从学习者的角度来看,如果给定一个 MCU,我们如何知道它需要按什么顺序启动?我在想也许应该在某个地方记录序列,但我们很少看它。
供应商是否会在某个地方记录特定芯片或芯片系列的启动顺序(在 ResetHandler() 函数中执行的步骤)?我尝试查看 Cortex-M4 和 ARMv7 技术参考手册中的程序员模型。但是我找不到它。我目前学习使用的芯片STM32G431RBT6
芯片供应商通常不会规定这样的事情;它是特定于应用程序的——即取决于您如何使用芯片。它通常由 example/reference 代码“记录”,而不是明确描述。
也就是说有一些一般原则:
将进行特定于零件的硬件初始化,为此,MCU 参考手册 and/or 数据 sheet 将是您的来源。例如,对于您的 STM32,如果您希望 运行 MCU 的频率高于默认内部 RC 振荡器的 16MHz,通常会配置 PLL,在此之前,您通常需要配置内存时序和 wait-states。如果您使用的是外部存储器,您还可以在此时配置总线和内存控制器 - 如果外部存储器位于 link 映射中,那么代码和数据可能会被您的工具链 link呃
硬件初始化后,必须建立软件run-time环境。 C 运行time 通常会建立堆栈、初始化静态数据和初始化库(用于堆等)。 C++ run-time 将为全局范围内的对象额外调用构造函数。通常这将是 compiler/toolchain 提供的代码,在 main()
之前调用 - 例如,您通常会看到 start-up 代码调用可能 __main
(ARMCC) 或 _start
( GCC) - 既不是直接调用 main()
而是 C/C++ 运行 时间初始化(最终调用 main()
在那里你可以做更多应用程序特定的初始化 and/or 例如启动一个 RTOS 内核。
对于 ARM Cortex-M,有一个称为 CMSIS 的框架,硬件初始化放在用户提供的函数中 SystemInit()
。如果您有供应商提供 SystemInit()
,您应该在那里修改它以适合您的应用程序。或者您可以从头开始实施自己的。 SystemInit()
将从 Reset_Handler
(通常实现为汇编程序)调用,它是重置向量处理程序。
参见示例:https://developer.arm.com/documentation/ka001193,它描述了遵循 CMSIS 约定的 Cortex-M7 设备的典型 start-up。
我曾使用过 STM、NXP 和 Atmel MCU,但在电路板启动期间,我们一直使用供应商提供的启动脚本来启动硬件。我知道我们这样做是因为我们不想从头开始重写链接描述文件和启动序列,这很难产生效果。但是从学习者的角度来看,如果给定一个 MCU,我们如何知道它需要按什么顺序启动?我在想也许应该在某个地方记录序列,但我们很少看它。
供应商是否会在某个地方记录特定芯片或芯片系列的启动顺序(在 ResetHandler() 函数中执行的步骤)?我尝试查看 Cortex-M4 和 ARMv7 技术参考手册中的程序员模型。但是我找不到它。我目前学习使用的芯片STM32G431RBT6
芯片供应商通常不会规定这样的事情;它是特定于应用程序的——即取决于您如何使用芯片。它通常由 example/reference 代码“记录”,而不是明确描述。
也就是说有一些一般原则:
将进行特定于零件的硬件初始化,为此,MCU 参考手册 and/or 数据 sheet 将是您的来源。例如,对于您的 STM32,如果您希望 运行 MCU 的频率高于默认内部 RC 振荡器的 16MHz,通常会配置 PLL,在此之前,您通常需要配置内存时序和 wait-states。如果您使用的是外部存储器,您还可以在此时配置总线和内存控制器 - 如果外部存储器位于 link 映射中,那么代码和数据可能会被您的工具链 link呃
硬件初始化后,必须建立软件run-time环境。 C 运行time 通常会建立堆栈、初始化静态数据和初始化库(用于堆等)。 C++ run-time 将为全局范围内的对象额外调用构造函数。通常这将是 compiler/toolchain 提供的代码,在 main()
之前调用 - 例如,您通常会看到 start-up 代码调用可能 __main
(ARMCC) 或 _start
( GCC) - 既不是直接调用 main()
而是 C/C++ 运行 时间初始化(最终调用 main()
在那里你可以做更多应用程序特定的初始化 and/or 例如启动一个 RTOS 内核。
对于 ARM Cortex-M,有一个称为 CMSIS 的框架,硬件初始化放在用户提供的函数中 SystemInit()
。如果您有供应商提供 SystemInit()
,您应该在那里修改它以适合您的应用程序。或者您可以从头开始实施自己的。 SystemInit()
将从 Reset_Handler
(通常实现为汇编程序)调用,它是重置向量处理程序。
参见示例:https://developer.arm.com/documentation/ka001193,它描述了遵循 CMSIS 约定的 Cortex-M7 设备的典型 start-up。