在STM32F103的ARM内存映射中,系统内存实际上起到了什么作用?

4
现在我正在尝试理解STM32F103x的引导顺序。 正如你已经知道的,它是基于cortex-m3的。 所以我试图找到关于STM32F103x引导的概念... 但是我在文档中找不到任何相关信息。 我应该在ARM内存映射中找到STM32的引导顺序吗?
因为我想知道系统内存实际上是如何工作的。
目前,我正在努力理解cortex m3地址映射中的系统内存。大多数示例都说"有两个区域,即0x08000000闪存区域和0x1FFFF000系统内存区域。
我明白闪存区域用于保存可执行文件,而系统内存用于保存引导加载程序。
例如,我可以使用Keil uVision从startup_CMSDK_CM3.s和startup_CMSDK_CM3.c构建一个十六进制二进制文件。 然后,我将这个十六进制二进制文件通过JTEG放入STM32 MCU的闪存区域0x0800_0000,而不是系统内存区域。
我不确定系统内存和闪存之间的区别,我想知道“系统内存和区域实际上是如何工作的?”

1
忘记系统内存吧。那是出厂时的引导加载程序区域。对你来说,只需要记住你可以进入引导加载程序模式并刷写程序即可。其他的事情我想现在对你来说还为时过早。 - 0___________
2个回答

10

老手的答案很好,我只是在更详细地介绍STM32部分:

从这里我们可以看到STM32不同的引导引脚:

https://electronics.stackexchange.com/questions/206521/how-to-use-external-st-link-to-debug-program-stm32f103-mcu

输入图像描述

STM32的系统存储器引导程序在此处有详细描述:

http://www.st.com/content/ccc/resource/technical/document/application_note/b9/9b/16/3a/12/1e/40/0c/CD00167594.pdf/files/CD00167594.pdf/jcr:content/translations/en.CD00167594.pdf

特别是引导加载程序固件的位置(针对STM32F1xxx,第54页):

输入图像描述

和启动序列(第55页):

输入图像描述

这是在闪存模式下实现引导加载程序(F103)的方法:

http://blog.myelectronics.com.ua/stm32-usb-mass-storage-bootloader/

我认为这个非常有用(从1.40开始):

https://www.youtube.com/watch?v=3brOzLJmeek

enter image description here


4
如果你阅读arm文档,你会看到向量表在哪里以及它的内容是什么。最少需要位于地址0x00000004处重置处理程序(thumb)地址。
如果你阅读stm32文档,你会发现基于启动引脚会发生各种事情,典型应用是0x08000000,它是包含程序的flash,映射到0x00000000。您可以选择链接到0x00000000,也可以选择链接到0x08000000,大多数人都是这样做的,偏移为0x00000004(和0x00000008等)的(thumb)地址将指向0x08000000中的某个位置。
内存只为可读可写的东西、指令、.text提供,它是只读的,您不需要编写,并且对于微控制器,您需要应用程序存储在非易失性存储器中,并且它们被设计为从flash中运行代码(这些天除了这些特定的flash之外,这不是一个好主意)。
因此,您的程序.text和任何其他只读数据都存储在flash中。任何.data都存储在flash中,但引导程序将其复制到RAM中,并清零.bss,然后一旦引导完成并进入C中的入口点(通常是main(),但那只是一个任意函数名),典��的用例是您的程序位于只读flash中,您的数据位于可读写ram中。这是应该的。
当然,作为程序员,您有责任处理向量表、引导程序、链接以及编写程序执行操作。
cortex-m引导方案非常典型,最常见的两个是在某个地址运行或具有地址向量表,其中处理程序处于其中。全尺寸的arms都是从这个地址运行的,而cortex-m是一组地址,一个向量表。
当你阅读nxp或atmel samd等其他cortex-ms实现时,你会发现它们都将你的flash放在启动空间中,但可能以不同的方式进行。有些工厂有引导装载程序可以通过各种方式调用,核心并没有神奇地改变,它只是将工厂引导加载程序映射到cortex-m的零地址空间中。
所有这些都记录在arm和st和nxp和atmel及其他文档中。
编辑

系统内存用于存储数据、读写项目、变量、数据结构等可变内容。如果您选择不使用已经内置的引导加载程序,那么您可以选择编写自己的引导加载程序作为应用程序的一部分。作为引导加载程序,您需要将新程序下载到RAM中,但这并不意味着您必须从那里运行它(尽管“哈佛”这个词被提及),更有可能的是,您只是将其用作烧录到闪存的缓冲区。微控制器的典型目的是运行闪存上的固件,并使用SRAM来存储任何可能发生变化的读/写数据,如时钟收音机、烤面包机、遥控器等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接