解锁eflash函数如下:void SetEflashClock(void)
{
uint32_t eflashCKDIV = 0;
uint32_t ctrl2 = 0x0;
int32_t timeout = 500;
do
{
①WRITEMEM32(Eflash_KEY_REG, SYS_EFLSH_UNLOCK_KEY1);
①WRITEMEM32(Eflash_KEY_REG, SYS_EFLSH_UNLOCK_KEY2);
timeout–;
} ②while ((READBIT32(EFLASH_INFO_REG, (uint32_t)1 << 31) != 0) && (0 < timeout));
eflashCKDIV = (SYSCLK_FREQ / 1000000 + 2) & 0x7F;
#if (SYSCLK_FREQ_72MHz < SYSCLK_FREQ)
{
timeout = 500;
ctrl2 = 0x13000 | eflashCKDIV;
③WRITEMEM32(EFLASH_CTRL2_REG, ctrl2);
do
{
timeout–;
} ④while (READBIT32(EFLASH_CTRL2_REG, 1 << 17) && (0 < timeout));
}
#else
{
ctrl2 = 0x3000 | eflashCKDIV;
WRITEMEM32(EFLASH_CTRL2_REG, ctrl2);
}
#endif
⑤WRITEMEM32(EFLASH_CTRL3_REG, 0x20000);
⑥WRITEBIT32(EFLASH_CTRL2_REG, (uint32_t)1 << 8);
⑦WRITEBIT32(EFLASH_INFO_REG, (uint32_t)1 << 31);
}
①:首先向Key 序列寄存器写入0xAC7811和0x1234567解锁片内flash。
②:等待保护信息寄存器的LOCK位为0,若此位为1,表示片内flash为锁定状态。
③:控制 eflash 最大操作时钟频率为72MHz <eflash 控制器时钟频率 < 120MHz,
时钟分频用以产生 1us 脉冲。
④:等待控制寄存器2的CLK_CHG_BSY位为1,表示用户可以将eflash时钟更改为72MHz以上。
⑤:向控制寄存器3写入0x200000(并未在参考手册中找到控制寄存器3的相关信息,无法解释)
⑥:将控制寄存器2的CKDIV_LOCK位置1,锁定对于 eFLASH_CTRL2 的配置。
⑦:将保护信息寄存器的LOCK位置1,锁定片内Flash 控制器。无法对控制寄存器1和控制寄存器2进行改写,如需改写,重复①操作,等待保护信息寄存器的LOCK位为0,方可重新配置控制寄存器1和控制寄存器2。
|