S32K flash擦除异常以及flash保护 (FLASH_DRV_CommandSequence函数异常)

news2024/11/24 19:48:13

出现问题

出现擦除flash异常,一直在FLASH_DRV_CommandSequence卡死复位


但是出现比较奇怪的现象,通过DEBUG在线调试,打断点,一步一步调试可以正常对flash正常擦除读写,但是脱离在线调试就出现不能正常擦除读写。

出现这种还是看下官网例程怎么写的?打开S32DS ,NXP的官方例程

CLOCK_SYS_Init(g_clockManConfigsArr, CLOCK_MANAGER_CONFIG_CNT,
            g_clockManCallbacksArr, CLOCK_MANAGER_CALLBACK_CNT);
    CLOCK_SYS_UpdateConfiguration(0U, CLOCK_MANAGER_POLICY_AGREEMENT);

    /* Init source data */
    for (i = 0u; i < BUFFER_SIZE; i++)
    {
        sourceBuffer[i] = i;
    }

    /* Disable cache to ensure that all flash operations will take effect instantly,
     * this is device dependent */

    /* Install interrupt for Flash Command Complete event */
    INT_SYS_InstallHandler(FTFC_IRQn, CCIF_Handler, (isr_t*) 0);
    INT_SYS_EnableIRQ(FTFC_IRQn);

    /* Enable global interrupt */
    INT_SYS_EnableIRQGlobal();

    /* Always initialize the driver before calling other functions */
    ret = FLASH_DRV_Init(&Flash_InitConfig0, &flashSSDConfig);
    DEV_ASSERT(STATUS_SUCCESS == ret);

//#if ((FEATURE_FLS_HAS_FLEX_NVM == 1u) & (FEATURE_FLS_HAS_FLEX_RAM == 1u))
    /* Config FlexRAM as EEPROM if it is currently used as traditional RAM */
    if (flashSSDConfig.EEESize == 0u)
    {


        /* Configure FlexRAM as EEPROM and FlexNVM as EEPROM backup region,
         * DEFlashPartition will be failed if the IFR region isn't blank.
         * Refer to the device document for valid EEPROM Data Size Code
         * and FlexNVM Partition Code. For example on S32K144:
         * - EEEDataSizeCode = 0x02u: EEPROM size = 4 Kbytes
         * - DEPartitionCode = 0x08u: EEPROM backup size = 64 Kbytes */
        ret = FLASH_DRV_DEFlashPartition(&flashSSDConfig, 0x02u, 0x08u, 0x0u, false, true);
        DEV_ASSERT(STATUS_SUCCESS == ret);

        /* Re-initialize the driver to update the new EEPROM configuration */
        ret = FLASH_DRV_Init(&Flash_InitConfig0, &flashSSDConfig);
        DEV_ASSERT(STATUS_SUCCESS == ret);

        /* Make FlexRAM available for EEPROM */
        ret = FLASH_DRV_SetFlexRamFunction(&flashSSDConfig, EEE_ENABLE, 0x00u, NULL);
        DEV_ASSERT(STATUS_SUCCESS == ret);
    }
    else    /* FLexRAM is already configured as EEPROM */
    {
        /* Make FlexRAM available for EEPROM, make sure that FlexNVM and FlexRAM
         * are already partitioned successfully before */
        ret = FLASH_DRV_SetFlexRamFunction(&flashSSDConfig, EEE_ENABLE, 0x00u, NULL);
        DEV_ASSERT(STATUS_SUCCESS == ret);
    }

    /* Set callback function before a long time consuming flash operation
     * (ex: erasing) to let the application code do other tasks while flash
     * in operation. In this case we use it to enable interrupt for
     * Flash Command Complete event */
    pCallBack = (flash_callback_t)CCIF_Callback;
    flashSSDConfig.CallBack = pCallBack;

    /* Erase the last PFlash sector */
    address = FEATURE_FLS_PF_BLOCK_SIZE - FEATURE_FLS_PF_BLOCK_SECTOR_SIZE;
    size = FEATURE_FLS_PF_BLOCK_SECTOR_SIZE;
    ret = FLASH_DRV_EraseSector(&flashSSDConfig, address, size);
    DEV_ASSERT(STATUS_SUCCESS == ret);

    /* Disable Callback */
    flashSSDConfig.CallBack = NULL_CALLBACK;

    /* Verify the erase operation at margin level value of 1, user read */
    ret = FLASH_DRV_VerifySection(&flashSSDConfig, address, size / FTFx_DPHRASE_SIZE, 1u);
    DEV_ASSERT(STATUS_SUCCESS == ret);

    /* Write some data to the erased PFlash sector */
    size = BUFFER_SIZE;
    ret = FLASH_DRV_Program(&flashSSDConfig, address, size, sourceBuffer);
    DEV_ASSERT(STATUS_SUCCESS == ret);

    /* Verify the program operation at margin level value of 1, user margin */
    ret = FLASH_DRV_ProgramCheck(&flashSSDConfig, address, size, sourceBuffer, &failAddr, 1u);
    DEV_ASSERT(STATUS_SUCCESS == ret);

最关键,也比较特别的地方

void CCIF_Handler(void);
/* If target is flash, insert this macro to locate callback function into RAM */
START_FUNCTION_DECLARATION_RAMSECTION
void CCIF_Callback(void)
END_FUNCTION_DECLARATION_RAMSECTION
void CCIF_Handler(void)
{
    /* Disable Flash Command Complete interrupt */
    FTFx_FCNFG &= (~FTFx_FCNFG_CCIE_MASK);

    return;
}

/*!
  \brief Callback function for Flash operations
*/
START_FUNCTION_DEFINITION_RAMSECTION
void CCIF_Callback(void)
{
    /* Enable interrupt for Flash Command Complete */
    if ((FTFx_FCNFG & FTFx_FCNFG_CCIE_MASK) == 0u)
    {
        FTFx_FCNFG |= FTFx_FCNFG_CCIE_MASK;
    }
}
END_FUNCTION_DEFINITION_RAMSECTION

START_FUNCTION_DEFINITION_RAMSECTION、END_FUNCTION_DEFINITION_RAMSECTION这是成对使用的,表示中间这部分代码要放在RAM中执行。如果目标是flash,请插入此宏以将回调函数定位到RAM中。因为操作flash这部分代码是没有在加载在RAM中,导致操作flash出现异常,所以操作flash时要添加前面两个宏,把程序加载到RAM中,特别是操作FTFx_FCNFG这个寄存器。

介绍S32K Flash

对Flash擦除,bit0置为1的过程,擦除完的扇区基本是0xffff…。写入数据,一般是将1置为0.
S32K144芯片有512K,地址0-0x0007_ffff,每个扇区的大小是4K,共有128个扇区,这里Flash是Program Flash(P_Flash 程序Flash)。还有Data Flash(D_Flash 数据Flash),有16个扇区,64K。4K的EEPROM

flash保护


对于未加密芯片,,可以通过调试接口(JTAG、SWD和USBDM等)访问芯片内部的存储器;而对于加密芯片,通过外部调试接口只能进行整体擦除操作,但无法执行读取或写入Flash的指令,运行MCU程序对Flash访问则不受任何影响。

通过对Flash安全配置域设置,可以配置程序Flash保护寄存器FTFS_FPROT、Flash安全寄存器FTFS_FSEC及Flash_选项寄存器FTFS_FOPT,EEPROM保护寄存器是FEPROT(最小的保护单元,整个EEPROM的1/8),D-Flash保护寄存器是FEPROT,从而限制对Flash存储空间的访问。Flash存储器的地址0x0000_0400~0x0000_0410为Flash配置域,16个字节,含义如下。
通过配置寄存器PROT0~3可以对整个P-Flash进行保护,保护的最小单元为整个PFlash的1/32,比如S32K144有512KB的P-Flash,其最小保护单元为16KB,而S32K116只
有128KB P-Flash,所以其保护的最小单元为4KB。保护的规则是只增加不减少,即当前未保
护的区域可以增加保护,但当前已经保护的区域则不能解保护

0x400~0x407:存储器8个字节的后门解密秘钥(backdoor key),用于使能后门
解密时临时解密MCU;
0x408~0x40B:P-Flash保护(Protection)配置字节,其值在MCU复位过程中由
硬件自动加载到P-Flash保护寄存器(FPTOT0~3)作为其初始值;  FPTOT
0x40C:Flash加密(Security)配置字节,其值在MCU复位过程中由硬件自动加载
到P-Flash加密寄存器(FSEC)作为其初始值;   FDPROT
0x40D:Flash非易失选项配置字节,其值在MCU复位过程中由硬件自动加载到
Flash非易失选项寄存器(FOPT)作为其初始值;  FEPROT
0x40E:EEPROM保护配置字节,其值在MCU复位过程中由硬件自动加载到
EEPROM保护寄存器(FEPROT)作为其初始值;     FOPT
0x40F:D-Flash保护配置字节,其值在MCU复位过程中由硬件自动加载到DFlash保护寄存器(FDPROT)作为其初始值    FSEC

通过修改启动文件,即可设置保护Flash,十分方便。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/747104.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大模型基础之大语言模型的进展

关键字&#xff1a;LLM大语言模型&#xff0c;fine-tuning微调 预训练语言模型的两种范式 1 特征提取器 提取语言的特征和表示&#xff0c;作为下游模型的输入。例如有名的word2vec模型。 use the output of PLMs as the input of downstream model 2 fine-tuning&#xf…

【代码随想录 | Leetcode | 第一天】数组 | 二分查找 | 边界问题 | 34-35-69-367-704

前言 欢迎来到小K的Leetcode|代码随想录|专题化专栏&#xff0c;今天将为大家带来二分查找边界问题&#xff08;循环不变量规则&#xff09;的分享✨ 目录 前言704. 二分查找367. 有效的完全平方数69. x 的平方根35. 搜索插入位置34. 在排序数组中查找元素的第一个和最后一个位…

PN结、形成过程、单向导电性、伏安特性、电容效应

目录 1.1.3PN结 PN结形成过程&#xff1a; PN结的单向导电性&#xff1a; PN结的伏安特性 PN结的电容效应 1.1.3PN结 形成&#xff1a;由于扩散运动而形成 扩散运动&#xff1a;物质总是从浓度高的地方向浓度低的地方运动&#xff0c;这种由于浓度差而产生的运动称为扩散运…

微服务 云原生:微服务相关技术简要概述

后端架构演进 单体架构 所谓单体架构&#xff0c;就是只有一台服务器&#xff0c;所有的系统、程序、服务、应用都安装在这一台服务器上。比如一个 bbs 系统&#xff0c;它用到的数据库&#xff0c;它需要存储的图片和文件等&#xff0c;统统都部署在同一台服务器上。 单体架…

ubuntu20.04配置vscode

下载&#xff1a; https://az764295.vo.msecnd.net/stable/660393deaaa6d1996740ff4880f1bad43768c814/code_1.80.0-1688479026_amd64.debhttps://az764295.vo.msecnd.net/stable/660393deaaa6d1996740ff4880f1bad43768c814/code_1.80.0-1688479026_amd64.deb 安装&#xff1a…

MySQL基础篇第9章(子查询)

文章目录 1、需求分析与问题解决1.1 实际问题1.2 子查询的基本使用1.3 子查询的分类 2、单行子查询2.1 单行比较操作符2.2 代码示例2.3 HAVING中的子查询2.4 CASE中的子查询2.5 子查询中的空值问题2.6 非法使用子查询 3、多行子查询3.1 多行比较操作符3.2 代码示例3.3 空值问题…

vuepress - - - 首页底部版权信息加a标签超链接跳转或备案信息跳转链接

修改前 默认的底部版权信息只能填写纯文本&#xff0c;加不了超链接跳转等。 对应\docs\README.md内容&#xff1a; 修改后 修改后&#xff0c;点击Zichen跳转会打开新的网页。 看官网例子 底部添加了备案号跳转链接。 找到官网的github部署的文件。点导航栏中的“指…

flutter开发实战-实现webview与Javascript通信JSBridge

flutter开发实战-实现webview与H5中Javascript通信JSBridge 在开发中&#xff0c;使用到webview&#xff0c;flutter实现webview是使用原生的插件实现&#xff0c;常用的有webview_flutter与flutter_inappwebview 这里使用的是webview_flutter&#xff0c;在iOS上&#xff0c;…

【IMX6ULL驱动开发学习】20. input子系统(按键实现ls命令)

一、input子系统相关结构体 二、input子系统实例实现&#xff1a; static struct input_dev *key_input;...... ....../* 1.申请空间 */ key_input input_allocate_device(); if(key_input NULL){printk("input alloc failed\n");return -ENOMEM; } /* 2.设置事件类…

Go实现WebSocket

Go语言标准包里面没有提供对WebSocket的支持&#xff0c;但是在由官方维护的go.net子包中有对这个的支持&#xff0c;你可以通过如下的命令获取该包&#xff1a; go get golang.org/x/net/websocket WebSocket分为客户端和服务端&#xff0c;接下来我们将实现一个简单的例子:…

云进销存是什么意思,云进销存系统该如何选?

云进销存是指基于云计算技术的一种进销存管理系统&#xff0c;云进销存系统可以帮助企业或中小商户实时监控库存情况、优化采购和销售流程、提高物流效率&#xff0c;以及生成各类报表和统计分析&#xff0c;从而提升企业或商户的运营效率和管理水平。 一、云进销存对中小商户有…

C#,数值计算——不完全 Beta 函数(incomplete beta function)的源代码

Incomplete Beta Function The incomplete beta function (also called the Euler Integral) is a generalized β-function; An independent integral (with integral bounds from 0 to x) replaces the definite integral. The formula is: Where: 0 ≤ x ≤ 1, a, b > 0…

Pro白嫖esri数据

最近用Pro比较多,想跟大家谈谈一些关于Pro的 技巧。在谈之前,我想问大家一个问题,你真的了解ArcGIS Pro吗? 我想大多数刚刚接触Pro的用户应该是把Pro当做像Map一样的数据处理分析工具,只是简单的从其他地方下载数据来加入工程进行处理和分析 或许在你眼里的Pro和Map仅有…

在Orangepi上使用raspberry的dashboard

树莓派实验室整了一个比较酷的dashboard&#xff0c;可以用来显示树莓派状态&#xff0c;主要内容是基于js和php来实现&#xff0c;因为orangepi的用户名和密码都是一个套路&#xff0c;首先想到能不能移植。 https://www.rstk.cn/news/860562.html?actiononClick 首先需要做…

Docker把公共镜像推送到harbor私服的流程(企业级)

如果构建项目时&#xff0c;使用了k8s docker Jenkins的模式。 那么我们在docker构建镜像时&#xff0c;如果需要使用了Nodejs&#xff0c;那么我们必须得从某个资源库中拉取需要的Nodejs。 在企业里&#xff0c;正常都会把自己项目涉及的库都放在harbor私服里。 下面讲一下&…

数据分类分级

数据分类是数据管理的第一步&#xff0c;是数据治理的先行条件。当前&#xff0c;数据应用方兴未艾。“数据”作为新的生产要素资源&#xff0c;支撑供给侧结构性改革、驱动制造业转型升级的作用日益显现&#xff0c;正成为推动质量变革、效率变革、动力变革的新引擎。但与此同…

python3+requests+unittest实战系列【二】

前言&#xff1a;上篇文章python3requestsunittest&#xff1a;接口自动化测试&#xff08;一&#xff09;已经介绍了基于unittest框架的实现接口自动化&#xff0c;但是也存在一些问题&#xff0c;比如最明显的测试数据和业务没有区分开&#xff0c;接口用例不便于管理等&…

ROS中bag的录制、播放和使用

文章目录 前言一、bag录制二、bag信息查看三、bag播放四、bag的使用&#xff08;以A-LOAM为例&#xff09; 前言 传感器获取到的信息&#xff0c;有时我们可能需要实时处理&#xff0c;有时可能只是采集数据&#xff0c;事后分析&#xff0c;比如: 机器人导航实现中&#xff0…

Tomcat 基础

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、概述 二、安装 三、 目录结构 四、启停 五、配置文件 1. server.xml (1) Server (2) Listener (3) GlobalNamingResources (4) Service 01.Connector (1) port…

硬件故障恢复出文件之后数据库故障处理---惜分飞

客户那边硬件故障(raid损坏磁盘超过了极限,导致raid offline),通过硬件恢复出来数据文件,然后尝试自行恢复,我接手的时候大量数据文件resetlogs scn异常. 重建控制文件报错 WARNING: Default Temporary Tablespace not specified in CREATE DATABASE command Default Tempora…