1.简介
当 PF2/NRST作用为GPIO 口时,SWD口又复用为其他IO功能时,需要重新下载程序,会无法下载。
有三种方式解决:
(1) 在SWD口复用为其他io功能 前停留2秒, 保证上电后有足够长的烧录等待时间
(2)把boot0引脚上拉3.3V,再插入SWD进行下载
(3)把PF2/NRST改回 复位功能
PF2/NRST这个PIN是比较麻烦的一个功能脚, 因为默认启用了RESET功能, 不受PIN模式的影响, 所以无论你把它设置成INPUT, OUTPUT 还是 ANALOG, RESET永远生效, 和这个PIN同处于同一个物理管脚的PIN就没法正常使用.
要禁用它的RESET功能, 要在芯片的 OB(Option Bytes)里修改. OB 位于地址 0x1FFF 0E80, 占用4个字节, 其中2字节是配置, 另外2字节是这两个字节的反码. 对应 RESET 功能的设置 NRST_MODE 存储于第14位, 0表示仅复位输入, 1表示禁用复位输入,启用 GPIO 功能.
#define RSTPIN_MODE_GPIO 0
static void APP_FlashSetOptionBytes(void)
{
FLASH_OBProgramInitTypeDef OBInitCfg;
HAL_FLASH_Unlock(); /* 解锁FLASH */
HAL_FLASH_OB_Unlock(); /* 解锁OPTION */
/* 配置OPTION选项*/
OBInitCfg.OptionType = OPTIONBYTE_USER;
OBInitCfg.USERType = OB_USER_BOR_EN | OB_USER_BOR_LEV | OB_USER_IWDG_SW | OB_USER_IWDG_SW | OB_USER_NRST_MODE | OB_USER_nBOOT1;
OBInitCfg.RDPLevel = OB_RDP_LEVEL_0;//RDP
#if(RSTPIN_MODE_GPIO==1)
/* BOR不使能/BOR上升3.2,下降3.1/软件模式看门狗/GPIO功能/System memory作为启动区 */
OBInitCfg.USERConfig = OB_BOR_DISABLE | OB_BOR_LEVEL_3p1_3p2 | OB_IWDG_SW | OB_WWDG_SW | OB_RESET_MODE_GPIO | OB_BOOT1_SYSTEM;
#else
/* BOR不使能/BOR上升3.2,下降3.1/软件模式看门狗/RST功能/System memory作为启动区 */
OBInitCfg.USERConfig = OB_BOR_DISABLE | OB_BOR_LEVEL_3p1_3p2 | OB_IWDG_SW | OB_WWDG_SW | OB_RESET_MODE_RESET | OB_BOOT1_SYSTEM;
#endif
/* 启动option byte编程 */
HAL_FLASH_OBProgram(&OBInitCfg);
HAL_FLASH_Lock(); /* 锁定FLASH */
HAL_FLASH_OB_Lock(); /* 锁定OPTION */
/* 产生一个复位,option byte装载 */
HAL_FLASH_OB_Launch();
}
//使用下初始化,可以保证只初始化一次,避免出现重复修改失败,导致flash 锁死
if(RSTPIN_MODE_GPIO ==0 && READ_BIT(FLASH->OPTR, FLASH_OPTR_NRST_MODE) == OB_RESET_MODE_GPIO)//如果是gpio模式,需要修改为RST模式
{
/* 如果没关闭则调用 */
APP_FlashSetOptionBytes();
}else if(RSTPIN_MODE_GPIO==1 && READ_BIT(FLASH->OPTR, FLASH_OPTR_NRST_MODE) == OB_RESET_MODE_RESET)//如果是RST模式,需要修改为gpio模式
{
APP_FlashSetOptionBytes();
}
需要把PF2q启用 GPIO 功能时,
修改 #define RSTPIN_MODE_GPIO 1
配置输出
MCU_GPIO_Conf(GPIOF, GPIO_PIN_2, GPIO_MODE_OUTPUT_PP, GPIO_PULLUP);
设置高电平
MCU_GPIO_Set(GPIOF, GPIO_PIN_2,GPIO_PIN_RESET);