软件完成后,如果想对flash 进行保护,禁止他人非法读取flash,可进行如下操作:

            FLASH_Unlock();
            //这个指令会禁止  读取FALSH (包括DAP  JLINK都无法读取flash)
            status = FLASH_ReadOutProtection(ENABLE);
            FLASH_Lock();
            NVIC_SystemReset();

执行以上代码后,无论是DAP还是jlink都不能正常读取整个flash。

【注意】千万不要轻易执行以上代码,否则,系统无法正常更新程序,仅能运行程序!

如何解除锁定呢?

            FLASH_Unlock();
            //如果之前执行过enable,再执行disable,会清空整个FLASH
            status = FLASH_ReadOutProtection(DISABLE);  
            FLASH_Lock();
            NVIC_SystemReset();

执行上面代码后,硬件会自动清除整个FLAHS。

如果想测试这个程序,可以将这两个程序写在串口任务中,根据串口收到的命令执行不同的分支!

如何写锁定自己的某几个页


/**
  * @brief  使用标准库保护 Flash 的前 4KB (Page 0 - Page 3)
  * @note   如果保护成功执行,系统将自动复位!
  */
void Flash_Protect_Sector0_StdLibrary(void)
{
    // 定义我们要保护的区域:前 4KB (Page 0 - 3)
    uint32_t target_pages = FLASH_WRProt_Pages0to3;
    FLASH_Status status;
    // 获取当前的写保护状态
    // FLASH_GetWriteProtectionOptionByte 返回的是 WRP 寄存器的值
    // 如果对应的位为 1 (SET),表示该区域处于"未保护"状态
    // 如果对应的位为 0 (RESET),表示该区域处于"保护"状态
    uint32_t wrp_status = 0;
    wrp_status = FLASH_GetWriteProtectionOptionByte();
    // 检查是否已经处于保护状态
    // 如果 (wrp_status & target_pages) 不为 0,说明这些页中至少有一页未被保护
    if ((wrp_status & target_pages) != RESET)
    {
        // 1. 解锁 Flash
        FLASH_Unlock();
        // 2. 启用写保护
        // 注意:这里不需要显式解锁 Option Bytes,标准库的这个函数内部处理了流程
        // 此函数会将对应位置 0
        status = FLASH_EnableWriteProtection(target_pages);
        // 3. 检查是否操作成功
        if (status == FLASH_COMPLETE)
        {
            // 4. 锁定 Flash
            FLASH_Lock();
            // 5. 产生系统复位以加载新的 Option Bytes
            // 必须复位,否则保护不会立即生效
            NVIC_SystemReset();
        }
        else
        {
            // 如果失败,记得锁定 Flash
            FLASH_Lock();
        }
    }
    // 如果已经保护了,则什么都不做,继续运行
}

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐