问答

汇集网友智慧,解决技术难题

21ic问答首页 - CW32L010使能读保护后标志位不正确

读保护 CW32L010 flash ev LEVEL se

CW32L010使能读保护后标志位不正确

精灵魔仙2025-05-19
本帖最后由 精灵魔仙 于 2025-5-20 08:16 编辑

手头测试的是TSSOP20,使用官方库 void FLASH_SetReadOutLevel(uint16_t RdLevel) 设置为 FLASH_RDLEVEL1,系统会自动重启,但是重启后使用FLASH_GetReadOutLevel()读取值还是为0,查看是读取的 FLASH_CR1.SECURITY。

使能 FLASH_RDLEVEL1 后,尽管标志位FLASH_CR1.SECURITY为0,但是看起来读保护是起作用的,此时使用SWD无法写入,通过ISP下发0x30清除读保护后,可以继续SWD写入。









回答 +关注 0
281人浏览 10人回答问题 分享 举报
10 个回答
  • 本帖最后由 精灵魔仙 于 2025-5-20 17:01 编辑

    以上代码,和我验证的用的代码基本是一致,这里用的是 SYSCTRL_AHBPeriphClk_Enable(SYSCTRL_AHB_PERIPH_FLASH, ENABLE),功能和__SYSCTRL_FLASH_CLK_ENABLE();是一样的。

    这边直接使用以上代码,会导致不停重启,因为在FLASH_SetReadOutLevel(FLASH_RDLEVEL1) 中,因为会调用 FLASH_GetReadOutLevel(),它总是返回0,和 FLASH_RDLEVEL1 不同,就会每次都执行读保护,并重启。可以在 while(1) 里面如下所示多加几个delay, 可以看到LED的闪烁频率不会有任何改变,因为while(1)循环根本跑不到。

    另外这边用的TSSOP20 CW32L010,其他型号没有验证过。

        __SYSCTRL_FLASH_CLK_ENABLE();
        FLASH_SetReadOutLevel(FLASH_RDLEVEL1);

        while(1)
        {
          GPIO_TogglePin(LED_GPIO_PORT, LED_GPIO_PINS);
          Delay(0xFFFF);
          Delay(0xFFFF);
          Delay(0xFFFF);
        }

    void FLASH_SetReadOutLevel(uint16_t RdLevel)
    {
        assert_param(IS_FLASH_RDLEVEL(RdLevel));

        if(FLASH_GetReadOutLevel() != RdLevel) // 此处的FLASH_GetReadOutLevel() 总是返回0,这就是奇怪的地方,第一次返回0,重启后应该返回1才对
        {
            RdLevel = 0x5A50 | (RdLevel & 0x03u);
            *((volatile uint32_t*)(0x4000431C)) = RdLevel;
            *((volatile uint32_t*)(0x40004370)) = 0x5A5AABCD;   //MCU重启以更新读保护等级

            while(1);  //MCU重启以更新保护等级
        }
    }


  • 精灵魔仙 发表于 2025-5-20 14:43
    是否方便贴上直接可以跑通的示例,这样最简单。

    CW32L010代码读保护示例,请参考!
  • pssyx 发表于 2025-5-20 14:16
    1、当然可以通过用户代码使能读保护!直接调用FLASH_SetReadOutLevel()函数即可,但记住必须避免MCU的每 ...

    是否方便贴上直接可以跑通的示例,这样最简单。
    MrChen93 2025-5-20 14:49 回复TA
    这是产品上用的? 
  • 本帖最后由 dffzh 于 2025-5-20 14:33 编辑
    pssyx 发表于 2025-5-20 14:16
    1、当然可以通过用户代码使能读保护!直接调用FLASH_SetReadOutLevel()函数即可,但记住必须避免MCU的每 ...

    楼主好像加上 SYSCTRL_AHBPeriphClk_Enable(SYSCTRL_AHB_PERIPH_FLASH, ENABLE) 测试也不行呢
  • 精灵魔仙 发表于 2025-5-20 10:23
    请问 CW32L010 能够通过用户代码使能读保护吗,还是必须使用官方工具?CW32L010_StandardPeripheralLib_V1. ...

    1、当然可以通过用户代码使能读保护!直接调用FLASH_SetReadOutLevel()函数即可,但记住必须避免MCU的每一次上电,都重写一次读保护的情况发生。
    2、读保护生效后,读FLASH_CR1.SECURITY为仍然为0?请确认SYSCTRL_AHBEN中FLASH位的时钟是否打开了?
  • 本帖最后由 dffzh 于 2025-5-20 14:15 编辑
    精灵魔仙 发表于 2025-5-20 13:47
    只是猜测起作用了,因为没有ISP工具,不知道通过ISP是否能读取。读保护功能是很常用的,却卡壳在了这里, ...

    我帮你咨询看看,希望可以搞定
  • 精灵魔仙 发表于 2025-5-20 13:47
    只是猜测起作用了,因为没有ISP工具,不知道通过ISP是否能读取。读保护功能是很常用的,却卡壳在了这里, ...

    难道是读取该位的方式不对造成的?看上去似乎是一直没有读到真正的寄存器位值
  • dffzh 发表于 2025-5-20 13:13
    1、我看了芯片的用户手册,的确是这样操作:

    只是猜测起作用了,因为没有ISP工具,不知道通过ISP是否能读取。读保护功能是很常用的,却卡壳在了这里,无奈。  加上 SYSCTRL_AHBPeriphClk_Enable(SYSCTRL_AHB_PERIPH_FLASH, ENABLE) 测试也不行,这个标志位读取总是0.
  • 1、我看了芯片的用户手册,的确是这样操作:


    2、那你试试在main循环读取,也是读不到吗?
    3、看你的实测现象,读保护确实是生效了;
    4、如果还不行,咨询下芯源半导体论坛里的,应该有技术人员吧:

    5、再不行,反正读保护设置已经起效,为什么读取不到CW_FLASH->CR1_f.SECURITY,可以先不管了。
12下一页

您需要登录后才可以回复 登录 | 注册