查看: 5567|回复: 2

[求助] LPC1754 BootLoader+APP 升级异常 Part 2

[复制链接]

该用户从未签到

2

主题

3

帖子

0

注册会员

Rank: 2

积分
56
最后登录
2021-10-25
发表于 2021-5-21 14:32:03 | 显示全部楼层 |阅读模式
本帖最后由 shidayimeng 于 2021-5-21 14:35 编辑

前贴在这里
简单说就是
在Keil 5使用jLink调试App程序没有问题
生产时用jFlash烧录后也没有问题
但是使用串口在Bootloader内重新写入一遍App的程序后
机器就会有一定概率出现死机 但死机时整片Flash 128KB 内容没有发生变化 (MD5校验码未变) 且断电后再开机依旧会死机

一开始我把编译优化等级从 O0 调到 O1 问题没有再复现
但是调到O1后 有个GPIO读取输入与 O0时不一样

/************************************************************/
//电磁铁检测开关
#define         ELECTROMAGNET_IO                P1_14
#define         ELECTROMAGNET_INPUT        LPC_GPIO1->FIODIR &= (~(1ul << 14))  //P1.14
#define         ELECTROMAGNET_STATE        (LPC_GPIO1->FIOPINL)&(0x4000)   //P1.14

/************************************************************/

int main(void)
{
    __enable_irq();
    SystemInit();       // 系统初始化,切勿删除     
    //------------------------------------
    GPIOInit();         // GPIO初始化、 P1.14 在这里配置成了输出

    ELECTROMAGNET_INPUT;//配置输入
    delayNuS(45); // 优化等级大于0时 读取管脚过快 优化等级等于0时 不死机

    if (ELECTROMAGNET_STATE) {
    }
    .........
}
/************************************************************/



所以我在 ELECTROMAGNET_INPUT 后加了一段 45微妙的延时(900个空指令)  这样O1优化下管脚读取也正常了


然后神奇的事情发生了


加完延时后我把优化等级调至 O0 死机问题也没有再复现了  去掉就复现







我知道答案 目前已有2人回答
回复

使用道具 举报

该用户从未签到

2

主题

3

帖子

0

注册会员

Rank: 2

积分
56
最后登录
2021-10-25
 楼主| 发表于 2021-5-21 14:39:32 | 显示全部楼层
本帖最后由 shidayimeng 于 2021-5-21 14:43 编辑

附个Jlink 读取 Flash 计算 MD5的脚本

  1. from loguru import logger
  2. from pylink import JLink, Library
  3. from pylink.enums import JLinkInterfaces
  4. from pylink.errors import JLinkException


  5. JLINK_SN = "123456789"


  6. def read_back(addr, size):
  7.     try:
  8.         with JLink(lib=Library(r"C:\Program Files (x86)\SEGGER\JLink\JLink_x64.dll"), error=logger.error, warn=logger.warning) as jlink:
  9.             # logger.debug(f"jlink dll name | {jlink._dll._name} | v{jlink.version}")
  10.             jlink.open(JLINK_SN)
  11.             # switch to SWD target interface
  12.             # https://github.com/square/pylink/issues/27
  13.             jlink.set_tif(JLinkInterfaces.SWD)
  14.             jlink.connect("LPC1754", speed=4000)
  15.             jlink.reset()

  16.             read_bytes = bytes(jlink.memory_read8(addr, size))
  17.             return read_bytes
  18.     except JLinkException as e:
  19.         logger.error(f"read back failed from {addr} size {size} | {repr(e)}")
  20.     return None


  21. def get_md5_hash(addr, size):
  22.     hash = None
  23.     read_bytes = read_back(addr, size)
  24.     if read_bytes:
  25.         hash = md5(read_bytes).hexdigest().upper()
  26.         logger.success(f"addr {addr} size {size} md5 hash {hash}")
  27.     return hash
复制代码




回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2025-6-10 23:03
  • 签到天数: 1502 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    97

    主题

    4688

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    10080
    最后登录
    2025-7-2
    发表于 2021-5-21 15:21:36 | 显示全部楼层
    我在使用隔壁芯片的时候也出现过类似由于优化导致的问题。

    具体的原因尚不明确了。
    等高手出现吧
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-23 04:20 , Processed in 0.086215 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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