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