AN2606STM32F105xx和STM32F107xx器件自举程序图 2.STM32F105XX和STM32F107xX器件的自举程序选择系统复位V系统初始化(时钟、GPIOs、IWDG、SysTick)?配置USB→检测到USB电缆禁止所有中断源USART_1上接收到0x7FR配置USART1禁止所有中断源-+对USART1执行USART2BL USARTLoop配置USART2上接收到0x7F智对USART2执行BL USARTLOOpCAN2_RXHSE=8MHZ、引脚检测到顿14.7456MHz或25MHzEHSE=8MHZ、将系统时钟和USB140.7456MHz或时钟都重新配置为25 MHz48MHz生成系统复位禁止所有中断源使用USB中断执行+DFU自举程序配置CAN+对CAN2执行BLCAN_LoopMS31603V1文档ID13801第16版21/119
文档 ID 13801 第 16 版 21/119 AN2606 STM32F105xx 和 STM32F107xx 器件自举程序 118 图 2. STM32F105xx 和 STM32F107xx 器件的自举程序选择 069 ㋏㒳ԡ ㋏㒳߱ྟ࣪ᯊ˄䩳ǃ *3,2Vǃ,:'*ǃ6\V7LFN˅ +6( 0+]ǃ 0+] 0+] 86$57B Ϟᬊࠄ(] 86$57B Ϟᬊࠄ (]䜡㕂86$57 ᇍ86$57ᠻ㸠 %/B86$57B/RRS 䜡㕂86$57 ᇍ86$57ᠻ㸠 %/B86$57B/RRS ᇚ㋏㒳ᯊ䩳86% ᯊ䩳䛑䞡ᮄ䜡㕂Ў 0+] Փ⫼86%Ёᮁᠻ㸠 ')8㞾Вᑣ ৺ ৺ ᰃ ᰃ ⽕ℶ᠔᳝Ёᮁ⑤ ᰃ ⽕ℶ᠔᳝Ёᮁ⑤ ᰃ Ẕ⌟ࠄ86% ⬉㓚 䜡㕂86% &$1B5; ᏻࠄ⌟ᓩ㛮Ẕ ৺ ৺ +6( 0+]ǃ 0+] 0+] ᇍ&$1ᠻ㸠 %/B&$1B/RRS ⫳៤㋏㒳ԡ ৺ ᰃ 䜡㕂&$1 ৺ ⽕ℶ᠔᳝Ёᮁ⑤
STM32F105xx和STM32F107xX器件自举程序AN26065.4自举程序版本下表列出了STM32F105xx和STM32F107xx器件的自举程序版本和所有版本之间的变化。表7.STM32F105xX和STM32F107xX自举程序版本说明自举程序版本号V1.0初始自举程序版本。更新自举程序检测机制,以修正检测阶段期间此自举程序未用外设的GPIO-连接到低电平或悬空的问题。有关详细信息,请参见第5.4.2节。向量表设置为0x1FFFB000而不是0x00000000V2.0更新Go命令(针对所有自举程序):USART1、USART2、CAN2、GPIOA、GPIOB、GPIOD和SysTick外设寄存器设置为默认复位值DFU自举程序:执行LeaveDFU命令前将USB中断挂起清零DFU子协议版本由V1.0变为V1.2自举程序版本更新为V2.0-修正第5.4.4节中所述的PA9过大功耗问题。-更正Get-Version命令(如AN3155中定义)。该命令将返回Ox22,而不V2.1是自举程序V2.0中的0x20。更多详细信息,请参见第5.4.3节。自举程序版本更新为V2.1-修正DFU选项字节描述符(由于可读/写但不可擦除,因此设置为“e”而不是“g”)。V2.2修正用于Flash读/写/擦除操作的DFU轮询时序。-提高DFU自举程序接口的耐用性。自举程序版本更新为V2.2。5.4.1如何识别STM32F105xx/107xX自举程序版本自举程序V1.0用于日期代码小于937的器件(有关如何查找器件标记上的日期代码,请参见STM32F105xX和STM32F107xX数据手册)。自举程序V2.0和V2.1用于日期代码大于或等于937的器件。自举程序版本有两种区分方法?使用USART自举程序时,V2.1版本中更正了AN2606和AN3155中定义的Get-Version命令。该命令将返回0x22,而不是自举程序V2.0中的0x20。自举程序代码开始位置的向量表中的值有所不同。对于自举程序V2.0、V2.1和V2.2,e用户软件(或通过JTAG/SWD)在地址0x1FFFB004处读取的分别是0x1FFFE945、0x1FFFE9A1和0x1FFFE9C1。DFU版本如下:?自举程序V2.1中为V2.1版自举程序V2.2中为V2.2版可从DFU器件描述符的bcdDevice字段中读取该版本。A22/119文档ID13801第16版
STM32F105xx 和 STM32F107xx 器件自举程序 AN2606 22/119 文档 ID 13801 第 16 版 5.4 自举程序版本 下表列出了 STM32F105xx 和 STM32F107xx 器件的自举程序版本和所有版本之间的变化。 表 7. STM32F105xx 和 STM32F107xx 自举程序版本 5.4.1 如何识别 STM32F105xx/107xx 自举程序版本 自举程序 V1.0 用于日期代码小于 937 的器件(有关如何查找器件标记上的日期代码,请参 见 STM32F105xx 和 STM32F107xx 数据手册)。自举程序 V2.0 和 V2.1 用于日期代码大于 或等于 937 的器件。 自举程序版本有两种区分方法: ● 使用 USART 自举程序时,V2.1 版本中更正了 AN2606 和 AN3155 中定义的 Get-Version 命令。该命令将返回 0x22,而不是自举程序 V2.0 中的 0x20。 ● 自举程序代码开始位置的向量表中的值有所不同。对于自举程序 V2.0、V2.1 和 V2.2, 用户软件(或通过 JTAG/SWD)在地址 0x1FFFB004 处读取的分别是 0x1FFFE945、 0x1FFFE9A1 和 0x1FFFE9C1。 ● DFU 版本如下: — 自举程序 V2.1 中为 V2.1 版 — 自举程序 V2.2 中为 V2.2 版 可从 DFU 器件描述符的 bcdDevice 字段中读取该版本。 自举程序版本号 说明 V1.0 初始自举程序版本。 V2.0 — 更新自举程序检测机制,以修正检测阶段期间此自举程序未用外设的 GPIO 连接到低电平或悬空的问题。 有关详细信息,请参见第 5.4.2 节。 — 向量表设置为 0x1FFF B000 而不是 0x0000 0000 — 更新 Go 命令(针对所有自举程序):USART1、USART2、CAN2、GPIOA、 GPIOB、 GPIOD 和 SysTick 外设寄存器设置为默认复位值 — DFU 自举程序:执行 Leave DFU 命令前将 USB 中断挂起清零 — DFU 子协议版本由 V1.0 变为 V1.2 — 自举程序版本更新为 V2.0 V2.1 — 修正第 5.4.4 节 中所述的 PA9 过大功耗问题。 — 更正 Get-Version 命令(如 AN3155 中定义)。该命令将返回 0x22,而不 是自举程序 V2.0 中的 0x20。更多详细信息,请参见第 5.4.3 节。 — 自举程序版本更新为 V2.1 V2.2 — 修正 DFU 选项字节描述符(由于可读 / 写但不可擦除,因此设置为“e”而 不是“g”)。 — 修正用于 Flash 读/写/擦除操作的 DFU 轮询时序。 — 提高 DFU 自举程序接口的耐用性。 — 自举程序版本更新为 V2.2
AN2606STM32F105xx和STM32F107xX器件自举程序5.4.2日期代码小于937的STM32F105xx/STM32F107xX器件上自举程序不可用说明激活自举程序阶段,如果USART1_RX(PA10)、USART2_RX(PD6,重映射)、CAN2_RX(PB5,重映射),OTGFSDM(PA11)和/或OTGFSDP(PA12)引脚保持低电平或悬空,则自举程序不可用。自举程序无法通过CAN2(重映射)、DFU(器件模式OTGFS)、USART1或USART2(重映射)进行连接。在64引脚封装中,USART2_RX信号重映射引脚PD6不可用,而是在内部接地。这种情况下,自举程序完全不可用。解决方案·对于64引脚封装。无。自举程序不可用。对于100引脚封装。?根据所用外设的不同,必须按照下述要求在激活自举程序阶段使未使用的外设引脚保持高电平:如果使用USART1连接自举程序,则PD6和PB5必须保持高电平。如果使用USART2连接自举程序,则PA10、PB5、PA11和PA12必须保持高电平。如果使用CAN2连接自举程序,则PA10、PD6、PA11和PA12必须保持高电平。如果使用DFU连接自举程序,则PA10、PB5和PD6必须保持高电平。注:此限制仅适用于日期代码小于937的STM32F105xX和STM32F107xX器件。日期代码大于或等于937的STM32F105xX和STM32F107xX器件并不受此影响。有关如何查找器件标记上的日期代码,请参见STM32F105xX和STM32F107xX数据手册。5.4.3USART自举程序Get-Version命令返回0x20而不是0x22说明在USART模式下,Get-Version命令(如AN3155中定义)返回Ox20而不是0x22。此限制存在于自举程序版本V1.0和V2.0中,自举程序版本2.1对此进行了修正。解决方案无。5.4.4自举程序V2.0中插入USB电缆时PA9功耗过大说明从系统存储器模式自举后连接USB电缆时,PA9引脚(连接VBUS=5V)同时与配置为复用推挽的USARTTX引脚共用,由于尚未对USART外设提供时钟,因此该引脚强制设置为O。因而流经PA91/O的漏电流超出25mA,可能影响1/O板的可靠性。自举程序版本2.1对此限制进行了修正,实现方法为:在RX引脚接收到正确的0x7F且对USART提供时钟时,将PA9配置为复用功能推挽。否则将PA9配置为复用输入悬空。解决方案无。S文档ID13801第16版23/119
文档 ID 13801 第 16 版 23/119 AN2606 STM32F105xx 和 STM32F107xx 器件自举程序 118 5.4.2 日期代码小于 937 的 STM32F105xx/STM32F107xx 器件上自举程序不可用 说明 激活自举程序阶段,如果 USART1_RX (PA10)、USART2_RX(PD6,重映射)、CAN2_Rx (PB5,重映射)、OTG_FS_DM (PA11) 和 / 或 OTG_FS_DP (PA12) 引脚保持低电平或悬 空,则自举程序不可用。 自举程序无法通过 CAN2(重映射)、DFU(器件模式 OTG FS)、USART1 或 USART2 (重映射)进行连接。 在 64 引脚封装中,USART2_RX 信号重映射引脚 PD6 不可用,而是在内部接地。这种情况 下,自举程序完全不可用。 解决方案 ● 对于 64 引脚封装。 无。自举程序不可用。 ● 对于 100 引脚封装。 根据所用外设的不同,必须按照下述要求在激活自举程序阶段使未使用的外设引脚保持 高电平: — 如果使用 USART1 连接自举程序,则 PD6 和 PB5 必须保持高电平。 — 如果使用 USART2 连接自举程序,则 PA10、PB5、PA11 和 PA12 必须保持高电平。 — 如果使用 CAN2 连接自举程序,则 PA10、PD6、PA11 和 PA12 必须保持高电平。 — 如果使用 DFU 连接自举程序,则 PA10、PB5 和 PD6 必须保持高电平。 注: 此限制仅适用于日期代码小于 937 的 STM32F105xx 和 STM32F107xx 器件。日期代码大于 或等于 937 的 STM32F105xx 和 STM32F107xx 器件并不受此影响。有关如何查找器件标记 上的日期代码,请参见 STM32F105xx 和 STM32F107xx 数据手册。 5.4.3 USART 自举程序 Get-Version 命令返回 0x20 而不是 0x22 说明 在 USART 模式下,Get-Version 命令(如 AN3155 中定义)返回 0x20 而不是 0x22。 此限制存在于自举程序版本 V1.0 和 V2.0 中,自举程序版本 2.1 对此进行了修正。 解决方案 无。 5.4.4 自举程序 V2.0 中插入 USB 电缆时 PA9 功耗过大 说明 从系统存储器模式自举后连接 USB 电缆时,PA9 引脚(连接 VBUS=5 V)同时与配置为复用 推挽的 USART TX 引脚共用,由于尚未对 USART 外设提供时钟,因此该引脚强制设置为 0。 因而流经 PA9 I/O 的漏电流超出 25 mA,可能影响 I/O 板的可靠性。 自举程序版本 2.1 对此限制进行了修正,实现方法为:在 RX 引脚接收到正确的 0x7F 且对 USART 提供时钟时,将 PA9 配置为复用功能推挽。否则将 PA9 配置为复用输入悬空。 解决方案 无
STM32F101xx和STM32F103xX超大容量器件自举程序AN26066STM32F101xX和STM32F103xX超大容量器件自举程序本部分使用STM32F10xxx超大容量指代超大容量的STM32F101xx和STM32F103xx器件。6.1双存储区自举功能对于STM32F101xx和STM32F103xx超大容量器件(这些器件具有两个Flash存储区:存储区1和存储区2),可使用允许从存储区1或存储区2进行自举的附加自举机制(取决于BFB2位的状态(Ox1FFFF800处用户选项字节的位19))。当BFB2位复位且将自举引脚配置为从FlaSh自举(BOOTO=O且BOOT1=x)时,复1.位后,器件从系统存储器自举,并执行实施双存储区自举模式的嵌入式自举程序代码:首先检查存储区2中的代码。如果其中包含有效代码(请参见下方注:),则跳转a)到存储区2中的应用程序并退出自举程序。b)如果存储区2中的代码无效,则检查存储区1中的代码。如果代码有效(请参见下方“注释”),则跳转到存储区1中的应用程序。如果存储区2和存储区1均不包含有效代码(请参见下方“注释”),则按照以下c)部分所述方式正常执行自举程序操作(不跳转到Flash存储区)。更多详细信息,请参见图3:STM32F10xXX超大容量器件的自举程序选择。2.BFB2位置1时(默认状态),不执行双存储区自举机制。注:当第一个数据(位于存储区起始地址处,应为堆栈指针)指向内部SRAM存储器的有效地址时(栈顶地址),该代码视为有效。如果第一个地址指向其它任何位置(内部SRAM以外),该代码则视为无效。http://www.st.com网站提供的STM32F10x标准外设库中介绍了双存储区自举模式示例(FLASHIDual_Boot)。对于STM32F101xx和STM32F103xx超大容量器件,可选择Flash、系统存储器或SRAM作为自举空间,如以下表8所示。表8.自举引脚和BFB2位配置自举模式选择引脚BFB2自举模式别名使用位BOOT1BOOTOx0用户Flash选择用户Flash作为自举空间101系统存储器选择系统存储器作为自举空间11嵌入式SRAM选择嵌入式SRAM作为自举空间选择系统存储器作为自举空间,然后执行双存X0系统存储器储区机制0选择系统存储器作为自举空间,然后执行双存01系统存储器储区机制11嵌入式SRAM选择嵌入式SRAM作为自举空间A24/119文档ID13801第16版
STM32F101xx 和 STM32F103xx 超大容量器件自举程序 AN2606 24/119 文档 ID 13801 第 16 版 6 STM32F101xx 和 STM32F103xx 超大容量器件自举程序 本部分使用 STM32F10xxx 超大容量指代超大容量的 STM32F101xx 和 STM32F103xx 器件。 6.1 双存储区自举功能 对于 STM32F101xx 和 STM32F103xx 超大容量器件(这些器件具有两个 Flash 存储区:存 储区 1 和存储区 2),可使用允许从存储区 1 或存储区 2 进行自举的附加自举机制(取决于 BFB2 位的状态(0x1FFFF800 处用户选项字节的位 19))。 1. 当 BFB2 位复位且将自举引脚配置为从 Flash 自举(BOOT0 = 0 且 BOOT1 = x)时,复 位后,器件从系统存储器自举,并执行实施双存储区自举模式的嵌入式自举程序代码: a) 首先检查存储区 2 中的代码。如果其中包含有效代码(请参见下方注:),则跳转 到存储区 2 中的应用程序并退出自举程序。 b) 如果存储区 2 中的代码无效,则检查存储区 1 中的代码。如果代码有效(请参见下 方“注释”),则跳转到存储区 1 中的应用程序。 c) 如果存储区 2 和存储区 1 均不包含有效代码(请参见下方“注释”),则按照以下 部分所述方式正常执行自举程序操作(不跳转到 Flash 存储区)。更多详细信息, 请参见图 3:STM32F10xxx 超大容量器件的自举程序选择。 2. BFB2 位置 1 时(默认状态),不执行双存储区自举机制。 注: 当第一个数据(位于存储区起始地址处,应为堆栈指针)指向内部 SRAM 存储器的有效地址 时(栈顶地址),该代码视为有效。如果第一个地址指向其它任何位置(内部 SRAM 以外), 该代码则视为无效。 http://www.st.com 网站提供的 STM32F10x 标准外设库中介绍了双存储区自举模式示例 (FLASH\Dual_Boot)。 对于 STM32F101xx 和 STM32F103xx 超大容量器件,可选择 Flash、系统存储器或 SRAM 作为自举空间,如以下表 8 所示。 表 8. 自举引脚和 BFB2 位配置 BFB2 位 自举模式选择引脚 自举模式 别名使用 BOOT1 BOOT0 1 X 0 用户 Flash 选择用户 Flash 作为自举空间 0 1 系统存储器 选择系统存储器作为自举空间 1 1 嵌入式 SRAM 选择嵌入式 SRAM 作为自举空间 0 X 0 系统存储器 选择系统存储器作为自举空间,然后执行双存 储区机制 0 1 系统存储器 选择系统存储器作为自举空间,然后执行双存 储区机制 1 1 嵌入式 SRAM 选择嵌入式 SRAM 作为自举空间
AN2606STM32F101xx和STM32F103xx超大容量器件自举程序表8显示了超大容量器件进入系统存储器自举模式的两种情况:如果BOOT引脚配置如下:BOOTO=1且BOOT1=01.或者如果:2.BFB2位复位且a)b)自举引脚配置如下:BOOTO=O且BOOT1=X注:满足下述a、b和c三个条件时,相当于将自举引脚配置为系统存储器自举模式(BOOTO=1且BOOT1=0)。此时将执行正常的自举程序操作。BFB2位复位a)两个存储区均不包含有效代码b)自举引脚配置如下:BOOTO=0且BOOT1=Xc)当BFB2位清零,且存储区2和/或存储区1包含有效用户应用程序代码时,始终执行双存储区自举模式(自举程序始终跳转到用户代码,而不会继续执行正常操作)。因此,如果已将BFB2位清零(从存储区2自举),则要执行自举程序代码时必须:将地址0x08080000(存储区2的基址)和0x08000000(存储区1的基址)编程为Ox0,或者将BFB2位置1,使BOOTO=1且BOOT1=0。6.2自举程序配置STM32F10xxX超大容量器件嵌入式自举程序支持两种串行接口:USART1和USART2。下表介绍了系统存储器自举模式下,自举程序需要使用的STM32F10OxXX超大容量器件硬件资源。表9.系统存储器自举模式下STM32F10xxX超大容量器件的配置自举程序功能/外设状态备注时钟源HSI使能使用PLL作为系统时钟,频率为24MHz。RAM-自地址0x20000000起的2KB空间供自举程序固件使用。适用于所有系统存储器自地址0x1FFFE000起的6KB空间包含自举程序固件。-自举程序独立看门狗(IWDG)预分频器配置为最大值,并定期进行IWDG刷新以防止看门狗复位(如果用户事先使能硬件IWDG选项)。初始化后,USART1的配置为:8位,偶校验位和1个停USART1使能止位。USART1输入PA10引脚:USART1用于接收。USART1_RX引脚自举程序USART1_TX引脚推挽输出PA9引脚:USART1用于发送。检测阶段期间,USART2_RX(PD6)引脚必须保持高电平或低电平。A25/119文档ID13801第16版
文档 ID 13801 第 16 版 25/119 AN2606 STM32F101xx 和 STM32F103xx 超大容量器件自举程序 118 表 8 显示了超大容量器件进入系统存储器自举模式的两种情况: 1. 如果 BOOT 引脚配置如下:BOOT0 = 1 且 BOOT1 = 0 2. 或者如果: a) BFB2 位复位且 b) 自举引脚配置如下:BOOT0 = 0 且 BOOT1 = x 注: 满足下述 a、b 和 c 三个条件时,相当于将自举引脚配置为系统存储器自举模式(BOOT0 = 1 且 BOOT1 = 0)。此时将执行正常的自举程序操作。 a) BFB2 位复位 b) 两个存储区均不包含有效代码 c) 自举引脚配置如下:BOOT0 = 0 且 BOOT1 = x 当 BFB2 位清零,且存储区 2 和/或存储区 1 包含有效用户应用程序代码时,始终执行双存储 区自举模式(自举程序始终跳转到用户代码,而不会继续执行正常操作)。 因此,如果已将 BFB2 位清零(从存储区 2 自举),则要执行自举程序代码时必须: —— 将地址 0x0808 0000(存储区 2 的基址)和 0x0800 0000(存储区 1 的基址)编程为 0x0,或者 ——将 BFB2 位置 1,使 BOOT0 = 1 且 BOOT1 = 0。 6.2 自举程序配置 STM32F10xxx 超大容量器件嵌入式自举程序支持两种串行接口:USART1 和 USART2。 下表介绍了系统存储器自举模式下,自举程序需要使用的 STM32F10xxx 超大容量器件硬件 资源。 表 9. 系统存储器自举模式下 STM32F10xxx 超大容量器件的配置 自举程序 功能/外设 状态 备注 适用于所有 自举程序 时钟源 HSI 使能 使用 PLL 作为系统时钟,频率为 24 MHz。 RAM - 自地址 0x2000 0000 起的 2 KB 空间供自举程序固件使用。 系统存储器 - 自地址 0x1FFF E000 起的 6 KB 空间包含自举程序固件。 IWDG - 独立看门狗 (IWDG) 预分频器配置为最大值,并定期进行 刷新以防止看门狗复位(如果用户事先使能硬件 IWDG 选项)。 USART1 自举程序 USART1 使能 初始化后,USART1 的配置为:8 位,偶校验位和 1 个停 止位。 USART1_RX 引脚 输入 PA10 引脚:USART1 用于接收。 USART1_TX 引脚 推挽输出 PA9 引脚:USART1 用于发送。 检测阶段期间,USART2_RX (PD6) 引脚必须保持高电平或低电平