一、除了使用boot引脚控制运行系统BootLoader,也可以上电后跳转,跳转前注意以下问题:
(1)禁止所有外设时钟
(2)禁止使用的PLL
(3)禁止所有中断。
(4)清除所有中断挂起标志。
退出系统BootLoader的方法:
(1)退出boot激活条件,产生硬件复位。
(2)使用Go命令执行用户代码。
重要注意事项:
(1)如果使用Go命令,对于BootLoader中使用的硬件外设寄存器,跳转前是不会设置到复位值的,如果用户代码中恰好也用到这些寄存器,需要重新配置。这里要特别注意的是BootLoader会用到看门狗,并且喂狗时间设为最长了,如果用户代码里面要用到看门狗请根据需要重新配置,并且看门狗一旦开启是无法关闭的。
(2)对于具有双bank特性的STM32,为了能够从用户代码跳转到系统boot,需要将系统boot代码区使用寄存器SYSCFG重映射到0x0000 0000(除了STM32F7系列)。对于STM32F7系列,需要禁止nDBOOT / nDBANK 特性,然后跳转到系统boot区。
(3)如果用到系统bootl的DFU/USB接口,需要用到HSE时钟,这个时钟的频率是通过内部HSI/MSI检测出具体频率。因此,由于外部温度等各种情况,内部HSI的精度会受到影响,从而影响检测出来的HSE时钟有较大误差,最终导致DFU/CAN运行失败。
二、BootLoader的内存管理:
使用bootloader命令进行的所有写操作都只能对齐字(地址应该是4的倍数。 要写入的数据数量也必须是4的倍数(接受未对齐的半页写地址)。
1、有些产品不支持批量擦除操作。 使用BootLoader进行批量擦除时,有两个选项可用:
(1)使用扇区擦除命令一个一个删除。
(2)将保护级别设置为1,然后设置为0(使用读保护命令,然后使用读非保护命令),将导致大批量擦除操作。
2、STM32 L1和L0系列的Bootloader除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作Data Memeory(数据存储区,貌似是指的EEPROM)
数据存储区支持读写操作,而不支持擦除命令,如果要擦除,写0即可。另外对此存储区的写操作必须是4字节对齐(写的地址),并且写入的数据也是4的倍数。
3、F2, F4, F7 和 L4除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作OTP存储区。仅支持读写操作,不支持擦除命令。
4、F2, F4 和 F7系列的内部Flash写格式依赖于供电电压范围,默认的写操作只支持字节(半字,字和双字是不支持的),为了增加些操作速度,用户施加足够的电压范围以允许写操作按半字,字或双字,并通过虚拟内存位置的boot程序更新此配置。该内存位置不是物理地址,但可以根据协议使用常规的BootLoader读/写操作。 该存储位置包含4个字节,分别为如下表所述。 |