|
本帖记录一下脱机编程器开发中的一些要点
目前最大的工作量在于Opton bytes的处理。每款CPU差异很大。
FLM算法文件问题
1、Keil下面的FLM算法烧写主flash一般都不会有问题,但是编程options bytes启用或解除写保护时,少量芯片可能存在问题。
2、已经发现不同的芯片(也不排除主板问题)启用内核软件复位会表现出不同的现象。
3、Keil MDK下的FLM文件一般都不提供BankCheck查空函数以及CRC校验函数。如果没有的话,烧录效率会降低。我对部分系列的算法文件添加了这
2个函数并验证OK。目前手上没有的芯片,就暂时没做这个优化,改了FLM文件必须上硬件实测才行。
3、脱机编程功能要想做稳定,还是有必要将每个种类的芯片(或者每个FLM算法文件)验证一下。这个工作量有点大了。
线束问题
1、调试中发现加载算法文件前初始化CPU时时会在swd_set_target_state_hw函数出错。
if (0 == swd_set_target_state_hw(RESET_PROGRAM))
{
printf("error: swd_set_target_state_hw(RESET_PROGRAM)\r\n");
return ERROR_RESET;
}
2、出现上述情况时,读FLASH,读写RAM,读UID,读芯片ID均返回正常。调整TVCC电压为3.6V, 3.0V 均无法解决。
3、额外加一根GND线后故障消除。
4、将GND杜邦壳去掉,压紧杜邦金属簧片后解决问题。可以确定是GND杜邦线接触电阻过大的问题导致电平逻辑异常。
STM32L051C8T6
1、OB数据是2字节word型加2字节反码。F103和F030是单字节加1字节反码。
2、无论是否设置RDP保护,复位后直接读Opton bytes会出错。但是读一次RAM或UID或MAIN FLASH数据后,就可以读取OB了。
3、写保护bit是0表示无保护1表示保护。和其他芯片逻辑是反的。
4、空片值是0x00,不是0xFF
5、FLM算法函数 Init (unsigned long adr, unsigned long clk, unsigned long fnc), 必须传递 fnc: = 1,2才能正常。其他芯片的传递任意值都可以,
/*
* Initialize Flash Programming Functions
* Parameter: adr: Device Base Address
* clk: Clock Frequency (Hz)
* fnc: Function Code (1 - Erase, 2 - Program, 3 - Verify)
* Return Value: 0 - OK, 1 - Failed
*/
#ifdef FLASH_MEMORY
int Init (unsigned long adr, unsigned long clk, unsigned long fnc) {
STM32F103ZET6
1、OB算法中没有Verify函数。需要erase_sector再program_page。 其他大部分芯片是erase_chip再program_page。
2、OB写入后需要复位(无需断电)后 才起作用
3、设置读保护后,OB、UID、FLASH均不可以读取。RAM可以读写。
如果芯片不是读保护状态,编程OB(无论是否设置读保护)均正常。
如果芯片已经是读保护状态,则解除OB保护时,会校验出错,实际已解除。
问题解决不彻底,硬件复位代码中添加内核复位指令后解决。但是加上后其他芯片可能异常。还有待分析原因
STM32F407VG
1. 无论是否设置RDP保护,复位后直接读Opton bytes会出错。但是读一次RAM或UID或MAIN FLASH数据后,就可以读取OB了。
2. 设置RDP为读保护后,无需复位,Opton bytes就已经不能访问了。校验是通过FLASH寄存器接口进行访问。
STM32F746BG
1. 不设置RDP保护,则Opton bytes其他字节可以正常编程
2. 设置RDP保护后,再改写为无保护时,算法erase_chip函数死机出不来。解锁失败。用ST-LINK可以恢复。
估计OB的算法文件在芯片已经读保护状态时有问题。
问题已解决,就是OB算法文件问题。初始化时,除了OB写保护需要unlock,main flash也需要unlock
int Init (unsigned long adr, unsigned long clk, unsigned long fnc) {
/* 2020-03-10 armfly增加,读保护切换到无保护时,会自动擦除main flash */
FLASH->KEYR = FLASH_KEY1; // Unlock Flash
FLASH->KEYR = FLASH_KEY2;
FLASH->ACR = 0x00000000; // Zero Wait State, no Cache, no Prefetch
FLASH->OPTKEYR = FLASH_OPTKEY1; // Unlock Option Bytes
FLASH->OPTKEYR = FLASH_OPTKEY2;
|
|