ST意法半导体
直播中

李燕

8年用户 1637经验值
私信 关注
[问答]

STM32G474RE写入OPTR寄存器因为BOOT0-Pin悬空的原因?

我的硬件设计没有将 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:
我的问题:为什么?









回帖(1)

张淑兰

2022-12-26 11:32:51
它首先使用 HAL_FLASH_Unlock() 解锁 Flash 本身
现在可以了!
这是几乎可以工作的示例(它写入 OPTR 寄存器,但也以某种方式重新加载程序):


  • 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_OBProgramInitTypeDefn");
  • printf("  OptionType    = %" PRIx32 "n", FLASH_OBInitStruct.OptionType);
  • printf("  RDPLevel      = %" PRIx32 "n", FLASH_OBInitStruct.RDPLevel);
  • printf("  USERType      = %" PRIx32 "n", FLASH_OBInitStruct.USERType);
  • printf("  USERConfig    = %" PRIx32 "n", FLASH_OBInitStruct.USERConfig);
  • printf("  PCROPConfig   = %" PRIx32 "n", FLASH_OBInitStruct.PCROPConfig);
  • printf("n");

  • /* Unlock the FLASH control register access */
  • HAL_FLASH_Unlock();

  • /* 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();

  • /* Lock the FLASH control register access */
  • HAL_FLASH_Lock();

这是 ST 本身的另一个例子:


  • C:UsersandreasSTM32CubeRepositorySTM32Cube_FW_G4_V1.4.0ProjectsNUCLEO-G474REExamplesFLASHFLASH_WriteProtectionSrc
举报

更多回帖

发帖
×
20
完善资料,
赚取积分