首先明确, ST-Link下载STM32程序, 跟BOOT0的状态是没有任何关系的!
本文的使用条件是在boot0=1时, ST-Link可以正常下载程序, 但是当BOOT0=0时, 在Keil中查看ST-Link的状态为No Target Connected, 而此时当按住STM32的复位按钮时, 重新查看ST-Link的状态就是在线的, 造成这个问题的根本原因就是PA13的状态.
STM32默认会打开JTAG功能或者SWD功能, 所以与JTAG和SWD功能相关的引脚会被占用, 如果在开发过程中把这些功能引脚给重定义了, 即相关引脚当做GPIO口用了, 同时也已经将程序烧录到了STM32中, 这就造成了再次使用keil通过ST-Link烧录程序时, 上位机要通过SW的状态判断下位机状态, 但是SW引脚已经被重定义了这个情况. 此时如果关掉程序中的重定义PA13的相关语句, 再重新下载, 就会发现BOOT0=0时, 也可以下载程序了.
以我自己程序中为例, 我写的关闭JATG和SWD功能的语句是这样的:
//先把JTAG的功能关了, 才能正常使用原来JTAG占用的IO口
//这个功能关了以后, BOOT0=0的情况下, 就不能使用ST-Link下载了
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
另外, 在网上寻求此问题的解决方案时, 发现有用STM32 ST-LINK Utility擦除STM32程序的解决方法, 原文中说STM32被"写保护"了, 本人不反驳, 但是其最终的原理就是让STM32恢复到了出厂状态, 让STM32默认打开了JTAG和SWD功能.