这次有点牛了,因为我没有给AI喂数据了,是它自己找到的。
以前这种问题,怎么也得搞一天
【问题由来】
S32K311的1M容量仅前256K可以正常擦除烧写,而后面的空间无法正常擦除。测试S32K312没有这个问题
【AI交互】
问题:帮我查下S32K311的1M容量仅前256K可以正常擦除烧写,而后面的空间无法正常擦除。测试S32K312没有这个问题
回复:核心就是 S32K311 的 1MB 被拆成两个 512KB Block,每个 Block 又按 256K 边界分两段、各有独立的锁寄存器。你目前只解锁了 Block 0 的前 256K(SSPELOCK[0]),剩下 3/4 都没解。把 4 组锁寄存器全清零即可。S32K312 因为 Block 0 就是完整 1MB,配置例程自然覆盖到位,所以不触发此问题
问题:帮我使用H7-TOOL的pg_write32和pg_read32实现解锁
回复:
[Lua] 纯文本查看 复制代码 -- S32K311 Flash 全解锁脚本
-- 使用 H7-TOOL pg_write32 / pg_read32
local PFLASH_BASE = 0x40268000
-- 寄存器地址
local SPELOCK0 = PFLASH_BASE + 0x340 -- 0x40268340
local SPELOCK1 = PFLASH_BASE + 0x344 -- 0x40268344
local SSPELOCK0 = PFLASH_BASE + 0x35C -- 0x4026835C
local SSPELOCK1 = PFLASH_BASE + 0x360 -- 0x40268360
-- 复位后延时,等 HSE/SBAF 完成初始化
-- (SWD 方式无法轮询 PRTN0_CORE2_STAT,用延时替代即可)
delayms(30)
-- 1) 读取当前锁定状态(可选,确认问题用)
print("=== 当前锁状态 ===")
print(string.format("SSPELOCK[0] = 0x%08X", pg_read32(SSPELOCK0)))
print(string.format("SPELOCK[0] = 0x%08X", pg_read32(SPELOCK0)))
print(string.format("SSPELOCK[1] = 0x%08X", pg_read32(SSPELOCK1)))
print(string.format("SPELOCK[1] = 0x%08X", pg_read32(SPELOCK1)))
-- 2) 解锁 Block 0
local val
-- Block 0 前 256K(4 个 super sector,bits 0-3)
val = pg_read32(SSPELOCK0)
pg_write32(SSPELOCK0, val & (~0x0F))
-- Block 0 后 256K(32 个 sector,bits 0-31,全部解锁)
val = pg_read32(SPELOCK0)
pg_write32(SPELOCK0, val & (~0xFFFFFFFF))
-- 3) 解锁 Block 1
-- Block 1 前 256K
val = pg_read32(SSPELOCK1)
pg_write32(SSPELOCK1, val & (~0x0F))
-- Block 1 后 256K —— 注意避开 SBAF 区域!
-- SBAF: 0x004F4000-0x004FFFFF = SPELOCK[1] bits 26-31
-- 只解锁 bits 0-25,保留 SBAF 位不动
val = pg_read32(SPELOCK1)
pg_write32(SPELOCK1, val & 0xFC000000) -- 等价于 &= ~0x03FFFFFF
-- 4) 验证解锁结果
print("=== 解锁后锁状态 ===")
local ss0 = pg_read32(SSPELOCK0)
local sp0 = pg_read32(SPELOCK0)
local ss1 = pg_read32(SSPELOCK1)
local sp1 = pg_read32(SPELOCK1)
print(string.format("SSPELOCK[0] = 0x%08X", ss0))
print(string.format("SPELOCK[0] = 0x%08X", sp0))
print(string.format("SSPELOCK[1] = 0x%08X", ss1))
print(string.format("SPELOCK[1] = 0x%08X", sp1))
if (ss0 == 0 and sp0 == 0 and ss1 == 0) then
print("Block 0 解锁成功")
else
print("Block 0 解锁异常,请检查")
end
if (sp1 & 0x03FFFFFF) == 0 then
print("Block 1 非 SBAF 区域解锁成功")
else
print("Block 1 解锁异常,请检查")
end
实际添加到TOOL里面,测试正常了,现在的AI有点太强了,竟然一次成功
|