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

How to implement IAP (in application programming) for STM23F107 ARM microcontroller?

我想用 STM32F107(或其他 STM32F 微控制器)设计一块电路板,具有 IAP 来自 SD 卡USB,和一个串口闪存(比如AT45DB161)

据我所知(STM32F107 datasheet,第 2.3.8 节),STM32F107 可以从 系统内存SRAM、或 user flash 基于 BOOT pines 设置(BOOT0 和 BOOT1[PB7])。

根据“STM32微控制器系统内存启动模式”文档(STM32 Application note AN2606第55页,图15),STM32的ROM bootloader检查USB,USART,和 CAN 总线的信号可用性,并继续......(系统内存启动模式在 "BOOT1_BOOT0 = 01" 时激活)。

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

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

如有任何意见和建议,我将不胜感激。

是的,您需要编写自己的引导加载程序,您可以使用任何 gpio 引脚(不是引导引脚)作为您的引导加载程序的绑定引脚(就像引导引脚绑定到 st 引导加载程序一样)告诉您的引导加载程序如何引导或在哪里寻找东西。然后根据该决定,您的引导加载程序要么从用户闪存中的某处引导应用程序,要么访问某些附加媒体,或者进入等待主机通过某个接口下载的模式。

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

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

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

简而言之,只要你有足够的资源(接口和存储(volatile 和 non-volatile),你几乎可以做任何你想做的事。不,这并不意味着你可以直接从 sd 卡执行,但是这确实意味着您可以从 SD 卡中提取程序然后执行,或者从 SD 卡中提取程序的一部分,然后执行,以覆盖方式提取更多内容。