一、概述
ISP-即In-system programming,是STM32单片机的一种启动模式,通过boot pin可以选择。这种模式下,单片机会加载一段内置代码,外部程序可以通过uart向其发送各种指令,完成诸如升级版本等的工作。
STM32 ISP Programmer是FreeCRT V0.9.9引入的一个新功能,可以通过uart对STM32单片机进行镜像的写入和读取。本功能是基于文档AN3155(见参考文档1)开发,并在STM32F103C6T6A开发板上调试验证的,并没有在STM32全系列单片机上测试过,所以是否支持具体某个型号,还需要等有机会验证后再说了。
为了简单,STM32 ISP Programmer被设计成单次触发的模式。什么意思呢?就是说用户点击Start按键,内部程序按如下流程执行:
- 探测STM32
- 执行任务-由一系列ISP指令组成
- 结束任务
简单的说,软件希望用户在点击Start的时候,保证STM32是重启之后进入了ISP的状态。换个说法,如果你执行了一次写入镜像,想再马上再执行一次,那么会出现Sync STM32失败的打印,因为软件期望你先复位STM32再执行。
二、STM32 ISP Programmer程序界面

程序主界面如图1所示,分为Write Image(写入镜像)和Read Image(读取镜像)两种操作。
Com Port用于指定与STM32通讯的UART口,支持动态识别系统内的可用串口。
Baud Rate用于指定通讯的波特率,这了需要说明的是,在ISP状态下,STM32支持动态的识别UART口以及动态识别波特率,这样如果想使用较高的写入速度,那么选择较高的波特率就可以了。
Image在Write Image时用于选择输入文件,在Read Image时用于指定输出文件。
复选框Unlock RDP用于在执行读写操作前首先进行解锁操作,关于这个功能的使用,在RDP相关部分再详细说明。
Erase All复选框用于指定在写入镜像时,是全flash擦除,还是按写入镜像的大小擦除所需占用的flash page,默认不是Erase All。
Target Flash区,用来定义读写Flash的目标位置,Base和Page size都是按STM32F103来设置的。Size字段用来控制写入镜像或读取的大小。
Log区用于显示详细操作步骤的执行情况,[]内为程序启用以来的毫秒数。
Start 按钮,用来触发一次执行任务。
三、读取镜像

读取镜像的操作界面如图2所示,大致按如下流程操作:
- 设置ISP模式,并复位STM32
- 选择Read Image
- 选择正确的通讯UART
- 选择合适的波特率
- 选择目标输出文件
- 填写需要读出的镜像大小填入Size空格内,单位为Byte
- 执行Start按钮
四、写入镜像

写入镜像的操作界面如图3所示,大致按如下流程操作:
- 设置ISP模式,并复位STM32
- 选择Wite Image
- 选择正确的通讯UART
- 选择合适的波特率
- 选择目标镜像文件,这个时候,Size会被自动设置为文件大小
- 执行Start按钮
五、RDP(读保护)模式的处理
RDP是STM32单片机提供的读保护模式,在这个模式通过任何方法都没有办法获取到单片机固件,是进行版本保护的重要手段。
在这个模式,任何读取和写入都会失败,但是可以进行RDP解锁操作,解锁后,就可以进行正常的读写操作,只是,一旦进行解锁,flash上的内容将会被清空,这也是RDP保护的重要一环。

如果STM32存在RDP状态,那么这个时候进行FLASH的读写,都会有图4类似的错误提示。这种状态下我们可以按如下流程尝试解锁:
- 设置ISP模式,并复位STM32
- 读写按前两节设置
- 额外勾选Unlock RDP
- 执行Start,出现Unlock成功的提示
- 接下来程序尝试进行读写任务,但大概率会失败,执行下面
- 复位STM32,去勾选Unlock RDP
- 再次执行Start
