本帖最后由 精灵魔仙 于 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重启以更新保护等级
}
}
|