我可以为stm32f051创建自定义Bootloader吗?

时间:2016-07-05 17:26:28

标签: microcontroller bootloader stm32

我是这个bootloader的新手。我使用SWD编程stm3205。那么当我编程stm32f05微控制器时,我的程序在哪个位置。我可以创建自己的Bootloader并将其替换为st的默认引导程序。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

我不同意难以理解这个词。引导加载程序是一个相当简单的编写程序,比大多数单片机应用程序简单得多。

逻辑使用boot0和另一条带来确定是否引导内部st引导加载程序或引导应用程序。这也在参考手册中有记录。我搜索了boot0并在第二章中直接进入了它。如果你的芯片没有boot1引脚,请不要感到惊讶。从启动模式表开始,boot0决定从rom / flash中的st bootloader或flash中的应用程序启动。

我不打算为你重新阅读整篇文档。但是内存映射显示闪存位于0x08000000,这是程序启动的位置。作为皮质m(参见手臂建筑参考材料,可能有st版本或绝对手臂供应,也是技术参考手册)。 cortex-m使用地址的向量表,所以如果/当你正确地构建程序时,它将从堆栈指针的预加载开始,然后是复位向量的地址(lsbit设置为指示拇指模式,但如果你做所有这个权利的工具链将照顾那个理想情况下在0x08000000 +偏移区域。当boot0绑定到地(零)时,它从主闪存引导,基本上0x08000000被映射到核心处理器的地址零。但是你的向量表基本上会跳转到主闪存执行。

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

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

接下来学习对闪存进行编程,理想情况下不要擦除正在运行的空间。擦除其中一个块,用一些东西写下来然后读回去看你写的。我曾经做过printfs并处理一个库来做这个工作,不好主意。我有一个非常小的10行,也许15行打印出uart中的十六进制数字,十多年就足以进行调试了。"看到"这些东西。注意我做裸露的金属和引导程序以及在工作中生活所需的任何东西以及家里的乐趣。处理来自该设备上的程序的闪存并不困难,闪存章节涵盖了高级流程并且再次并不困难。如果搞砸了,你总是让boot0引脚和st引导程序重新开启(当然除非你让芯片冒烟)。

现在你必须决定你想要你的引导加载程序做什么,它总是会在那里,等等。你想像一个人一样使用带式引脚吗?在不同于这个芯片的芯片上,你想要使用自己的表带,然后在弄清楚会破坏芯片的东西,就像你学习如何编程时钟/ pll一样。我已经让很多董事会过于自信而忘记了我没有像这样的引导程序那样的后备,而且游戏芯片上砖了,买了一个新的。无论如何,常见的事情是等待几秒钟进行击键,否则启动应用程序。或者如果设置单向启动应用程序,则使用带子,将另一个设置为引导加载程序并等待命令。后者更快地启动应用程序,前者不需要移动任何跳线或按住按钮等等。

接下来你想在哪里保留引导加载程序?您必须将向量表放在正确的位置以供处理器启动,但这并不意味着您的引导加载程序必须立即执行。这部分系列具有高达256K字节的闪存。例如,您可以将引导加载程序放在接近0x08000000的下端附近,如果您的设计是使用应用程序并将引导加载程序保留在芯片上,那么您需要将应用程序设计为位于闪存更深处的不同地址。可能是基于闪存的引导加载程序的最佳解决方案。如果你对覆盆子pi说,从我们的角度来看,我们的程序会被加载到ram中。你可能想要一个分支到内存深处的引导加载程序,为被测试的应用程序留下较低的地址空间,这样当你决定测试中的应用程序准备就绪时,你不必在将其提交到SD卡时更改链接器脚本。但是这个芯片不是那样的,你想要你的引导加载程序和你的应用程序,如果你选择同时在闪存上同时使用引导加载程序和应用程序更深入闪存。

这样的部件有一个绑定的引导加载程序,易于连接,即使你可以擦除它,作为一个你不想要的初学者,你想要引导程序作为你的后备当你搞砸了你将。我不认为你可以删除它,至少ST声明它是为他们保留的任何意思:

  

系统内存:用于在系统内存启动模式下启动设备。该   区域保留供STMicroelectronics使用,并包含引导   用于重新编程Flash存储器的加载器   选定的通讯界面。它是由ST编程的   制造器件,并防止虚假写入/擦除   操作。有关详细信息,请参阅AN2606。

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

答案 2 :(得分:0)

  

当我编程stm32f05微控制器时,我的程序在哪个位置?

进入部分闪存。

  

我可以创建自己的Bootloader并将其替换为st的默认引导程序。

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

相关问题