如何为STM23F107 ARM微控制器实现IAP(在应用程序编程中)?

时间:2016-01-04 11:42:15

标签: arm bootloader stm32

我想设计一块带有STM32F107(或其他STM32F微控制器)的电路板,具有 SD卡 USB IAP 功能,以及串行闪存(如AT45DB161)

  • 在下面的段落中,我将尝试描述我的解决方案。 如果我错了,请纠正我。

据我所知(STM32F107 datasheet,第2.3.8节),STM32F107可以从系统内存 SRAM 用户闪存启动strong>基于BOOT松树设置(BOOT0和BOOT1 [PB7])。

根据“ STM32微控制器系统存储器启动模式”文档(图{15,STM32 Application note AN2606),STM32的ROM引导加载程序检查USB,USART和CAN总线的信号可用性,然后继续......(当“BOOT1_BOOT0 = 01”时,系统内存启动模式被激活。)

因此,当我想使用USB端口(而不是USB记忆棒)对STM32进行编程时,我必须将引导引脚设置为“BOOT1_BOOT0 = 01”并将USB编程器连接到电路板上......(此操作是一种ISP-in系统编程方法, 不是吗?

但是,为了能够从USB记忆棒或SD卡对我的STM32进行编程,我认为STM32必须首先从用户闪存(自定义引导程序)启动,检查一个标志(例如,闪存中的一个字节),以查看是否应检查磁盘文件系统(USB记忆棒或SD卡)或串行闪存以获取新版本的固件。

  • 如果,它将再次检查新固件是否将升级自定义引导加载程序应用程序: (1)如果目标是自定义引导加载程序,它必须首先将引导加载程序复制到SRAM然后运行它;或(2)如果申请是目标,则必须开始升级过程。

  • 如果,则必须跳转到该应用程序。

我将不胜感激。

1 个答案:

答案 0 :(得分:0)

是的,您需要编写自己的引导程序,您可以使用任何gpio引脚(而不是引导引脚)作为引导程序的引脚引脚(以引导引脚绑定到st引导加载程序的方式)来告诉你的bootloader如何启动或在哪里寻找东西。然后根据该决定,您的引导加载程序要么从用户闪存中的某个位置引导应用程序,要么访问某些连接的介质,或者进入等待主机通过某个接口下载的模式。

是否必须将数据复制到sram然后刻录到闪存取决于闪存接口设计,可能会有一个页面大小的缓冲区,您只需写入。您的实现很可能希望将sram用作存储和转发,例如,使用sram从外部设备提取数据,以便以该设备的大小为单位存储数据。然后使用闪存外设所需的单位写入闪存。

引导引脚决定是否使用用户闪存或使用ST引导加载程序闪存。 ST引导加载程序监听一个或多个接口(usb,uart,spi,i2c,无论它们支持什么),作为某个主设备的从设备,然后可以对用户闪存进行编程。只要您的电路板设计需要引导引脚并且接口保持可用,此选项始终存在,但要编程的数据的移动由外部主机完成,从该数据实际编程闪存由引导程序完成。您也可以在引导加载程序中自行实现其中一个。

你可以为你自己的bootloader使用带子,gpio引脚,或者确定你可以在闪存中有一些驱动启动过程的数据,这类似于计算机启动或uboot工作的方式,比如在运行linux的计算机上你有一个配置在非易失性存储(例如硬盘)中的grub驱动默认启动,一旦启动,可以更改非易失性存储。 u-boot有些闪存包含系统环境变量,其中一些是引导参数,一旦启动,或者如果你在控制台上的u-boot中停止,你可以为下次启动更改这些启动参数。 gpio带子就像st的引导加载程序的引导引脚,你可以根据不同选项的需要定义尽可能多的引脚,将它们绑定/短接高或低以选择与所需引导相匹配的组合,以更改引导选项而不是闪烁你改变皮带的东西。例如,您可以在SD卡插槽上进行某种存在检测(如果存在),然后从其他地方启动。在这种情况下,您不必实际将程序从SD卡写入闪存以运行它,如果您有足够的资源,您可以将其复制到RAM并从ram运行它。对于您选择的任何引导选项都是如此,您可以将它们刻录到闪存然后从那里运行,或者您可以只复制到ram,取决于程序的大小以及是否有办法在它们上使用它们另一个电源循环而不必从媒体上读取。

简而言之,只要你拥有足够的资源(接口和存储(易失性和非易失性)),你几乎可以随心所欲。不,这并不意味着你可以直接从SD卡执行,但它确实意味着你可以从SD卡中拉出程序然后执行,或从SD卡中拉出一部分,执行该程序,以叠加的方式拉出一些。