打印
[产品应用]

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

[复制链接]
1769|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 精灵魔仙 于 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写入。









使用特权

评论回复
沙发
精灵魔仙|  楼主 | 2025-5-20 10:23 | 只看该作者
本帖最后由 精灵魔仙 于 2025-5-20 10:26 编辑

请问 CW32L010 能够通过用户代码使能读保护吗,还是必须使用官方工具?CW32L010_StandardPeripheralLib_V1.0.4  没有提供相关示例。麻烦官方人员看到回复下,谢谢。另外有没有技术交流群,这里交流有限制,实在是太耗费时间。

使用特权

评论回复
板凳
dffzh| | 2025-5-20 13:13 | 只看该作者
1、我看了芯片的用户手册,的确是这样操作:


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

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

使用特权

评论回复
地板
精灵魔仙|  楼主 | 2025-5-20 13:47 | 只看该作者
dffzh 发表于 2025-5-20 13:13
1、我看了芯片的用户手册,的确是这样操作:

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

使用特权

评论回复
5
dffzh| | 2025-5-20 13:55 | 只看该作者
精灵魔仙 发表于 2025-5-20 13:47
只是猜测起作用了,因为没有ISP工具,不知道通过ISP是否能读取。读保护功能是很常用的,却卡壳在了这里, ...

难道是读取该位的方式不对造成的?看上去似乎是一直没有读到真正的寄存器位值

使用特权

评论回复
6
dffzh| | 2025-5-20 14:01 | 只看该作者
本帖最后由 dffzh 于 2025-5-20 14:15 编辑
精灵魔仙 发表于 2025-5-20 13:47
只是猜测起作用了,因为没有ISP工具,不知道通过ISP是否能读取。读保护功能是很常用的,却卡壳在了这里, ...

我帮你咨询看看,希望可以搞定

使用特权

评论回复
7
pssyx| | 2025-5-20 14:16 | 只看该作者
精灵魔仙 发表于 2025-5-20 10:23
请问 CW32L010 能够通过用户代码使能读保护吗,还是必须使用官方工具?CW32L010_StandardPeripheralLib_V1. ...

1、当然可以通过用户代码使能读保护!直接调用FLASH_SetReadOutLevel()函数即可,但记住必须避免MCU的每一次上电,都重写一次读保护的情况发生。
2、读保护生效后,读FLASH_CR1.SECURITY为仍然为0?请确认SYSCTRL_AHBEN中FLASH位的时钟是否打开了?

使用特权

评论回复
8
dffzh| | 2025-5-20 14:23 | 只看该作者
本帖最后由 dffzh 于 2025-5-20 14:33 编辑
pssyx 发表于 2025-5-20 14:16
1、当然可以通过用户代码使能读保护!直接调用FLASH_SetReadOutLevel()函数即可,但记住必须避免MCU的每 ...

楼主好像加上 SYSCTRL_AHBPeriphClk_Enable(SYSCTRL_AHB_PERIPH_FLASH, ENABLE) 测试也不行呢

使用特权

评论回复
9
精灵魔仙|  楼主 | 2025-5-20 14:43 | 只看该作者
pssyx 发表于 2025-5-20 14:16
1、当然可以通过用户代码使能读保护!直接调用FLASH_SetReadOutLevel()函数即可,但记住必须避免MCU的每 ...

是否方便贴上直接可以跑通的示例,这样最简单。

使用特权

评论回复
评论
MrChen93 2025-5-20 14:49 回复TA
这是产品上用的? 
10
pssyx| | 2025-5-20 15:19 | 只看该作者
精灵魔仙 发表于 2025-5-20 14:43
是否方便贴上直接可以跑通的示例,这样最简单。

CW32L010代码读保护示例,请参考!

RDP_sysctrl.png (213.79 KB )

RDP_sysctrl.png

RDP_flash.png (161.02 KB )

RDP_flash.png

gpio_blink.zip

12.04 KB

使用特权

评论回复
11
精灵魔仙|  楼主 | 2025-5-20 16:52 | 只看该作者
本帖最后由 精灵魔仙 于 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重启以更新保护等级
    }
}


使用特权

评论回复
12
精灵魔仙|  楼主 | 2025-5-21 09:31 | 只看该作者
pssyx 发表于 2025-5-20 15:19
CW32L010代码读保护示例,请参考!

麻烦有空再确认下这个问题,该问题决定着是否要采用CW32L010方案。谢谢

使用特权

评论回复
13
pssyx| | 2025-5-21 10:18 | 只看该作者
精灵魔仙 发表于 2025-5-21 09:31
麻烦有空再确认下这个问题,该问题决定着是否要采用CW32L010方案。谢谢

CW32L010代码读保护的有效次数只有48次,次数用完之后,读保护就失效了。但此状况与你反馈的现象完全不同。
1、请检查一下读保护次数,附图是48次用尽的情况,其地址为0x100730~0x10075F。
2、你之前所言,读保护已生效,但CR1.security为0,是如何得知,请告之操作流程,且截图FLASH & SYSCTRL。
3、建议批量生产时,再使能读保护功能。

RdP_L010_NVRAM.png (21.46 KB )

RdP_L010_NVRAM.png

使用特权

评论回复
14
精灵魔仙|  楼主 | 2025-5-21 12:05 | 只看该作者
本帖最后由 精灵魔仙 于 2025-5-21 12:12 编辑
pssyx 发表于 2025-5-21 10:18
CW32L010代码读保护的有效次数只有48次,次数用完之后,读保护就失效了。但此状况与你反馈的现象完全不同 ...

原次数确实已经用尽,使用新的芯片该部分是全FF。当使能读保护后,FLASH_GetReadOutLevel() 会返回1. 可以澄清返回0是用尽的问题。当用尽后,再调用官方的 FLASH_SetReadOutLevel() 函数就会死循环,建议此函数中添加次数是否用尽的检查。
现在的疑问:
48次的限制,是否意味着48次加保护,去保护操作之后,芯片就只能处于非读保护状态了?
48次读保护限制应该是你们的SPEC,希望写入官方文档,方便用户解惑。



使用特权

评论回复
15
pssyx| | 2025-5-21 14:55 | 只看该作者
精灵魔仙 发表于 2025-5-21 12:05
原次数确实已经用尽,使用新的芯片该部分是全FF。当使能读保护后,FLASH_GetReadOutLevel() 会返回1. 可以 ...

代码读保护的有效次数用尽之后,以最后一次的保护等级为准,如果是0,则无法进行读保护;如果是1~3,则读保护仍然有效。

使用特权

评论回复
16
dffzh| | 2025-5-22 16:19 | 只看该作者
精灵魔仙 发表于 2025-5-21 12:05
原次数确实已经用尽,使用新的芯片该部分是全FF。当使能读保护后,FLASH_GetReadOutLevel() 会返回1. 可以 ...

居然还有一个读保护的操作有效次数限制呀,这个问题要是不问技术支持,估计一时半会还真想不到

使用特权

评论回复
评论
dffzh 2025-5-26 11:24 回复TA
@精灵魔仙 其他行业不清楚,反正软件开发过程中会经常踩坑,特别是刚接触新MCU芯片的时候,也算是一种实战经验吧。 
精灵魔仙 2025-5-24 14:21 回复TA
国内MCU厂商最大的问题,不是怕坑,而是有坑不告诉你。非重要设备用用。 
17
穷得掉渣大侠| | 2025-5-24 08:10 | 只看该作者
看起来像是FLASH_CR1.SECURITY位没有正确设置,可能是库函数的bug或者硬件问题。建议检查库函数的实现和硬件连接。

使用特权

评论回复
18
瞌睡虫本虫| | 2025-5-28 17:32 | 只看该作者
看起来像是FLASH_CR1.SECURITY位没有正确设置,你可以尝试检查一下代码中是否有遗漏或者错误。

使用特权

评论回复
19
穷得掉渣大侠| | 2025-5-28 19:56 | 只看该作者
看起来像是FLASH_CR1.SECURITY位没有正确设置,可能需要检查一下代码逻辑是否有误。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

14

帖子

1

粉丝