你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】代码实现 PCROP 清除

[复制链接]
STMCU小助手 发布时间:2022-3-5 22:10
前言
STM32 PCROP 专有代码读出保护,将某个区域设置为仅允许执行,可防止代码被非法读出与修改。ST 网站提供了免费的PCROP 参考代码,但是例程中仅仅提供了用代码设置 PCROP。为方便利用 PCROP 进行知识产权保护的开发和部署,这篇文章提供了方法, 可在 RDP 级别设置为 1 或者 0 时,使用代码清除 PCROP。

ST 网站上的 PCROP 参考代码
学习使用 PCROP,可从 ST 网站下载文档以及参考代码。文档里有一步一步的详细说明。参考代码则实现了,如何设置编译开发环境去掉文字库(Literal pool),以避免受保护区域需要被读访问;参考代码也实现了如何利用代码使能 PCROP 保护以及如何导出接口符号供二次开发使用。你可以编译运行 PCROP 参考代码。一旦下载到开发板并运行后,扇区 2 会自动被设置成 PCROP 保护。你将无法再次下载
代码到该扇区,也无法读出该扇区的内容。若想通过 STLink 工具解除 PCROP 保护,则会导致整个 Flash 被擦除。

使用代码清除 PCROP
在熟悉 ST 网站上的 PCROP 参考代码基础之上,我们将讨论如何使用代码清除 PCROP。
1. 原理
   根据用户手册,要想清除 PCROP 保护,读保护 RDP 级别必须从 1 设置成 0。也就是说,即使当前 RDP 级别为 0,我们也要使用代码将其设置成 1。然后,同时关掉 PCROP 和将 RDP 设置成 0。这也说明,尽管是清除 PCROP 保护,我们的代码必须加入 RDP 的设置函数, 而不能仅仅修改参考代码中的 PCROP_Enable 的状态字段使其变成 PCROP_Disable。

I7847$G56%TJSFOFCXB8U9S.png

2. 材料准备
   开发板: STM32F429I-Discovery
   开发工具:STM32Cube_FW_F4_V1.15.0
                   STM32CubeExpansion_AN4701_F4_V1.0.0(从 ST 网站下载的参考代码)
                   STM32 STLink
                   IAR/Keil
   注:也可以选择其他支持 PCROP 的 STM32 系列并选择相应的开发板与固件库。
3. 代码
    设置 RDP 到级别 1
   该函数在 RDP 级别为 0 时,若需要清除 PCROP, 必须被使用。
  1.    void RDP_Enable()
  2.    {
  3.    HAL_FLASH_OB_Unlock();
  4.    /* Allow Access to Flash control registers and user Falsh */
  5.    HAL_FLASH_Unlock();
  6.    HAL_FLASHEx_OBGetConfig(&OBInit);
  7.    //After programming please power off and power on in order to use this board
  8.    if(OBInit.RDPLevel == OB_RDP_LEVEL_0)
  9.    {
  10.    OBInit.OptionType = OPTIONBYTE_RDP;
  11.    OBInit.RDPLevel = OB_RDP_LEVEL_1;
  12.    HAL_FLASHEx_OBProgram(&OBInit);

  13. /* Start the Option Bytes programming process */
  14. if (HAL_FLASH_OB_Launch() != HAL_OK)
  15. {
  16. /* User can add here some code to deal with this error */
  17. while (1)
  18. {
  19. }
  20. }
  21. }
  22. /* Prevent Access to option bytes sector */
  23. HAL_FLASH_OB_Lock();
  24. HAL_FLASH_Lock();
  25. }
复制代码

 设置 RDP 到级别 0
在清除 PCROP 保护的代码里不会直接调用这个函数。参考手册提到,PCROP 的清除必须与 RDP 从 1 到 0 同时发生,而下列 RDP_Disable 函数则是完整独立的,无法与 PCROP 的 Option bytes 同时操作。不过,这个代码的中间部分,也就是实际功能部分,将在清除 PCROP 时被重用。
  1. void RDP_Disable()
  2. {
  3. HAL_FLASH_OB_Unlock();

  4. /* Allow Access to Flash control registers and user Falsh */
  5. HAL_FLASH_Unlock();

  6. HAL_FLASHEx_OBGetConfig(&OBInit);
  7. //After programming please power off and power on in order to use this board
  8. if(OBInit.RDPLevel == OB_RDP_LEVEL_1)
  9. {
  10. OBInit.OptionType = OPTIONBYTE_RDP;
  11. OBInit.RDPLevel = OB_RDP_LEVEL_0;
  12. HAL_FLASHEx_OBProgram(&OBInit);

  13. /* Start the Option Bytes programming process */
  14. if (HAL_FLASH_OB_Launch() != HAL_OK)
  15. {
  16. /* User can add here some code to deal with this error */
  17. while (1)
  18. {
  19. }
  20. }
  21. }
  22. /* Prevent Access to option bytes sector */
  23. HAL_FLASH_OB_Lock();
  24. HAL_FLASH_Lock();
  25. }
复制代码

 清除 PCROP
下述代码清除 PCROP, 它基于参考代码中的 PCROP_Enable 函数改写而成。首先,它通过 RDP_Enable 将 RDP 设置成 1。注意实验中不要将 RDP 设置成为 2,否则所有的 Option bytes 将不再被允许修改。然后将 RDP 和 PCROP 都设置完毕,调用一次 HAL_FLASH_OB_Launch 达到同时将 RDP 设置成 1 并清除 PCROP 保护。
  1. uint32_t PCROP_Disable(void)
  2. {

  3. RDP_Enable();

  4. /* Get FLASH_PCROP_SECTORS protection status */
  5. HAL_FLASHEx_AdvOBGetConfig(&pAdvOBInit);
  6. SectorsPCROPStatus = pAdvOBInit.SectorsBank1 & FLASH_PCROP_SECTORS;
  7. PCROPStatus = pAdvOBInit.SectorsBank1 & PCROP_ENABLED;

  8. /* Check if sector 2 has been already PCROP-ed */
  9. if ((PCROPStatus == PCROP_ENABLED) && (SectorsPCROPStatus == FLASH_PCROP_SECTORS))
  10. {
  11. /* Allow Access to option bytes sector */
  12. HAL_FLASH_OB_Unlock();
  13. /* Allow Access to Flash control registers and user Flash */
  14. HAL_FLASH_Unlock();
  15. /* Clear all nWRP bits */
  16. pAdvOBInit.OptionType = OPTIONBYTE_PCROP;
  17. pAdvOBInit.PCROPState = OB_PCROP_STATE_DISABLE;
  18. pAdvOBInit.Banks = FLASH_BANK_BOTH;
  19. pAdvOBInit.SectorsBank1 = OB_PCROP_SECTOR_All;
  20. pAdvOBInit.SectorsBank2 = OB_PCROP_SECTOR_All;
  21. HAL_FLASHEx_AdvOBProgram(&pAdvOBInit);
  22. /* Clear PCROP protection on sector 2 by setting nWRP 2 bit */
  23. pAdvOBInit.OptionType = OPTIONBYTE_PCROP;
  24. pAdvOBInit.PCROPState = OB_PCROP_STATE_DISABLE;
  25. pAdvOBInit.Banks = FLASH_BANK_1;
  26. pAdvOBInit.SectorsBank1 = OB_PCROP_SECTOR_2;
  27. HAL_FLASHEx_AdvOBProgram(&pAdvOBInit);

  28. /* Disable PCROP Protection by setting SPRMOD bit */
  29. HAL_FLASHEx_OB_SelectPCROP();
  30. /* Set RDP from 1 to 0*/
  31. OBInit.OptionType = OPTIONBYTE_RDP;
  32. OBInit.RDPLevel = OB_RDP_LEVEL_0;
  33. HAL_FLASHEx_OBProgram(&OBInit);
  34. /* Start the Option Bytes programming process */
  35. if (HAL_FLASH_OB_Launch() != HAL_OK)
  36. {
  37. /* Error occurred while options bytes programming */
  38. return(0);
  39. }
  40. /* Prevent Access to option bytes sector */
  41. HAL_FLASH_OB_Lock();
  42. /* Disable the Flash option control register access (recommended to protect
  43. the option Bytes against possible unwanted operations) */
  44. HAL_FLASH_Lock();

  45. /* PCROP Protection successfully Enabled */
  46. return(1);
  47. }
  48. }
复制代码

4.运行
在主函数中,调用 PCROP_Disable 可解除 PCROP 保护。RDP_Enable 后需要关闭电源,重新启动,然后系统正常运行解除 PCROP 保护。解除保护后,可通过 STLink 确认 PCROP Option bytes 已恢复,同时也可以看到整个 Flash 内容已被擦除。


结论
本文讨论了完全使用代码控制 PCROP 的设置与清除。它可以使用在 PCROP 代码保护的开发与部署阶段。


收藏 评论0 发布时间:2022-3-5 22:10

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版