正常使用STM32系列MCU的PCBA,都会在生产中将代码编程进去,并且设置必要的读写保护,不设置保护状态直接出厂的,应该没有这种情况吧?我在通过ISP功能进行编程,读写保护设置时,发现了一个奇怪的错误,当设置写保护位在WRP的高24bit时,会被后续的读保护命令清除,导致该部分的扇区无法在ISP过程中正常保护。 试验环境: a) STM32F103C8T6的目标板一块,正常供电,不限具体功能。 b) SWD调试口接入,CMD窗口运行STLink命令行工具用于查看内部状态。 c) 计算机运行终端软件通过串口连接目标板的USART1,用于ISP命令。 d) BOOT0接3.3V(VDD)用于上电后进入ISP内部自举模式。 试验过程(ISP命令操作读保护撤销,写保护的设置,读保护使能),以下绿色数据为终端窗口发往MCU,蓝色数据为MCU的应答返回。 CMD窗口STLink命令行显示内容中,绿色为期望的改变,红色为未期望的改变。 //Terminal Window:=========================== 1) USART1发送Readout unprotect 指令 7F 79 92 6D 79 79 //CMD Window:>ST-LINK_CLI.exe -c hotplug -rob///////////// 1) SWD读取MCU Option bytes Device ID: 0x410 Device flash Size: 64 Kbytes Device family: STM32F10xx Medium-density Option bytes: RDP : DISABLED IWDG_SW : 1 nRST_STOP : 1 nRST_STDBY : 1 Data0 : 0xFF Data1 : 0xFF WRP : 0xFFFFFFFF //Terminal Window:=========================== 2) USART1发送Write protect 指令(保护第1个 Sector) 7F 79 63 9C 79 00 00 00 79 //CMD Window:>ST-LINK_CLI.exe -c hotplug -rob///////////// 3) SWD读取MCU Option bytes Option bytes: RDP : DISABLED IWDG_SW : 1 nRST_STOP : 1 nRST_STDBY : 1 Data0 : 0xFF Data1 : 0xFF WRP : 0xFFFFFFFE //Terminal Window:=========================== 4) USART1发送Readout protect 指令 7F 79 82 7D 79 79 //CMD Window:>ST-LINK_CLI.exe -c hotplug -rob///////////// 5) SWD读取MCU Option bytes Option bytes: RDP : ENABLED IWDG_SW : 1 nRST_STOP : 1 nRST_STDBY : 1 Data0 : 0xFF Data1 : 0xFF WRP : 0xFFFFFFFE 重复上述1)->6)步骤,每次在第3)步增加一个保护Sector。当试验到第4)步读出为WRP=0xFFFFFE00时(写保护前面9个Sectors)。执行第5)步读保护后,在第6)步检查时,发现WRP发生了未期望的改变,变成了0xFFFFFF00。过程如下: //Terminal Window:///////////// 7F 79 92 6D 79 79 7F 79 63 9C 79 08 00 01 02 03 04 05 06 07 08 00 (Write protect 00 -> 08 total 9 sectors) 79 //CMD Window:>ST-LINK_CLI.exe -c hotplug -rob///////////// Option bytes: RDP : DISABLED IWDG_SW : 1 nRST_STOP : 1 nRST_STDBY : 1 Data0 : 0xFF Data1 : 0xFF WRP : 0xFFFFFE00 //Terminal Window:///////////// 7F 79 82 7D 79 79 //CMD Window:>ST-LINK_CLI.exe -c hotplug -rob///////////// Option bytes: RDP : ENABLED IWDG_SW : 1 nRST_STOP : 1 nRST_STDBY : 1 Data0 : 0xFF Data1 : 0xFF WRP : 0xFFFFFF00 后续的试验证实了这一点,Write protect 指令设置的WRP字,只有低8位字节能够在Readout protect指令执行后保留,WRP的高24位3字节都将被未期望改写为1。 而且这似乎无法绕过,因为执行了Readout Protect指令后,无法再用Write Protect指令改写WRP了。 |