MPC5744 烧录一直停留在 98% 的解决方法

2023-05-16

1. 目的
本人在调试一块主控为 MPC5744 的板子时 ,有时候在烧录时 ,发现烧录总是停在 98% ,卡在 CRC 这里 ,在查找和看资料之后 ,发现了几种解决方法 :

  1. 使用 pemicro progpcz tool 清除 flash
  2. 使用 progpcnexus 清除 flash
  3. 在 S32DS 中 ,通过程序在 RAM 运行清除 flash
    这里重点讲第三种方法 。
    2.Flash 介绍
    2.1 Flash简介
    在 MPC5744 中 ,flash 共有 2.5MB ,分为了 7 个 partition (以下用分区表示) 20 block (以下用块表示) :
  4. 2 x 16KB ,分区为 0 (起始地址 :0x800000 ,是 data flash ,可用作 EEPROM 仿真)
  5. 2 x 32KB ,分区为 2 和 3 (起始地址 :0x808000 ,是 data flash ,可用作 EEPROM 仿真)
  6. 2 x 16KB ,分区为 1 (起始地址 :0xF98000)
  7. 6 x 64KB ,分区为 4 和 5 (起始地址 :0xFA0000)
  8. 8 x 256KB ,分区为 6 和 7 (起始地址 :0x1000000)
    如图 1 ,详细记录了每个块的分区 、容量和地址 ,这里的 flash 支持在其中一个分区写入时 ,
    在另外一个分区读取数据 ,但需要注意的是 ,不可以在同一个分区的边写边读 。
    在手册中将这些块按容量分成 4 部分 :
  9. Low address space :分区 0 和 1
  10. Mid address space :分区 2 和 3
  11. High address space :分区 4 和 5
  12. 256KB address space :分区 6 和 7
    在 flash 中 ,一个页 (page) 是256 bit (32 byte) ,在编程中可以以 32 bit 或 64 bit 间隔寻址 ,一次性写入最大的数量为 1024 bit (128 byte) ,并且每次读取返回 256 bit (32 byte ,但这是从 flash 里面读出来的 ,若我们是间接在寄存器读取数据 ,则只能读取到 32 bit) 。但需要注意的是 ,flash 支持 ECC 即检验数据的功能 ,分为单位校验和双位校验 ,每当 flash 编程时 ,对应的 ECC 位也是被编程 ,且 ECC 是 64 bit 对齐的 ,所以导致了每次编程最小 64 bit ,即写入的编程地址要 8 字节对齐 。若是不 8 字节对齐 ,例如 :在某一地址 adr 编程时 ,ECC 同样被编程 ,且是对应的 64 bit 编程 ,若是以这个地址 adr + 4 继续编程 ,由于对应的 ECC 已经编程 ,会导致此次编程出错 。
    需要注意的是 ,对 flash 写入有两种方法 ,一种是擦除 ,只能将 flash 内容变为逻辑 1 ,另一种是编程 ,只能将对应内容由 1 变为 0 ,而不能由 0 变为 1 。所以如果已经编程 flash ,需要重新修改时 ,需要先擦除再编程 ,防止出错 。需要注意的是 ,擦除是直接擦除一整个块 ,即这个块有多大 ,就擦除多大的区域 。
    在这里插入图片描述
    图 1 flash 地址映射与分区
    Flash 可处于三种模式中 ,分别是使用模式 ,低功耗模式和 UTest 模式 。
  13. 使用模式 :可对 flash 进行编程 ,擦除和读取等正常操作 ,一般运行时处于此模式
  14. 低功耗模式 :处于此模式之间 ,先确保对 flash 的所有操作已经结束 ,进入此模式后 ,不可在操作此模式
  15. UTest 模式 :检测 flash 完整性的一种模式 。
    在此芯片中 ,有一个 flash 存储控制器 ,如图 2 ,这里有缓冲器 ,64 指 64 bit 总线 ,每个 entry
    可存储 256 bit ,即一个页 ,而这里总共有 2 x 4 x entry ,图 3 是说明 flash 可以配置重映射 片上 RAM ,用于校准数据 。
    在这里插入图片描述
    图 2 flash 控制器框图
    在这里插入图片描述
    图 3 以平台为中心的简单框图与闪存控制器
    2.2 Flash 编程
    对于 Flash 的编程 ,首先被锁或禁用的块是不能被编程的 ,需要以下步骤 :
  16. MCR[PGM] 由 0->1 ,即 Flash 能执行一个编程序列 。
  17. 从编程起始地址写入数据 ,但记住 ,这个地址是 64 位对齐的 ,而写入的数据至少 32 位 。
  18. 如果超过一个字或双字要被编程 ,写入一个字或双字分别对应不同地址 。
  19. MCR[EHV] 由 0->1 ,开启执行编程序列 。
  20. 等待 MCR[DONE] = 1 。
  21. 验证 MCR[PEG] = 1 ,表明编程成功 。
  22. MCR[EHV] 由 1->0 。
  23. 有更多地址需要编程 ,返回步骤 2 。
  24. MCR[PGM] 由 1->0 ,即 Flash 不能执行一个编程序列 。
    为了读取 Flash ,编程序列能够被挂起 ,但在挂起期间不能执行擦除和编程操作 。但是 ,挂起期间 (无论是挂起擦除序列或编程序列) , 如果读取的编程挂起或擦除挂起的块的数据的 ,返回的是不确定的值 ,这不可取 。当然 ,如果是在不同分区 ,可以边读边写 。
    当 MCR[PGM] 、MCR[DONE] 和 MCR[EHV] 是 1 ,可以将 MCR[PSUS] 由 0->1 将编程序列任务挂起 ,在 MCR[EHV] = 1 时可以将 MCR[PSUS] 由 1->0 将编程序列任务恢复运行 。
    注意 Flash 操作是有超时的 ,所以不能频繁将编程序列任务挂起 。
    Flash 编程可以启用过编程 ,启用的块已经被编程的 64 位将无法再次编程 ,而不影响擦除操作 。尝试过编程 MCR[PEG] 将指示编程失败 。
    2.3 擦除
    被锁和禁用的块的不可以进行擦除操作的 ,步骤如下 :
  25. MCR[ERS] 由 0->1 ,即 Flash 能执行一个擦除序列 。
  26. 通过寄存器 SEL0 、SEL1 、SEL2 和 SEL3 选择要进行擦除的块 ,
  27. 向 Flash 写入数据 ,这是与擦除内锁写有关 。
  28. MCR[EHV] 由 0->1 ,开启执行擦除序列 。
  29. 等待 MCR[DONE] = 1 。
  30. 验证 MCR[PEG] = 1 ,表明擦除成功 。
  31. MCR[EHV] 由 1->0 。
  32. 有更多块要被擦除 ,返回步骤 2 。
  33. MCR[PGM] 由 1->0 ,即 Flash 不能执行一个擦除序列 。
    如果 MCR[DONE]=1 、MCR[EHV]=1 、MCR[ESUS]=1 ,则将 MCR[EHV] 由 1->0 将中止擦除操作 ,直接到步骤 8 ,并且MCR[PEG]=0 指示擦除失败 。注意如果擦除序列挂起时 ,不能中止擦除序列 。
    为了读取 Flash 或编程 Flash(擦除挂起编程) ,擦除序列能够被挂起 ,期间不能再挂起擦除序列 , 然后这个在擦除挂起期间的编程序列同样可以被挂起 , 只允许一次挂起一个编程序列和擦除序列 。当然 ,如果是在不同分区 ,可以边读边擦除 。
    当 MCR[ERS] 、MCR[DONE] 和 MCR[EHV] 是 1 ,MCR[PGM]=0 ,可以将 MCR[ESUS] 由 0->1 将擦除序列任务挂起 ,此时要开始编程序列需要先将 MCR[EHV]=0 。在 MCR[EHV] = 1 和 MCR[PGM]=0 时可以将 MCR[ESUS] 由 1->0 将擦除序列任务恢复运行 。
    3. 代码编写
    在这里使用的开发软件为 S32DS V2.1 ,使用官方 SDK 。
    首先在 Processor Expert 添加 flash_c55 ,生成代码后 ,直接使用 API 写代码 。这里仅仅写有关 flash 的部分 。
    在这里插入图片描述

图 4 Processor Expert 配置

status_t ret = STATUS_SUCCESS;    // 操作状态变量
uint32_t buffer[1024];             // 缓存数组
flash_block_select_t blockSelect; // 块选择
flash_state_t opResult;

// 禁用缓存 
    DisableFlashControllerCache(FLASH_PFCR1, FLASH_FMC_BFEN_MASK, &pflash_pfcr1);
    DisableFlashControllerCache(FLASH_PFCR2, FLASH_FMC_BFEN_MASK, &pflash_pfcr2);
    // 初始化 Flash
    ret = FLASH_DRV_Init();
DEV_ASSERT(ret == STATUS_SUCCESS);
// 不对 UTEST 块进行操作 ,直接上锁
    ret = FLASH_DRV_SetLock(C55_BLOCK_UTEST, 0x1U);
    if (STATUS_SUCCESS != ret)
    {
    		return ret;
    }
    // 对要擦除的块解锁
    ret = FLASH_DRV_SetLock(C55_BLOCK_LOW, 0x00);
    if (STATUS_SUCCESS != ret)
    {
        return ret;
    }
    
    ret = FLASH_DRV_SetLock(C55_BLOCK_MID, 0x00);
    if (STATUS_SUCCESS != ret)
    {
        return ret;
    }
    
    ret = FLASH_DRV_SetLock(C55_BLOCK_HIGH, 0x00);
    if (STATUS_SUCCESS != ret)
    {
        return ret;
    }
    
    ret = FLASH_DRV_SetLock(C55_BLOCK_256K_FIRST, 0x00);
    if (STATUS_SUCCESS != ret)
    {
        return ret;
    }
    ret = FLASH_DRV_SetLock(C55_BLOCK_256K_SECOND, 0x00);
    if (STATUS_SUCCESS != ret)
    {
        return ret;
}
// 选择要擦除的块 
// Low address space 是分区 0 和 1 ,共 4 块
blockSelect.lowBlockSelect = 0xFU; 
// Mid address space 是分区 2 和 3 ,共 2 块
blockSelect.midBlockSelect = 0x2U; 
// High address space 是分区 4 和 5 ,共 6 块
blockSelect.highBlockSelect = 0x3FU;
// 256KB address space 是分区 6 和 7 ,共 8 块
    blockSelect.first256KBlockSelect = 0xFFU;
    blockSelect.second256KBlockSelect = 0x0U;
    g_usrCnt = 0U;
    // 进行擦除操作 
ret = FLASH_DRV_Erase(ERS_OPT_MAIN_SPACE, &blockSelect);
// 擦除指令操作成功 ,等待擦除完成
    if (STATUS_SUCCESS == ret)
{
		// 直到退出擦除正在进行才可以退出此循环
        do
        {
		    // 检查此时 falsh 的擦除状态
            ret = FLASH_DRV_CheckEraseStatus(&opResult);
        }while(ret == STATUS_FLASH_INPROGRESS);
    }
    if (STATUS_SUCCESS != ret)
    {
        return ret;
    }

记住 ,要将程序放在 RAM 里面运行 (此时 flash 也烧录不进去) ,这样所有 flash 擦除之后 ,就可以重新正常烧录
在这里插入图片描述

图 5 debug 配置
4. 参考资料
① NXP 官网 :《MPC5744PRM》
下载链接 :
https://www.nxp.com/products/processors-and-microcontrollers/power-architecture/mpc55xx-5xxx-mcus/ultra-reliable-mpc57xx-mcus/ultra-reliable-mpc574xp-mcu-for-automotive-industrial-safety-applications:MPC574xP?tab=Documentation_Tab

② NXP 社区 :《Unable to start debug session on MPC5748G board .download stops at 98%》
下载链接 :
https://community.nxp.com/t5/S32-Design-Studio/Unable-to-start-debug-session-on-MPC5748G-board-download-stops/m-p/880973?commentID=1108905&et=watches.email.thread#comment-1108905

③ NXP 社区 :《DEVKIT MPC5748G S32DS download problem ,blocking at Verifying object file CRC-16 to device ranges》
下载链接 :
https://community.nxp.com/t5/S32-Design-Studio/DEVKIT-MPC5748G-S32DS-download-problem-blocking-at-Verifying/m-p/789755

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MPC5744 烧录一直停留在 98% 的解决方法 的相关文章

  • python-pyplot直方图,标注直方图数据

    话不多说 由于自己一直忘记直方图的一些细节 xff0c 经常不用 xff0c 老得百度 xff0c 干脆自己记下来好了 这是直方图的写法与标注直方图的数据写法 如下 from matplotlib import pyplot as plt
  • 从零开始学JetsonTX2----can bus开发

    step by step implementation 搞硬件开发 xff0c 先把技术手册搞到手 这个网页把几乎Jetson tx2的开发资料都汇总了一下 找教程开始配置can所需要系统环境 NIVIDA社区的教程 xff1a https
  • CAN总线详解

    目录 CAN 协议简介1 xff0c 何为CAN 1 1 CAN的应用实例1 2 总线拓扑图1 3 CAN的特点 2 xff0c CAN 电气属性3 xff0c CAN 协议3 1 数据帧3 2 遥控帧3 3 错误帧3 4 过载帧3 5 间
  • 内存对齐规则总结

    由于某些硬件平台不能任意访问地址数据 xff0c 只能在某些地址处取某些特定类型的数据 xff1b 并且处理器访问未对齐的内存时 xff0c 需要多次读取并对多余数据进行剔除 xff0c 相较于对齐内存访问 xff0c 耗费了更多的时间 x
  • 一些常用库的使用(CMAKE部分)

    opencv span class token function find package span span class token punctuation span OpenCV span class token number 3 1
  • 将RTKLIB编译成静态库

    rtklib编译 在写自己的程序时 xff0c 想要调用rtklib h xff0c 和它的一些文件来进行运行 xff0c 想要将rtklib编译成静态库安装在系统的目录下 xff0c 这样基于rtklib的二次开发就不用再使用源码了 xf
  • TIM_SetCompare2()

    对于 void TIM SetCompare2 TIM TypeDef TIMx uint16 t Compare2 的理解 void TIM SetCompare2 TIM TypeDef TIMx uint16 t Compare2 C
  • C语言语句YPR[0]=(BUF[1]<<8|BUF[2]),以及 >> 8 &0xFF如何理解?

    C语言语句 YPR 0 61 BUF 1 lt lt 8 BUF 2 如何理解 这是一个赋值语句 xff0c 把等式右边的值赋给左边 xff1b 先来看右边是怎么运算的 xff0c 由于移位运算符 lt lt 的优先级大于位运算符 xff0
  • word文档编辑时字体突然发生变化解决方法

    word文档在编辑时字体突然发生变化 xff0c 第1步 点击 开始 xff0c 图片中右下角 箭头 第2步 选择需要的字体 xff0c 第3步 设置默认字体 xff0c 确定
  • AD(Altium Designer)如何铺铜

    在PCB PcbDoc文件中 xff1a 在软件下方选择 34 Top Layer 顶层 34 xff08 1 xff09 执行 34 放置 34 gt 铺铜 xff1b 或者快捷键 34 PG 34 会弹出 34 Properties 属
  • 嵌入式硬件-读懂原理图

    学习硬件的第一节课 学习读懂原理图 读懂原理图对嵌入式软件工程师和程序员尤为重要 在深入细节之前请注意 对所有的嵌入式设计人员来说 能懂得硬件工程师创建和使用的来描述其硬件设计的原理图和符号是非常重要的 无论硬件设计得多么复杂 不管有多少设
  • 校招行测笔试-图形推理

    校招行测笔试 图形推理 面对校招笔试的行政能力测试 xff08 简称 行测 xff09 环节 xff0c 刚开始接触有些束手无策 摸不到头脑 xff0c 其实是有技可循的 xff0c 本文就帮助大家总结一下行测的相关技巧 如果对你有所帮助
  • 统一建模语言UML详解附思维导图

    UML图 概述 构成 事物 Things xff1a UML模型中最基本的构成元素 xff0c 是具有代表性的成分的抽象 构件事物 xff1a UML模型的静态部分 xff0c 描述概念或物理元素 类 xff1a 具有相同属性相同操作 相同
  • 比特率与波特率

    比特率 xff1a 单位 Bps bit per second xff0c 即每秒传输的 bit 数 波特率 xff1a 单位 Baud xff0c 即每秒传输的 码元 数 这里涉及到码元 码元 xff1a 持续一段固定时间的通信信道有效状
  • 嵌入式相关开源项目、库、资料------持续更新中

    学习初期最难找的就是找学习资料了 xff0c 本贴精心汇总了一些嵌入式相关资源 xff0c 包括但不限于编程语言 单片机 开源项目 物联网 操作系统 Linux 计算机等资源 xff0c 并且在不断地更新中 xff0c 致力于打造全网最全的
  • 嵌入式系统QNX概述-微内核架构进程管理安全性

    一 微内核架构 QNX操作系统由微内核以及一组协作的系统服务进程组成服务进程与操作系统内核是相互隔离开的 当服务进程出问题时并不会影响内核微内核提供软件总线供各个软件模块进行通信和协作内核只提供最小化的基础 公共服务高度模块化设计带来良好的
  • 三万字长文总结C语言规范

    1 头文件 若包含了头文件aa h xff0c 则就引入了新的依赖 xff1a 一旦aa h被修改 xff0c 任何直接和间接包含aa h代码都会被重新编译 如果aa h又包含了其他头文件如bb h xff0c 那么bb h的任何改变都将导
  • 操作系统概述

    Overview Q1 xff08 Why xff09 为什么要学操作系统 xff1f Q2 xff08 What xff09 xff1a 到底什么是操作系统 xff1f Q3 xff08 How xff09 xff1a 怎么学操作系统 x
  • 小白自学PIX飞控学习笔记

    小白自学PIX飞控学习笔记 xff08 二 xff09 接触飞控什么是MCU xff1f PIX飞控与MCU xff1f 无人机飞控的作用飞控内部如何实现其功能 xff1f 接触飞控 作为未入门 小白 一枚 xff0c 也只是简单地接触过C
  • Nestjs 返回req报错

    返回req存在循环引用 报错 ERROR ExceptionsHandler Converting circular structure to JSON gt starting at object with constructor Sock

随机推荐

  • 设计方法的选用

    六大原则 创建好了之后算法不常变的 xff0c 比如计算器的加减乘除逻辑 xff0c 就可以用简单工厂模式 要是像商场收银机对打折等促销的处理 xff0c 若用简单工厂模式也可以 xff0c 不过要在工厂内创建多个具体的打折方案 xff0c
  • XXX测试用例设计?XXX怎么测试?(行李箱、电梯、水杯、笔、椅子)

    首先要知道 xff0c 答案要从下面6个方向考虑 xff1a 功能测试 界面测试 易用性测试 兼容性测试 安全性测试 性能测试 其次 xff0c 在回答问题前要向面试官表明 xff1a 我不知道XXX的具体需求 xff0c 所以会以我认知的
  • 面试——测试基础理论

    测试先导性知识 测试是什么 xff1f 在规定的条件下对程序进行操作去发现错误 xff0c 然后对软件质量进行评估的一个过程 需要注意的是 xff0c 软件是由文档 数据以及程序组成的 xff0c 所以对软件测试应该包括 xff1a 软件形
  • 【ubuntu16.04 LTS】 ping www.baidu.com不通

    想更新一个软件包 xff0c 发现ubuntu不能正常更新 xff0c 结果ping www baidu com不通 xff0c 但是ping ip 可能 xff0c 所以认为是DNS没有配置 解决方法 xff1a 1 xff0c 既然能p
  • 小鼠试毒问题(二进制)

    1000桶酒 xff0c 其中1桶有毒 而一旦吃了 xff0c 毒性会在1周后发作 问最少需要多少只老鼠可在一周内找出毒酒 如题 分析思路 xff1a 要用尽可能少的老鼠完成相对大的任务量 xff0c 要想到把问题进行对数分解 从而不难想到
  • wsl,Ubuntu,关于解决E: Could not read response to hello message from hook [ ! -f /usr/bin/snap ] || /usr/

    大坑 出现问题 xff1a 今天安装mysql xff0c sudo apt span class token operator span get install mysql span class token operator span s
  • wsl,win10子系统Ubuntu,安装mysql过程及坑

    一 安装 sudo apt span class token operator span get install mysql span class token operator span server 二 启动服务 注意 xff1a 先停止
  • 外接显示器调亮度解决方案(最低亮度后还是很亮)

    出现的问题 xff1a 手动调显示屏调亮度的键 xff0c 发现调到最低亮度后还是很亮 解决方案 xff1a 使用显卡设置来调整 win10 xff1a 桌面右键 英特尔显卡设置 显示器 颜色设置 选择显示器 应用
  • Java-线程,多线程同步安全案例,多窗口卖票一共有 50张票 ,4个窗口出售,打印出票售出的顺序。

    一共有 50张票 xff0c 4个窗口出售 xff0c 打印出票售出的顺序 span class token keyword package span com span class token punctuation span proble
  • tcp连接的select

    tcp的socket不同于udp tcp xff1a 建立socket的fd xff1b bind xff1b listen xff1b accept xff1b send or recv 另一端connect xff08 客户端 xff0
  • ROS NOETIC 思岚激光雷达A2M8启动历程

    Ubuntu20 04系统 xff0c 装的ROS对应为NOETIC版本 第一个bug 一直在catkin make这里出错 xff0c 我的工作空间 xff08 我也命名为catkin ws xff09 在catkin make之后 xf
  • 解决ubuntu网络调节助手之后打不开

    解决ubuntu安装deb文件之后打不开问题 xff08 安装libqtgui4 amd64 xff09 安装Ubuntu网络调试助手 链接 xff1a https pan baidu com s 1GSq pi1FOZxHFnY7PMBh
  • VSCODE中运行C语言(从安装到运行详细版)

    VSCODE中运行C语言 xff08 从插件安装到运行详细版 xff09 一 下载安装MinGW w64 官方下载网站 xff1a MinGW 64 往下来进入下一张页面图 xff0c 选择要下载的文件 二 环境变量配置 按照上面的步骤全部
  • 【ubuntu16.04 LTS】ping百度通,但浏览器打不开百度网页

    典型的DNS配置问题 1 xff0c 执行如下命令 span class token function sudo span span class token function vi span etc resolv conf 在文件最后添加
  • VLAN类型

    大家好呀 xff0c 我是请假君 xff0c 今天又来和大家一起学习数通了 xff0c 今天要分享的知识是VLAN类型 一 基于端口的VLAN xff1a 基于端口的VLAN是最简单 最有效的VLAN划分方法 xff0c 它按照设备端口来定
  • STM32开发(三) 使用printf 重定位到串口输出|CSDN创作打卡

    上一篇 主目录 下一篇 文章目录 背景 KEIL MDK环境下printf重定位串口输出 第一步 在KEIL MDK中使用MicroLIB如图中勾选 第二步 STM32Cube MX异步配置 第三步 KEIL代码演示 代码使用Cube 注意
  • 总线(二)CAN通讯协议介绍

    文章目录 CAN xff08 Controller Area Network xff09 是什么 xff1f 总线拓扑图CAN特征CAN协议数据帧遥控帧遥控帧和数据帧相关 xff1f 仲裁优先级决定数据帧和遥控帧的优先级标准格式和扩展格式的
  • CAN 简介

    1 目的 本文主要介绍一部分 CAN 协议层 2 CAN 简介 这里的内容参考的是 1991 9 的 2 0 版本的官方 CAN 规格书 2 1 概述 CAN 控制器局域网 是一种串行通讯协议 xff0c 传输速度可达 1Mbit s 总线
  • I2C 简介

    1 I2C 简介 这里的内容参考的是 2014 4 4 的 V 6 版本的官方 I2C Bus 规格书 xff0c 第六章有给出相应的链接 1 1 引脚 I2C 一般而言是一种同步半双工的通信方式 xff0c 所以除了电源引脚之外 xff0
  • MPC5744 烧录一直停留在 98% 的解决方法

    1 目的 本人在调试一块主控为 MPC5744 的板子时 xff0c 有时候在烧录时 xff0c 发现烧录总是停在 98 xff0c 卡在 CRC 这里 xff0c 在查找和看资料之后 xff0c 发现了几种解决方法 xff1a 使用 pe