大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是i.MXRT1170 MECC64功能特点及其保护片内OCRAM1,2之道

  ECC是 “Error Correcting Code” 的简写,ECC 能够实现错误检查和纠正,含有 ECC 功能的内存一般称为 ECC 内存,使用了 ECC 内存的系统在稳定性和可靠性上得到很大提升。相比前几代不带 ECC 的 i.MXRT10xx 型号,新一代 i.MXRT1170 在ECC上做了全面武装,从 eFuse 到 FlexRAM,从 OCRAM 到外部存储空间全都加上了 ECC 功能。如下表所示,不同类型的存储由不同的 ECC 控制器来守护:

  今天痞子衡给大家简单介绍一下 i.MXRT1170 上用于保护片内 OCRAM1,2 的 MECC64 功能:

一、MECC64功能简介

1.1 MECC64特点

  从用户角度来说,其实 MECC64 的设计特别简单,当 MECC64 使能后,任何对受保护的 OCRAM1/2 发起的 AXI 访问都会被 MECC64 模块接管,MECC64 组件负责根据用户写入的数据产生 ECC 校验值并将其存放于专用 OCRAM1/2_ECC 里,读访问时根据用户读取的地址从相应 OCRAM1/2_ECC 地址处获取 ECC 检验值并做检验处理后再返回数据。

  从模块框图里看一个 MECC64 里有四个 ECC 小单元(也对应四个 RAM Bank 控制器),这其实是跟单个 512KB OCRAM 由四个 128KB Bank 组成一一对应的,这样便于转化 AXI64 接口到 RAM 接口。

1. OCRAM 四个 Bank 挂载在 AXI64 系统总线上,AXI[1:0] 决定了访问得是 Bank0-3,这样的设计可以支持对不同 Bank 的读、写操作同时进行。
2. ECC 计算单元是 64bits,这 64bits 数据必须在同一 Bank 里,这个设计对 ECC 初始化操作影响较大,因此避免用 memset 函数去做初始化(STR指令是 byte access)。

  MECC64 模块一共有两个,分别是 MECC1、MECC2,分别对应保护 OCRAM1、OCRAM2。此外还有两个专用 OCRAM1_ECC、 OCRAM2_ECC 存放 ECC 校验值(当 MECC64 没使能时,OCRAM1/2_ECC 也可当作普通 OCRAM 使用)。

MECC1 base address: 4001_4000h
MECC2 base address: 4001_8000h

1.2 关于MECC64设计细节

  关于 MECC64 基本概念,参看《简析i.MXRT1170 Cortex-M7 FlexRAM ECC功能特点、开启步骤、性能影响》 的 1.2节,这里不予赘述。

1.2.1 MECC64检验能力

  MECC64 中每 64bits 数据就会计算出一个 ECC 校验值(8bits),ECC 算法用得是经典的 Hsiao Hamming。

存储类型 ECC校验数据块大小 ECC校验值长度 ECC校验能力
Raw NAND 512 bytes 4 bytes 5-bit检错,4-bit纠错
MECC64 64bits 8bits 2-bit检错,1-bit纠错
1.2.2 ECC错误触发处理

  ECC 错误分两种,分别是 1-bit 错误和 2-bit 错误(针对 64bits 数据而言)。从软件层面来看,1-bit 错误可以不用管,MECC64 模块会自动纠错。我们主要处理 2-bit 错误,由于 2-bit 错误仅能检错,无法纠错,所以发生了这个错误,就意味着读取的数据不可靠了。对于 1/2 bit错误,MECC64 均提供了中断响应(MECCx_INT_IRQn / MECCx_FATAL_INT_IRQn)。

  这里还需要特别提醒一下,当读访问是 64bits 时,发生 ECC 错误仅产生一次 ECC 中断,但是如果是 32/16/8bits 读访问则会连续产生两次 ECC 中断,因为 ECC 校验总是以 64bits 为基本数据单元。

二、开启MECC64的步骤

2.1 激活MECC64特性

  芯片出厂,默认是没有激活 MECC64 特性的,如果需要开启 MECC64,需要烧写 efuse,fusemap 中 0x840[2] 对应的是 MECC_ENABLE bit,我们需要将这个 bit 烧写成 1,才能激活 MECC64 特性。

2.2 SDK驱动初始化MECC64

  然后可以直接利用 SDK 里的 fsl_mecc 驱动对 MECC64 模块进行初始化,代码非常简单,如下示例代码就是初始化 MECC1,使能 OCRAM1 区域的读写 ECC 功能:

#include "fsl_mecc.h"

void init_mecc(void)
{
mecc_config_t config;
MECC_GetDefaultConfig(&config); // 使能 MECC64,并且指明受保护的 OCRAM 空间
config.enableMecc = true;
config.Ocram1StartAddress = 0x20240000;
config.Ocram1EndAddress = 0x202BFFFF; // 初始化 MECC64 模块,并且初始化 OCRAM 区域为全 0
MECC_Init(MECC1, &config);
}

  进 MECC_Init() 函数内部可以看到其对 OCRAM 区域的初始化用得是 64bits 赋值,这样可以保证正确生成首次 ECC 校验值,等 OCRAM 区域全部初始化过后,底下就可以对 OCRAM 进行任意数据长度的访问了。

2.3 AXI方式读写OCRAM区域

  现在我们直接调试 \SDK_2_14_0_MIMXRT1170-EVKB\boards\evkbmimxrt1170\driver_examples\mecc\mecc_single_error\cm7\iar 工程,跑到 MECC 初始化结束后,打开 Memory 窗口,可以看到 OCRAM1 区域(0x20240000 - 0x202BFFFF) 已经是全 0,OCRAM1_ECC 区域(0x20340000 - 0x2034FFFF)也是全 0。但是往 0x20240020 处写入 8 字节测试数据后,并没有看到 OCRAM1_ECC 区域有数据上的变化,说明 ECC 校验码数据是受保护的,仅能被 MECC64 模块访问,对用户不可见。

三、激活MECC64特性后的影响

  前面讲到 fusemap 中 0x840[2] 对应的是 MECC_ENABLE bit,这个 bit 被烧录为 1 后,我们还需要初始化 MECC64 模块里(打开MECC->PIPE_ECC_EN[ECC_EN])才能真正开启 OCRAM ECC 功能,但是别忘了芯片参考手册里 MECC64 章节有一个提醒:

  是的,BootROM 上电运行,第一件事就是检查 fuse MECC_ENABLE bit 位,如果已经置 1,那就立刻开启 MECC1 和 MECC2 模块的 PIPE_ECC_EN[ECC_EN],即启用 OCRAM ECC,但是 BootROM 并没有初始化全部 OCRAM1 和 OCRAM2 区域,仅仅初始化了 OCRAM1 前 48KB,这部分是 BootROM 程序的 RW 区。

  痞子衡找了两块 RT1170 板卡做了对比测试(芯片设为 Serial Downloader模式,挂上 JLink 读取内存),未激活 MECC64 特性的芯片 OCRAM 区域读取出来全是随机值,而激活了 MECC64 特性的芯片仅 ROM RW 区被初始化了以及 OCRAMx_ECC 不可访问外,其余区域全是随机值(这里的读取其实不太可靠,毕竟使能了 ECC 后首次访问必须是写,然后才能正常被读写)。

  对于激活了 MECC64 特性之后的芯片,无论是设计下载算法还是 IDE 里的初始化脚本,或者 App 应用里的变量访问,如果涉及到 ROM RW 区之外的 OCRAM1,OCRAM2 区域,建议一律做先写后读处理,否则可能会出现奇怪的错误。

  至此,i.MXRT1170 MECC64功能特点及其保护片内OCRAM1,2之道痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

文章会同时发布到我的 博客园主页CSDN主页知乎主页微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:简析i.MXRT1170 MECC64功能特点及其保护片内OCRAM1,2之道的更多相关文章

  1. 痞子衡嵌入式:简析i.MXRT1170 XECC功能特点及其保护串行NOR Flash和SDRAM之道

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1170 XECC功能特点及其保护串行NOR Flash和SDRAM之道. ECC 是 "Error Correc ...

  2. 痞子衡嵌入式:揭秘i.MXRT1170 eFuse空间访问可靠性的保护策略(冗余与ECC)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MXRT1170的eFuse空间访问可靠性保护策略. 关于i.MXRT系列的eFuse/OTP,痞子衡之前在介绍Boot时写过 ...

  3. 痞子衡嵌入式:在i.MXRT1170上启动含DQS的Octal Flash可不严格设Dummy Cycle (以MT35XU512为例)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是Octal或Hyper Flash上DQS信号与Dummy Cycle联系. 关于在 i.MXRT 上启动 NOR Flash 时如何设 ...

  4. 痞子衡嵌入式:揭秘i.MXRT1170上用J-Link连接复位后PC总是停在0x223104的原因

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170上安全调试策略实现对JLink调试的影响. 痞子衡之前写过一篇旧文 <i.MXRT600的ISP模式下用J-L ...

  5. 痞子衡嵌入式:揭秘i.MXRT1170上串行NOR Flash双程序可交替启动设计

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170上串行NOR Flash双程序可交替启动设计. 在上一篇文章 <i.MXRT1060/1010上串行NOR F ...

  6. 痞子衡嵌入式:聊聊i.MXRT1170双核下不同GPIO组的访问以及中断设计

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170双核下不同GPIO组的访问以及中断设计. 在双核 i.MXRT1170 下设计应用程序,有一个比较重要的考虑点就是外 ...

  7. 痞子衡嵌入式:简析i.MXRT1170 Cortex-M4 L-MEM ECC功能特点、开启步骤、性能影响

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是恩智浦i.MXRT1170上Cortex-M4内核的L-MEM ECC功能. 本篇是 <简析i.MXRT1170 Cortex-M ...

  8. 痞子衡嵌入式:简析i.MXRT1170 Cortex-M7 FlexRAM ECC功能特点、开启步骤、性能影响

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是恩智浦i.MXRT1170上Cortex-M7内核的FlexRAM ECC功能. ECC是"Error Correcting ...

  9. 痞子衡嵌入式:测一测i.MXRT1170 Raw NAND启动时间(从POR到进App的Reset_Handler)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1170 Raw NAND启动时间. 关于i.MXRT1170这颗划时代的MCU,痞子衡去年10月在其刚发布的时候, ...

  10. 痞子衡嵌入式:大话双核i.MXRT1170之Cortex-M7与Cortex-M4互相激活之道

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是恩智浦i.MXRT1170上Cortex-M7与Cortex-M4内核互相激活的方法. 痞子衡最近在深耕i.MXRT1170这颗划时代的 ...

随机推荐

  1. SQL运用full join连接,decode函数,nvl函数进行列转行

    背景说明:full join连接,decode函数,nvl函数,结合生产背景理解更深刻: test_A表是现金业主某时间段的收益:test_B表是非现金业主某时间段的收益:对于业主,test_A表与t ...

  2. 聊聊基于Alink库的推荐系统

    概述 Alink提供了一系列与推荐相关的组件,从组件使用得角度来看,需要重点关注如下三个方面: 算法选择 推荐领域有很多算法,常用的有基于物品/用户的协同过滤.ALS.FM算法等.对于不同的数据场景, ...

  3. 2022 ICPC 杭州站

    gym 知乎 尝试先读题而不是写缺省源感觉不太好 E 一头雾水.F 是签到就先上去写了,结果读错题交了个样例都没过的代码,小改了一下就过了.G 不太会做.zsy 把 M 丢给我想了一下 然后 gjk ...

  4. C#/.NET/.NET Core优秀项目和框架2023年9月简报

    前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(公众号每周至少推荐两个优秀的项目和框架当然节假日除外),公众号推文有项目和框架的介绍.功能特点以及部分截图等(打不开或 ...

  5. c语言代码练习1

    //输出1-n阶乘的和,n为输入值//计算n的阶乘可以使用for循环,也可使用while循环#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h ...

  6. Dubbo3应用开发—Dubbo服务管理平台DubboAdmin介绍、安装、测试

    Dubbo服务管理平台 DubboAdmin的介绍 Dubbo Admin是Apache Dubbo服务治理和管理系统的一部分. Dubbo Admin提供了一套用于服务治理的Web界面,让我们可以更 ...

  7. Django——后台添加的用户密码错误

    django项目中,当我们创建了user模型类,并生成了超级管理员,之后我们进入到admin后台页面中,添加一个用户,再去login页面登陆时,会提示我们 用户名或密码错误. 这时,我们第一时间会想到 ...

  8. 创建及管理DSW实例

      机器学习PAI 产品概述 快速入门 操作指南 准备工作 工作空间管理 AI计算资源管理 AI开发 开发流程 快速开始 智能标注(iTAG) 可视化建模(PAI-Designer) 交互式建模(PA ...

  9. mooc第四单元《管理团队》单元测试

    第四单元<管理团队>单元测试 返回 本次得分为:6.00/10.00, 本次测试的提交时间为:2020-08-30, 如果你认为本次测试成绩不理想,你可以选择 再做一次 . 1 判断(2分 ...

  10. 算法修养--A*寻路算法

    A*寻路算法 广度优先算法 广度优先算法搜索以广度做未优先级进行搜索. 从起点开始,首先遍历起点周围邻近的点,然后再遍历已经遍历过的点邻近的点,逐步的向外扩散,直到找到终点. 这种算法就像洪水(Flo ...