我的硬件设计没有将 BOOT0 引脚连接到特定的电压电平。这就是为什么我需要写入 OPTR 寄存器,以便在引导序列中不读取 BOOT0-Pin。
我检查 OPTR 寄存器:
- FLASH->OPTR = ffeff8aa
- RDP = aa
- BOR_LEV = 0
- nRST_STOP = 1
- nRST_STDBY = 1
- nRST_SHDW = 1
- IWDG_SW = 1
- IWDG_STOP = 1
- IWDG_STDBY = 1
- WWDG_SW = 1
- BFB2 = 0
- DBANK = 1
- nBOOT1 = 1
- SRAM_PE = 1
- CCMSRAM_RST = 1
- nSWBOOT0 = 1
- nBOOT0 = 1
- NRST_MODE = 3
- IRHEN = 1
我需要清除 nSWBOOT0,以便不再评估 BOOT0 引脚。

我写了一个代码序列来清除 nSWBOOT0...
- FLASH_OBProgramInitTypeDef FLASH_OBInitStruct;
- HAL_FLASHEx_OBGetConfig(&FLASH_OBInitStruct);
- FLASH_OBInitStruct.OptionType = OPTIONBYTE_USER;
- FLASH_OBInitStruct.USERType = OB_USER_nSWBOOT0;
- CLEAR_BIT(FLASH_OBInitStruct.USERConfig, FLASH_OPTR_nSWBOOT0);
- printf("FLASH_OBProgramInitTypeDef
"); - printf(" OptionType = %" PRIx32 "
", FLASH_OBInitStruct.OptionType); - printf(" RDPLevel = %" PRIx32 "
", FLASH_OBInitStruct.RDPLevel); - printf(" USERType = %" PRIx32 "
", FLASH_OBInitStruct.USERType); - printf(" USERConfig = %" PRIx32 "
", FLASH_OBInitStruct.USERConfig); - printf(" PCROPConfig = %" PRIx32 "
", FLASH_OBInitStruct.PCROPConfig); - printf("
"); - /* Unlock the option bytes block access */
- HAL_FLASH_OB_Unlock();
- HAL_FLASHEx_OBProgram(&FLASH_OBInitStruct);
- /* Launch the option byte loading */
- HAL_FLASH_OB_Launch();
- /* Locks the option bytes block access */
- HAL_FLASH_OB_Lock();
...输出正确的值...
- FLASH_OBProgramInitTypeDef
- OptionType = 4
- RDPLevel = aa
- USERType = 2000
- USERConfig = fbeff800
- PCROPConfig = 0
...但它转到 HardFault_Handler:

我的问题:为什么?