一个坏的引导加载程序会使微控制器变砖吗?

Can a bad bootloader brick a microcontroller?

我的问题是,如果我设法开发了某种引导加载程序并将其闪存(当您将引导加载程序放在 MCU 上时就叫它吗?),并且它工作得很糟糕,它会完全破坏 MCU 吗?它完全无法使用,永久?

我问的原因是我的任务是为 STM32F407 开发引导加载程序。问题是,我对引导加载程序或类似的东西一无所知,这意味着我有很多东西要学。 感谢您的回答,谢谢!

总的来说,绝对是,我有一堆变砖的微控制器,偶尔我会偷懒,然后又会出现另一个。

它非常适合您的微控制器和系列。例如,引脚数非常重要,如果您的微控制器在电路中(甚至在编程夹具中)依赖某些引脚并且这些引脚可以通过软件重新调整用途,那么尽可能多地降低成本。例如 jtag 引脚也可以是 gpio 引脚。并且您的代码出于某种原因将它们用作 gpio 引脚,并且芯片的设计使得当芯片处于复位状态时它们不能使用 jtag 接口,那么您可能会变砖。

另一个非常简单的是一般的 pll 或时钟。 If/as 你开发代码来初始化时钟系统(假设你选择这样做,即使你使用芯片供应商提供的代码)并且你有一个错误将芯片切换到你没有正确初始化的时钟或不存在,它可能会变砖。

现在一些芯片设计,很多,以各种方式帮助你。 AVR 系列通常有一种编程模式,在芯片处于复位状态或与复位相关时发生,因此闪存中的任何代码都不会影响其功能,当然,您的电路板设计可能很糟糕,但您的代码无法阻止它从工作。另一种方法是 "strap" 一个专用于启动功能的引脚(或多个引脚),将一种方式设置为正常引导,将其与另一种方式绑定,然后进入备用引导加载程序。这就是你在 stm32 boot0 和有时 boot1 上所拥有的。如果你用砖砌芯片(pll/clock 或将 SWD 引脚用作 gpio,从而弄乱了 SWD 引脚),那是你获得该芯片系列的免狱卡,你 "simply" 更改 boot0 并启动到已知可以工作的内部引导加载程序(AFAIK 你不能搞砸)。从该引导加载程序中,您可以使用 SWD(芯片现在未变砖)或引导加载程序本身(始终串行,有时支持 usb 或其他)。恩智浦类似的交易。 Atmel ARM 曾经有(确实有)SAM-BA 现在他们真的只支持 SWD,你可以得到一些 samba 代码并尝试将它锁定到闪存中,但是解锁和/或丢弃闪存太容易了,所以这是一个他们失败了。

作为系统设计的一部分,如果您没有内置这些​​功能之一来避免变砖功能(例如 STM32 上的 boot0),那么我建议您添加一个。很早的代码将一个专用的 gpio 引脚初始化为软件中的一个 strap,如果该 gpio 引脚以一种方式拉出,则进行正常启动,如果以另一种方式拉出,则在无限循环中旋转或跳转到其他保证不会有错误的代码。不能完全保证您不会错误地构建项目并丢弃此代码,但它至少可以让您开发自己的 bootloader/project 而不是在您处理可以使用的外围设备时堆满 parts/boards砖它。

请注意,让烟从部件中排出也是另一种方法,can/does 也会时不时发生。

关于如何启动 STM32 的大量示例,以及来自 ST 的各种代码,您也可以将其用作起点。 (所有这些都有不同的质量,一分钱一分货)。他们的文档很好,比一些竞争对手更好,引导和配置他们的外围设备一点也不困难,有时比尝试使用固定库更容易。 YMMV,你应该尝试各种解决方案。但是如果你是新手,很可能会变砖,幸运的是你有一个芯片,只要你的电路板设计打破了 boot0 引脚,你就不会变砖。对于 STM32 的原型板,我更喜欢有一个 boot0 按钮和一个重置按钮,只需重置重置芯片并运行,按住 boot0 并按下重置按钮,它就会进入引导加载程序。两者都必须根据此任务的需要通过正确的上拉或下拉正确连接。或者跳线可以直接将 boot0 连接到高电平或低电平,然后弹出复位,这会花费您更多时间,但可以工作。

简而言之,您不能用引导加载程序来构建微控制器。 最后引导加载程序只是一个固件,可以通过 SWD 使用编程器擦除 擦除闪存,您的控制器就和新的一样好

是的,您可以将微控制器设置为永不恢复的状态。我做到了这一点,我在 STM32F427 中做到了。

引导加载程序就是仔细选择时钟、外设和中断优先级。如果这样做,控制器变砖的机会就会减少。在发布代码之前还要测试所有内容,因为一些公司想要保存要保存的专有信息,所以他们炸毁了 JTAG 线,唯一的编程方式是通过引导加载程序,如果它不完美,瞧,你只是把控制器弄坏了。