解锁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。
|