我可以为 stm32f051 制作自定义引导加载程序吗

Can I make a custom Bootloader for stm32f051

我是这个引导加载程序的新手。我使用 SWD 对 stm3205 进行编程。那么当我对 stm32f05 微控制器进行编程时,我的程序在哪个位置。我可以制作自己的 Bootloader 并用 st 的默认 bootloader 替换它吗?

您不需要更换 STM 引导加载程序。您编写一个引导加载程序,将其放置在第一个闪存页面(或多个页面)中。您可以使用内置加载程序、ST-Link、JTAG 等加载它。此引导加载程序然后可以根据需要将主应用程序加载到其他闪存页面中。例如,这可以通过串行来完成。引导加载程序将始终是启动的第一位代码,然后将跳转到主应用程序。

网上有很多东西。看看这个,尤其是图表:http://embeddedsystemforu.blogspot.co.uk/p/microcontroller-bootloader-generally.html

我不同意困难这个词。引导加载程序是一个编写起来相当简单的程序,比大多数微控制器应用程序简单得多。

该逻辑使用 boot0 和可能的另一个 strap 来确定是引导内部 st 引导加载程序还是引导应用程序。这也记录在参考手册中。我搜索了 boot0,并在第二章中直接找到了它。如果您的芯片没有 boot1 引脚,请不要感到惊讶。从引导模式 table 基本上,boot0 决定从 rom/flash 中的 st 引导加载程序或闪存中的应用程序引导。

我不会为您重新阅读整个文档。但是内存映射显示 0x08000000 处的闪存,这是您的程序将开始的地方。作为一个 cortex-m(参见 arm architectural reference materials 可能有一个版本或者肯定是 arm 供应,还有技术参考手册)。 cortex-m 使用地址向量 table,所以 if/when 你正确地构建了你的程序,它将从堆栈指针的预加载开始,然后是你的重置向量的地址(lsbit 设置为指示拇指模式,但如果你做对了所有这些,工具链会处理它)理想情况下,它位于 0x08000000+ 偏移区域。 boot0 接地(零),它从主闪存启动,基本上 0x08000000 映射到核心处理器的地址零。但是你的向量 table 基本上让它跳转到主闪存执行。

关于启动模式的同一部分显示系统内存,其中 boot0 为 1(高电平),st 引导加载程序位于系统内存中,以及用于串行加载的 usart 引脚。其他一些 st 文档描述了串行加​​载程序,这是一个相当简单的程序,可以在主机上编写以与此加载程序接口,以将 and/or 下载程序擦除到主闪存中。毫无疑问,那里有无数已经编写好的程序。但是根据您设计引导加载程序的方式,您可能需要一个主机程序来实现协议的那一侧。无论哪种方式,连接 st 引导加载程序都是一个下午的项目,并且是完成此类工作的一项好技能。

你当然要弄清楚如何启用外设,如uart和gpio。从闪烁一个 LED 开始,然后使用它来学习如何使用定时器来确定当你的程序处于控制状态时真正使用的时钟是个好主意,这样你就可以正确设置 UART 并获得它 运行。最好首先允许程序下载到 ram,然后分支到它们并覆盖引导加载程序任务的那一半,然后处理将内容写入闪存任务。最好至少将 uart 用作您的第一个引导加载程序用户界面。常用的哑终端程序可以使用 xmodem 并且 can/should 也能够转储原始文件。因此,对于我的引导加载程序,我曾经做过 xmodem,它是一种快速而肮脏的状态 machine 是几十行代码。但我现在要么使用 intel hex 要么使用更好的 motorola srecord,我喜欢每行有完整 32 位地址的 srecord,这是迄今为止最简单的。与 xmodem 一样,只需要几十行代码来处理传入的文本流(intel hex 或 srecord,如果您选择其中之一)解析它并将传入的内容写入 ram 的正确地址。然后您可以让哑终端为您传输文件,您不必编写任何主机代码。

接下来学习对闪存编程,最好不要擦除你所在 运行 的 space。擦除其中一个块,用一些东西写入它,然后读回看你写的是什么它。我曾经做过 printfs 并与图书馆打交道来完成这项工作,这是个坏主意。我有非常小的 10 行,可能有 15 行从 uart 中打印出十六进制数字,十多年来足以用于调试和 "seeing" 这类事情。请注意,我做的是裸机和引导加载程序,以及工作生活和家庭娱乐所需的一切。在这个设备上处理程序中的闪存并不困难,闪存章节涵盖了高级流程,这也不难。如果你搞砸了,你总是有 boot0 引脚和 st 引导加载程序可以退回(当然除非你让芯片冒烟)。

现在您必须决定您希望引导加载程序做什么,它是否会一直存在等等。您是否想像 st 人一样使用带针?在与这个芯片不同的芯片上,你肯定想在弄乱会变砖的东西之前使用你自己的表带,就像你学习如何编程 clocks/pll 一样。我已经把很多板子弄砖了,因为我太自信了,忘记了我没有像这块上的引导加载程序那样的后备,游戏结束时芯片变砖了,买一个新的。无论如何,常见的事情是等待几秒钟以等待击键,否则会启动应用程序。或者,如果设置一种方式启动应用程序,则使用带子,将另一种方式设置为进入引导加载程序并等待命令。后者启动应用程序更快,前者不需要移动任何跳线或按住按钮等。

接下来你想把引导加载程序放在哪里?您必须将矢量 table 放在处理器启动的正确位置,但这并不意味着您的引导加载程序必须紧随其后。该器件系列具有高达 256Kbytes 的闪存。例如,您可以让您的引导加载程序接近 0x08000000 附近的低端,如果您的设计是拥有应用程序并将引导加载程序保留在芯片上,那么您需要将应用程序设计为位于闪存中更深的不同地址。可能是基于闪存的引导加载程序的最佳解决方案。如果你在 raspberry pi 上说,从我们的角度来看,我们的程序已加载到 ram 中。你可能想要一个分支到内存深处的引导加载程序,为被测应用程序留下较低的地址space,这样当你决定被测应用程序准备好时,你不必在提交时更改链接描述文件SD 卡。但是这个芯片不是那样的,如果你选择同时在闪存上同时拥有引导加载程序和应用程序,那么你首先需要你的引导加载程序和你的应用程序才能更深入闪存。

像这样的部件有一个绑定的引导加载程序,它很容易连接,即使你可以擦除它,作为初学者你不想,当你搞砸时,你希望那个引导加载程序作为你的后备你会。我不认为你可以删除它,至少 ST 声明它是为他们保留的,不管这意味着什么:

System memory: used to boot the device in System memory boot mode. The area is reserved for use by STMicroelectronics and contains the boot loader which is used to reprogram the Flash memory through the selected communication interface. It is programmed by ST when the device is manufactured, and protected against spurious write/erase operations. For further details, please refer to AN2606.

如果您不想了解其工作原理,您绝对可以使用其中一个 ST 库。我建议同时尝试这两种方法,我发现使用这些库并不容易得多,但有些人发现这些库更容易,这取决于你的决定。归根结底,你必须拥有你的程序并维护它,所以你要么拥有你的代码,要么拥有你的代码和他们所有代码的组合,这是你的责任。一旦你对每个组件有了一些 minutes/hours 经验,这些芯片就很容易编程(同样,有时使用库需要很长时间,有时不需要很长时间)。基本上尝试两条路径,或者对于 st 可能有不止一个库路径。当然,这些 cmsis 东西试图让生活更轻松(通过让整体生活更艰难或更慢或其他)。即使您选择了一条路径,也要经常尝试另一条路径,看看体验是否有所改变。供应商基本上必须不断更改库,每隔一段时间就完成一次,所以不要指望长期支持你学到的一组 api,这不是 windows 也不是 linux 也不是 mac。他们这样做的原因有很多,因此您应该在新方法出现时尝试新方法,并直接与外围设备对话。请记住,当代码失败或生产不得不停止或发生召回时,老板不会关心谁编写了您负责的代码。您拥有该代码并对其负责,即使您没有编写它,因此请检查您借用的任何代码并决定您要对其中的多少负责。它可能会为您节省一天、一周或一个月的开发时间,但一年后您就会失去工作,难道不值得深入研究吗?

In which location does my program goes when i program stm32f05 microcontroller?

进入零件的闪存。

Can i make my own Bootloader and replace it with st's default bootloader.

没有。 ST 引导加载程序嵌入在器件的 ROM 中,不能被覆盖。然而,正如其他人所提到的,您可能(尽管很困难)开发一个单独的引导加载程序并将其放在闪存中。