系统内存在 ARM 内存映射上的 STM32F103 中实际工作是什么?
what does system memory work actually in STM32F103 on ARM memory map?
现在我想了解STM32F103x的启动顺序。
如您所知,这是基于 cortex-m3 的。
所以我试图找到这种引导的概念,例如 STM32F103x..
但我在文档中找不到任何地方
我在哪里可以找到 ARM memory map 上 STM32 的启动顺序?
因为我想知道系统内存的实际工作原理是什么?
目前。我试图了解 cortex m3 地址映射中的系统内存。大多数例子都说“有 2 个区域,例如 0x08000000 闪存区域和 0x1FFFF000 系统内存区域。
我了解到闪存区域正在为执行文件保存,系统内存正在为引导加载程序保存。
例如,我可以从在 Keil uVision 中使用 startup_CMSDK_CM3.s 和 startup_CMSDK_CM3.c 的构建生成一个十六进制二进制文件。
然后我通过使用 JTEG 将一个十六进制二进制文件放入 STM32 MCU 到 0x0800_0000 闪存区域而不是系统内存区域。
我不确定系统内存和闪存之间的区别,我想知道"What does system memory and area actually work?"
如果您阅读 arm 文档,您将看到矢量 table 在哪里以及内容是什么。最低限度位于地址 0x00000004,您需要重置处理程序的(拇指)地址。
如果您阅读 stm32 文档,您会发现基于引导引脚会发生各种情况,典型用例是 0x08000000,它是包含您的程序的闪存,映射到 0x00000000。您可以为 0x00000000 选择 link,也可以像大多数人一样为 0x08000000 选择 link,偏移量 0x00000004(和 0x00000008 等)处的(拇指)地址将指向 0x08000000 中的某处.
内存仅用于读写内容、指令、.text,是只读的,您不需要写入,对于微控制器,您需要将应用程序存储在非易失性存储中,它们被设计为 运行 代码从 flash 中取出(现在这不是一个好主意,除了像这样的专门构建的 flash)。
因此您的程序 .text 和任何其他只读数据都进入闪存。您拥有的任何 .data 都保存在闪存中,但 bootstrap 将其复制到 ram 和 bootstrap zeros .bss,然后一旦启动并进入您在 C 中的入口点(通常是 main() 但这只是任意函数名称)典型的用例是您的程序在只读闪存中,而您的数据在 read/write ram 中。应该的。
作为程序员,你负责以上所有内容,向量 table、bootstrap、linking,以及编写程序来做事.
cortex-m 引导方案非常典型,最常见的两种是 运行 在某个地址,或者有一个向量 table 处理程序所在的地址。全尺寸的手臂是来自这个地址的运行,皮质-m是地址列表,向量table。
当您阅读 nxp 或 atmel samd 或 cortex-ms 的其他实现时,您会发现它们都将您的闪存放在引导 space 中,但可能会以不同的方式进行方法。有些具有可以以各种方式调用的工厂引导加载程序,并且内核不会神奇地改变它们只是将工厂引导加载程序映射到 cortex-m 的零地址 space。
在 arm、st、nxp、atmel 和其他文件中都有。
编辑
系统内存用于您的数据,read/write项,变量,变化的数据结构等。如果您选择不使用已经内置的引导加载程序,那么您可以选择编写自己的部分你的应用程序和作为引导加载程序你是受欢迎的,事实上几乎必须将新程序下载到 ram,但这并不意味着你必须从那里 运行 它(你可以尽管 harvard 这个词被抛来抛去)或者更可能的是,您只是将其用作存放区域以将其刻录到闪光灯中。微控制器的典型用途是 运行 闪存上的固件,并将 sram 用于任何可能更改的 read/write 数据。时钟收音机、烤面包机、遥控器和无数其他东西。
old_timer回答的很好,所以我就STM32部分再详细说一下:
从这里我们可以看到STM32不同的启动引脚:
STM32 系统内存的bootloader在此处进行了深入描述:
特别是引导加载程序固件的位置(对于 STM32F1xxx,第 54 页):
以及启动顺序(第 55 页):
这是在 闪存 模式 (F103) 中实现引导加载程序:
http://blog.myelectronics.com.ua/stm32-usb-mass-storage-bootloader/
我发现这很有用(从 1.40 开始):
https://www.youtube.com/watch?v=3brOzLJmeek
现在我想了解STM32F103x的启动顺序。 如您所知,这是基于 cortex-m3 的。 所以我试图找到这种引导的概念,例如 STM32F103x.. 但我在文档中找不到任何地方 我在哪里可以找到 ARM memory map 上 STM32 的启动顺序?
因为我想知道系统内存的实际工作原理是什么?
目前。我试图了解 cortex m3 地址映射中的系统内存。大多数例子都说“有 2 个区域,例如 0x08000000 闪存区域和 0x1FFFF000 系统内存区域。
我了解到闪存区域正在为执行文件保存,系统内存正在为引导加载程序保存。
例如,我可以从在 Keil uVision 中使用 startup_CMSDK_CM3.s 和 startup_CMSDK_CM3.c 的构建生成一个十六进制二进制文件。 然后我通过使用 JTEG 将一个十六进制二进制文件放入 STM32 MCU 到 0x0800_0000 闪存区域而不是系统内存区域。
我不确定系统内存和闪存之间的区别,我想知道"What does system memory and area actually work?"
如果您阅读 arm 文档,您将看到矢量 table 在哪里以及内容是什么。最低限度位于地址 0x00000004,您需要重置处理程序的(拇指)地址。
如果您阅读 stm32 文档,您会发现基于引导引脚会发生各种情况,典型用例是 0x08000000,它是包含您的程序的闪存,映射到 0x00000000。您可以为 0x00000000 选择 link,也可以像大多数人一样为 0x08000000 选择 link,偏移量 0x00000004(和 0x00000008 等)处的(拇指)地址将指向 0x08000000 中的某处.
内存仅用于读写内容、指令、.text,是只读的,您不需要写入,对于微控制器,您需要将应用程序存储在非易失性存储中,它们被设计为 运行 代码从 flash 中取出(现在这不是一个好主意,除了像这样的专门构建的 flash)。
因此您的程序 .text 和任何其他只读数据都进入闪存。您拥有的任何 .data 都保存在闪存中,但 bootstrap 将其复制到 ram 和 bootstrap zeros .bss,然后一旦启动并进入您在 C 中的入口点(通常是 main() 但这只是任意函数名称)典型的用例是您的程序在只读闪存中,而您的数据在 read/write ram 中。应该的。
作为程序员,你负责以上所有内容,向量 table、bootstrap、linking,以及编写程序来做事.
cortex-m 引导方案非常典型,最常见的两种是 运行 在某个地址,或者有一个向量 table 处理程序所在的地址。全尺寸的手臂是来自这个地址的运行,皮质-m是地址列表,向量table。
当您阅读 nxp 或 atmel samd 或 cortex-ms 的其他实现时,您会发现它们都将您的闪存放在引导 space 中,但可能会以不同的方式进行方法。有些具有可以以各种方式调用的工厂引导加载程序,并且内核不会神奇地改变它们只是将工厂引导加载程序映射到 cortex-m 的零地址 space。
在 arm、st、nxp、atmel 和其他文件中都有。
编辑
系统内存用于您的数据,read/write项,变量,变化的数据结构等。如果您选择不使用已经内置的引导加载程序,那么您可以选择编写自己的部分你的应用程序和作为引导加载程序你是受欢迎的,事实上几乎必须将新程序下载到 ram,但这并不意味着你必须从那里 运行 它(你可以尽管 harvard 这个词被抛来抛去)或者更可能的是,您只是将其用作存放区域以将其刻录到闪光灯中。微控制器的典型用途是 运行 闪存上的固件,并将 sram 用于任何可能更改的 read/write 数据。时钟收音机、烤面包机、遥控器和无数其他东西。
old_timer回答的很好,所以我就STM32部分再详细说一下:
从这里我们可以看到STM32不同的启动引脚:
STM32 系统内存的bootloader在此处进行了深入描述:
特别是引导加载程序固件的位置(对于 STM32F1xxx,第 54 页):
以及启动顺序(第 55 页):
这是在 闪存 模式 (F103) 中实现引导加载程序:
http://blog.myelectronics.com.ua/stm32-usb-mass-storage-bootloader/
我发现这很有用(从 1.40 开始):
https://www.youtube.com/watch?v=3brOzLJmeek