硬汉嵌入式论坛

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

[脱机烧录] 【已经支持】准备添加复旦微FM33系列选项字节读写保护支持,发现他们技术手册和SDK软件包没有并提供相关操作步骤

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2024-8-15 14:11:53 | 显示全部楼层 |阅读模式
已经发布

H7-TOOL自制Flash读写保护算法系列,为复旦微FM33LG和FM33LE制作使能和解除算法,支持在线烧录和脱机烧录使用(2024-12-03)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=126725



从他们的技术手册和SDK软包里面了解到,只有内部Flash的操作步骤,没有提供选项字节的操作步骤:

234.jpg

23456.jpg

SDK里面仅有的选项字节操作是读操作,没有写操作说明:

[C] 纯文本查看 复制代码
/**
  * @brief    Get debug read protection enable status
  * @rmtoll   OPTBR    DBRDPEN    FL_FLASH_GetSWDReadProtectionState
  * @param    FLASHx FLASH instance
  * @retval   Returned value can be one of the following values:
  *           @arg @ref FL_FLASH_SWD_READ_PEOTECTION_DISABLE
  *           @arg @ref FL_FLASH_SWD_READ_PEOTECTION_ENABLE
  */
__STATIC_INLINE uint32_t FL_FLASH_GetSWDReadProtectionState(FLASH_Type *FLASHx)
{
    return (uint32_t)(READ_BIT(FLASHx->OPTBR, FLASH_OPTBR_DBRDPEN_Msk));
}


这个使用TOOL也可以方便读取

234556.jpg


按照内部Flash的访问方法,使用LUA小程序访问了下,无法正常操作选项字节:

[Lua] 纯文本查看 复制代码
function printf(...)
    print(string.format(...))
end

beep()
pg_init()

-- FL_RCC_EnableGroup2BusClock(FL_RCC_GROUP2_BUSCLK_FLASH);
-- pg_write32(0x4000022C, 0x000000A0)
value = pg_read32(0x4000022C)
print_hex(value)
pg_write32(0x4000022C, 0x000000A0)
value = pg_read32(0x4000022C)
print_hex(value)

-- FL_RCC_EnableGroup2BusClock(FL_RCC_GROUP2_BUSCLK_FLASH);
-- pg_write32(0x40000270, 0x00400000)
value = pg_read32(0x40000270)
print_hex(value)
pg_write32(0x40000270, 0x00400000)
value = pg_read32(0x40000270)
print_hex(value)

--  CLEAR_BIT(FLASHx->EPCR, FLASH_EPCR_EREQ_Msk);
value = pg_read32(0x40001014)
print_hex(value)
pg_write32(0x40001014, (value & 0xFFFFFFFE))
value = pg_read32(0x40001014)
print_hex(value)

--  SET_BIT(FLASHx->EPCR, FLASH_EPCR_PREQ_Msk);
pg_write32(0x40001014, (value |0x00000002))
value = pg_read32(0x40001014)
print_hex(value)

-- FL_FLASH_UnlockFlash(FLASHx, FL_FLASH_PROGRAM_KEY1);
-- FL_FLASH_UnlockFlash(FLASHx, FL_FLASH_PROGRAM_KEY2);
pg_write32(0x40001018, 0xA5A5A5A5)
pg_write32(0x40001018, 0xF1F1F1F1)

delayms(1000)

value = pg_read32(0x40001008)
printf("pg_read32 = %x", value)

re = pg_write32(0x1FFFFC00, 0xCC5533aa)
print_hex(re)
value = pg_read32(0x1FFFFC00)
printf("pg_read32 = %x", value)



只能联系厂家获取操作步骤了,根据其它厂家的IC的操作方法,复旦微这个选项字节的Unlock命令提供下,应该就可以了。当前没有提供这个命令。

也就是下面这个

[Lua] 纯文本查看 复制代码
pg_write32(0x40001018, 0xA5A5A5A5)
pg_write32(0x40001018, 0xF1F1F1F1)






回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
 楼主| 发表于 2024-12-3 01:01:55 | 显示全部楼层
已经自制实现LG和LE的保护功能

回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2025-3-20 16:43:35 | 显示全部楼层
想要请教一下,按照步骤在全擦标志位有效的情况下进行OPT修改,但是只能将OPT内容由1写为0而无法由0写为1,有没有遇到过相似问题?
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2025-4-2 10:40:36 | 显示全部楼层
请教一下,解锁的pg_write32(0x40001018, 0xA5A5A5A5)和pg_write32(0x40001018, 0xF1F1F1F1)在-- FL_FLASH_UnlockFlash(FLASHx, FL_FLASH_PROGRAM_KEY1);和-- FL_FLASH_UnlockFlash(FLASHx, FL_FLASH_PROGRAM_KEY2);这里已经有了吗?是要解锁两次吗?
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2025-4-2 10:41:58 | 显示全部楼层
Nanano 发表于 2025-3-20 16:43
想要请教一下,按照步骤在全擦标志位有效的情况下进行OPT修改,但是只能将OPT内容由1写为0而无法由0写为1, ...

正常情况下OTP就是只能写一次,由1写成0之后就不能再擦除了
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2025-4-2 11:08:17 | 显示全部楼层
eric2013 发表于 2024-12-3 01:01
已经自制实现LG和LE的保护功能

大佬,请教一下这个解锁是怎么解锁的,正常编程flash时不就已经在KEY中写入A5A5A5A5和F1F1F1F1F1这两个密钥了吗?怎么实现输入之后解锁选项字节呢?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-25 20:32 , Processed in 0.251435 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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