硬汉嵌入式论坛

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

[脱机烧录] 脱机编程开发记录,Opton bytes差异

[复制链接]

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2020-3-9 12:24:58 | 显示全部楼层 |阅读模式
本帖记录一下脱机编程器开发中的一些要点
目前最大的工作量在于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;












回复

使用道具 举报

19

主题

129

回帖

186

积分

初级会员

积分
186
QQ
发表于 2020-3-9 17:49:35 | 显示全部楼层
MDK中下载,上述这些工作是编译器做的,还是下载器做的,还是有其他综合因素
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107265
QQ
发表于 2020-3-9 18:02:11 | 显示全部楼层
lovelessing... 发表于 2020-3-9 17:49
MDK中下载,上述这些工作是编译器做的,还是下载器做的,还是有其他综合因素

MDK做这个不方便,经常锁住芯片,虽然带了部分芯片的选项字节编写文件,像现在各种论坛,各种群,很多咨询无法下载的,大部分都是选项字节设置出问题了,读保护了。

现在用STM32的话,用STM32CubeProg很方便就可以配置选项字节。

或者调用HAL库的选项字节操作API,也很方便。
回复

使用道具 举报

19

主题

129

回帖

186

积分

初级会员

积分
186
QQ
发表于 2020-3-9 18:25:07 | 显示全部楼层
eric2013 发表于 2020-3-9 18:02
MDK做这个不方便,经常锁住芯片,虽然带了部分芯片的选项字节编写文件,像现在各种论坛,各种群,很多咨 ...

最近ST家的上位机资源层出不穷,MDK用多了,Eclipse那一套不会用了,CubeIDE下载了不会用
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107265
QQ
发表于 2020-3-9 19:06:44 | 显示全部楼层
lovelessing... 发表于 2020-3-9 18:25
最近ST家的上位机资源层出不穷,MDK用多了,Eclipse那一套不会用了,CubeIDE下载了不会用

ST搞的这几个小软件CubeMX,CubeProg的确是不错,好用。

CubeIDE不太好用,太卡。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-23 22:48 , Processed in 0.283283 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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