SWD协议读取和操作Cortex-M系列单片选项字节

1. 最近工作需要使用到脱机烧写,而且PCB上只留了SWD的接口。使用烧写盒的话总是有些小问题STM32F4系列如果BOOT1没有接上下拉的话会出现芯片被锁的情况导致脱机烧录器无法对芯片进行烧录。

2. 当时还不知道问题在哪,本着实事求是的精神逻辑分析仪抓包了下SWD的协议,通过Jlink Commander读取芯片的0x40023C14寄存器,结合芯片参考手册发现时芯片被使能了读写保护。通过J-Flash连上芯片后先进行lock,在进行unlock就可以恢复正常。于是抓了包lock、unlock的数据记录下来。要是以后自己做脱机烧录器说不定还能用上。顺便验证了下其他常用芯片的lock、unlock一并记录。

3. 下面都是具体的芯片型号据测试,同一个系列的都是一样的操作方式。

 

GD32F130/330G8:

  1. 读取FMC_OBSTAT(0x4002201C)寄存器低8位0x02读保护,0x00无保护;
  2. 分别解锁FMC_KEY、FMC_OBKEY(0x456701230xCDEF89AB);
  3. 分别写0x2200x2600x210到FLASH_CTL寄存器(0x40022010);
  4. 以16bit方式写0xA5A5(unlock)或者0xFFFF(lock)到选项字节地址(0x1ffff800);
  5. 复位重启。

STM32F411/410/401CE:

  1. 读取0x40023C14,判定是否处于读保护状态(0x0FFFFFED低级别保护)、(0x0FFFAAED无保护);
  2. 解锁OPTKEY,分别写0x08192A3B,0x4C5D6E7F->0x40023C08
  3. 0x0FFFFFEC->0x40023C14(lock)或写0x0FFFAAEC->0x40023C14(unlock);
  4. 0x0FFFFFEE->0x40023C14(lock)或写0x0FFFAAEE->0x40023C14(unlock);
  5. 读取FLASH_SR(0x40023C0C)寄存器等待操作结束;
  6. 复位重启。

注意:如果读0x40023C14的值为0x8FFFAAED的需要先执行lock操作并且在lock第二、三步骤时将0x0FFFFFEC0x0FFFFFEE换成0x8FFFFFEC0x8FFFFFEE,再按照正常操作执行unlock。

STM32F103RB:

  1. 读取0x4002201C判断是读保护状态低8位(0xFC无保护)、(0xFE有保护);
  2. 写KEY1(0x45670123)、KEY2(0xCDEF89AB)到FLASH_KEYR(0x40022004)、FLASH_OPTKEYR(0x40022008)寄存器解锁;
  3. 分别写0x2200x2600x210到FLASH_CR寄存器(0x40022010);
  4. Lock(以16bit0xFFFF)、unlock(以16bit0x00A5)到0x1FFFF800
  5. 等待操作结束、复位

STM32F030/F302C8:

  1. 读取FMC_ FLASH_OBR(0x4002201C)寄存器低8位0x02读保护,0x00无保护
  2. 分别解锁FMC_KEY、FMC_OBKEY(0x456701230xCDEF89AB);
  3. 分别写0x2200x2600x210到FLASH_CR寄存器(0x40022010);
  4. 以16bit方式写0x55AA55AA(unlock)或者0xFFFFFFFF(lock)到选项字节地址(0x1ffff800);
  5. 0x2210到FLASH_CR寄存器(0x40022010);
  6. 复位重启。

GD32F103RB:

  1. 读取0x4002201C判断是读保护状态低8位(0xFC无保护)、(0xFE有保护);
  2. 写KEY1(0x45670123)、KEY2(0xCDEF89AB)到FLASH_KEYR(0x40022004);
  3. FLASH_OPTKEYR(0x40022008)寄存器解锁;
  4. 分别写0x2200x2600x210到FLASH_CR寄存器(0x40022010);
  5. Lock(以16bit0xFFFF)、unlock(以16bit0x00A5)到0x1FFFF800
  6. 等待操作结束、复位

 

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值