硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1394|回复: 4
收起左侧

[脱机烧录] STM32G0B1 不加读保护烧录正常,加读保护后无法识别IDCODE

[复制链接]

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2021-11-28 01:16:28 | 显示全部楼层 |阅读模式
测试芯片:  STM32G0B1VCT6
有个注意的地方是.  该芯片 SWCLK引脚和BOOT0脚是复用的。下载器SWCLK上拉或下拉可能导致非预期的执行结果。

坑1 : 用ST官方提供的 STM32G0Bx_256.FLM 无法烧录,擦除返回失败。 用 STM32G0xx_128.FLM 可以烧录.

坑2  :不加读保护烧录OK了。加上读保护,断电后确实起到保护作用。但是无法再次烧录。
   无法读到IDCODE,在underreset模式也无法读到IDCOD。这个保护功能也太强了。
   之前调试 G031 加读保护后,在underreset模式还可以读IDCODE,可再次烧录。

还在解决中...

V2.10版本已更新最新的ST FLM文件。不过ST的FLM实际未对OB写入成功与否进行校验,固定返回OK。有一点小缺陷。

回复

使用道具 举报

9

主题

103

回帖

130

积分

初级会员

积分
130
发表于 2021-12-2 14:09:17 | 显示全部楼层
期待解决这个型号的MCU擦除烧录问题
回复

使用道具 举报

1

主题

1

回帖

4

积分

新手上路

积分
4
发表于 2021-12-18 16:22:15 | 显示全部楼层
请问新版软件里选择STM32G031为啥也不给写选项字呀?
H7-tool 2.0.9
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107064
QQ
发表于 2021-12-18 16:29:27 | 显示全部楼层
Tornado2000 发表于 2021-12-18 16:22
请问新版软件里选择STM32G031为啥也不给写选项字呀?
H7-tool 2.0.9

MDK昨天发布了新版算法文件,下次升级可以加上了,否则还要自己做,有点繁琐。
QQ截图20211218162847.png
回复

使用道具 举报

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
 楼主| 发表于 2021-12-23 00:58:01 | 显示全部楼层

最新的OB算法文件,ST留下一个缺陷,写完选项字后实际未校验。
其实可以通过读取Flash内容完成校验工作,而不是读寄存器值校验(寄存器只有在断电再上电后才会更新的)

/*
*  Verify Flash Contents
*    Parameter:      adr:  Start Address
*                    sz:   Size (in bytes)
*                    buf:  Data
*    Return Value:   (adr+sz) - OK, Failed Address
*/
#ifdef FLASH_OPT
unsigned long Verify (unsigned long adr, unsigned long sz, unsigned char *buf) {
#if 0 /* verify does not work because I do not get the registers updated without a reset! */
#if defined STM32G0x0
  u32 optr      = *((u32 *)(buf +  0));
  u32 wrp1ar    = *((u32 *)(buf +  4));
  u32 wrp1br    = *((u32 *)(buf +  8));
#if defined FLASH_DB
  u32 wrp2ar    = *((u32 *)(buf + 12));
  u32 wrp2br    = *((u32 *)(buf + 16));
#endif
#endif // STM32G0x0
#if defined STM32G0x1
  u32 optr      = *((u32 *)(buf +  0));
  u32 wrp1ar    = *((u32 *)(buf +  4));
  u32 wrp1br    = *((u32 *)(buf +  8));
  u32 pcrop1asr = *((u32 *)(buf + 12));
  u32 pcrop1aer = *((u32 *)(buf + 16));
  u32 pcrop1bsr = *((u32 *)(buf + 20));
  u32 pcrop1ber = *((u32 *)(buf + 24));
  u32 secr      = *((u32 *)(buf + 28));
#if defined FLASH_DB
  u32 wrp2ar    = *((u32 *)(buf + 32));
  u32 wrp2br    = *((u32 *)(buf + 36));
  u32 pcrop2asr = *((u32 *)(buf + 40));
  u32 pcrop2aer = *((u32 *)(buf + 44));
  u32 pcrop2bsr = *((u32 *)(buf + 48));
  u32 pcrop2ber = *((u32 *)(buf + 52));
#endif
#endif /* STM32G0x1 */
  FLASH->SR  = FLASH_PGERR;                             // Reset Error Flags
  FLASH->CR  = FLASH_OBL_LAUNCH;                        // Load Option Bytes -> generates a reset!
  __DSB();
#if defined STM32G0x0
  if ((FLASH->OPTR      & 0x3F7FFFFF) != (optr      & 0x3F7FFFFF)) {    // Check OPTR values
    return (adr + 0);
  }
  if ((FLASH->WRP1AR    & 0x007F007F) != (wrp1ar    & 0x007F007F)) {    // Check WRP1AR values
    return (adr + 1);
  }
  if ((FLASH->WRP1BR    & 0x007F007F) != (wrp1br    & 0x007F007F)) {    // Check WRP1BR values
    return (adr + 2);
  }
#if defined FLASH_DB
  if ((FLASH->WRP2AR    & 0x007F007F) != (wrp2ar    & 0x007F007F)) {    // Check WRP2AR values
    return (adr + 3);
  }
  if ((FLASH->WRP2BR    & 0x007F007F) != (wrp2br    & 0x007F007F)) {    // Check WRP2BR values
    return (adr + 4);
  }
#endif
#endif /* STM32G0x0 */
#if defined STM32G0x1
  if ((FLASH->OPTR      & 0x3F7FFFFF) != (optr      & 0x3F7FFFFF)) {    // Check OPTR values
    return (adr + 0);
  }
  if ((FLASH->WRP1AR    & 0x007F007F) != (wrp1ar    & 0x007F007F)) {    // Check WRP1AR values
    return (adr + 1);
  }
  if ((FLASH->WRP1BR    & 0x007F007F) != (wrp1br    & 0x007F007F)) {    // Check WRP1BR values
    return (adr + 2);
  }
  if ((FLASH->PCROP1ASR & 0x000001FF) != (pcrop1asr & 0x000001FF)) {    // Check PCROP1ASR values
    return (adr + 3);
  }
  if ((FLASH->PCROP1AER & 0x800001FF) != (pcrop1aer & 0x800001FF)) {    // Check PCROP1AER values
    return (adr + 4);
  }
  if ((FLASH->PCROP1BSR & 0x000001FF) != (pcrop1bsr & 0x000001FF)) {    // Check PCROP1BSR values
    return (adr + 5);
  }
  if ((FLASH->PCROP1BER & 0x000001FF) != (pcrop1ber & 0x000001FF)) {    // Check PCROP1BER values
    return (adr + 6);
  }
  if ((FLASH->SECR      & 0x0FF100FF) != (secr      & 0x0FF100FF)) {    // Check SECR values
    return (adr + 7);
  }
#if defined FLASH_DB
  if ((FLASH->WRP2AR    & 0x007F007F) != (wrp2ar    & 0x007F007F)) {    // Check WRP2AR values
    return (adr + 8);
  }
  if ((FLASH->WRP2BR    & 0x007F007F) != (wrp2br    & 0x007F007F)) {    // Check WRP2BR values
    return (adr + 9);
  }
  if ((FLASH->PCROP2ASR & 0x000001FF) != (pcrop2asr & 0x000001FF)) {    // Check PCROP2ASR values
    return (adr + 10);
  }
  if ((FLASH->PCROP2AER & 0x800001FF) != (pcrop2aer & 0x800001FF)) {    // Check PCROP2AER values
    return (adr + 11);
  }
  if ((FLASH->PCROP2BSR & 0x000001FF) != (pcrop2bsr & 0x000001FF)) {    // Check PCROP2BSR values
    return (adr + 12);
  }
  if ((FLASH->PCROP2BER & 0x000001FF) != (pcrop2ber & 0x000001FF)) {    // Check PCROP2BER values
    return (adr + 13);
  }
#endif
#endif /* STM32G0x1 */
#endif
  return (adr + sz);     --固定返回OK,实际没校验
}
#endif /* FLASH_OPT */
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-16 09:24 , Processed in 0.180655 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表