本帖最后由 IFX_Lingling 于 2024-3-6 10:51 编辑
对flash进行加密和解密有两种方法:
其中一种是通过Memtool进行加密和解密,另外一种是通过直接在代码中进行设置。
方法1:通过Memtool进行配置(Memtool可以通过这个地址进行下载:MEMTOOL_download)
通过TMS和TCK电平的设置,让芯片进入ASC_boot模式。
可以通过在Dave中测试是否可以进入Debug进行判断硬件的连接是否是正常的。然后通过Power Down和Power Up,看是否可以跳到应用程序来判断是否确实进入ASC Mode,在ASC Mode 写在flash里面的代码是不运行的。
下面是具体的操作步骤:
目标设备选择和串口号选择:
确保硬件是在ASC bootstrap mode,然后可以点击tool部分的connect:
点击Open File,选择需要烧写的hex文件,click "Select All"可以选择所有需要被烧写的section,然后click右边的program(这一步可以先点击Erase)。这个时候可以通过进入Noramal Mode看程序状态,确认烧写是否成功。为了继续下面的步骤,芯片还需要继续保留在ASC bootstrap mode。
接着就可以点击HW Protection,勾选Enable global Read/Write Protection,然后点击下面截图的Setup
点击Setup以后就会进入下面截图,这一步是输入密码,点击check,然后点击Ok
回到Memtool的主界面,点击同一个界面的Start,出现下面截图点击OK,这个时候flash的protection就被设置了。
这个时候所有的操作都被禁止了:
重新修改TMS和TCK的配置,进入Noraml boot模式,代码可以正常运行。
这个时候Jlink也不能通过swd口访问内部flash。如果想进一步操作,必须先连接memtool进行解密,或者在芯片内部预留了解密的接口。
如果用Memtool解密,可以check ”Remove all Protection“
方法2通过代码进行配置:
通过代码加密的芯片,可以通过预留代码进行解密,也可以通过MEMTOOL进行解密。
/*
* main.c
*
* Created on: 2016 Mar 18 10:13:58
* Author: ZhangEdi
*/
#include "xmc_gpio.h"
#include "xmc_flash.h"
uint8_t Security;
/**
* [url=home.php?mod=space&uid=247401]@brief[/url] main() - Application entry point
*
* <b>Details of function</b><br>
* This routine is the application entry point. It is invoked by the device startup code.
*/
//extern void XMC_FLASH_lDisableReadProtectionCommand(uint32_t password_0, uint32_t password_1);
int main(void)
{
XMC_GPIO_EnableDigitalInput(XMC_GPIO_PORT15,12);
XMC_GPIO_EnableDigitalInput(XMC_GPIO_PORT15,13);
/* Placeholder for user application code. The while loop below can be replaced with user application code. */
while(1U)
{
}
}
理论解释XMC4200_Reference_Manual :
Flash 中有一个特殊的区域 UCB(User Configuration Block),用于 Flash 加密。UCB 区域分为 UCB0,UCB1,UCB2 这三个 1K 的区域,分别分配给 3 个用户使用。每个的权限有所不同,UCB0 用户有对芯片全局读保护和写保护权限,UCB1 用户有对芯片写保护权限,UCB2 用户有对芯片进行 OTP 保护权限。一般比较常用的是全局读保护,即把 PROCON0 的 bit15 值为 1,复位后 Flash 就被读保护了。PROCONx 寄存器是只读的,它会在复位后从 UCB 的对应位置把值 load 进来。
Flash 加密流程:
- 把 PROCNx 的内容配置好,先写 UC Page0
- 再把 confirmation code 设为 0x8AFE15C3,然后再写 UC Page2
- 复位后 Flash 就加密了
Flash 临时解密流程(例如读保护临时解除):
- 执行 Disable Read Protection 命令(需要输入正确的密码)
-读完 Flash 后,再执行 Resume Protection 命令
- 执行 Disable Read Protection 命令(需要输入正确的密码)
- 执行 Erase User Configuration Block (注意这个擦除动作只能最多执行 4 次,否者可能会
损坏芯片)
可以参考community thread 解决的问题1:https://community.infineon.com/t5/XMC/XMC4700-Flash-Protection/td-p/675201
如果是临时解密的话:
例如临时读写解密:
XMC_FLASH_VerifyReadProtection(0x7E0, 0x7E0);
XMC_FLASH_VerifyWriteProtection(0, 0x8000, 0x7E0, 0x7E0);
XMC_FLASH_EraseUCB(XMC_FLASH_UCB0);
|