0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MKE14F512VLL16 FlexNVM操作步骤说明

li1756686189 来源:嵌入式 MCU 作者:嵌入式 MCU 2022-10-24 17:45 次阅读

使用MKE14F512VLL16 来初始化/读/写 FlexNVM。FlexNVM没有被正确的处理。
FlexNVM 操作步骤如下:
——Flash 初始化
. RunDFlashHandler() -> SetupDFlash() -> FLASH_Init()
——Flash 擦除
. RunDFlashHandler() -> if (gFlash.data.u08Mode == DFLASH_ERASE) -> SetCoreAsRunMode()/FLASH_Erase()/SetCoreAsHSRunMode()
——Flash 写
. RunDFlashHandler() -> else if (gFlash.data.u08Mode == DFLASH_WRITE) -> SetCoreAsRunMode() / FLASH_Program() & ReadE2PDFlash() / SetCoreAsHSRunMode()
——Flash 读
. RunDFlashHandler() -> else if (gFlash.data.u08Mode == DFLASH_READ) -> ReadE2PDFlash()

> FlexNVM 操作问题描述
- Erase -> Write(8Byte) -> Read : 读失败/写入的数据不能读出
- Erase -> Read :擦除前的数据被读出
- Erase -> Write(8Byte) ->延迟或者复位-> Read :读取成功

FlexNVM 直接读取失败,当写入数据到 FlexNVM后,执行延迟或者复位操作,可以正确的读取到写入的数据。MKE14F 推测预取缓冲区相关的函数:

mscm_flash_prefetch_speculation_enable。用Bootloader将固件写入到 Flash中,在引导加载程序中,未使用缓存。这种情况下,是否需要在引导加载程序中应用以下功能函数?

Flash_cache_clear_process与mscm_flash_prefetch_speculation_enable

解答:

检查 LMEM_PCCLCR寄存器的LCIVB ,如果有 cache命中事件,则 LCIVB应该是 "1", 如果 cache没有命中,则 LCIVB 是 "0"。

bf85fb48-537f-11ed-a3b6-dac502259ad0.png

程序 Flash和 数据Flash的空间分别是 0x0000-0x7FFFF(512k, bank0) 和0x10000000-0x10010000 (64k flexNVM, bank1) 。程序Flash 可以用来存储代码和数据,FlexNVM是非易失性的存储器,可以执行程序代码,保存数据或者备份的 EEPROM数据。

> 解决方案:
- 替代 Flash 驱动,从v2.1.0 更换到 v2.3.1,如下是 v2.3.1的 Flash驱动。

bfbd747e-537f-11ed-a3b6-dac502259ad0.png

- 应用强制写模式
LMEM->PCCCR |= LMEM_PCCCR_INVW1_MASK | LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_PCCR2_MASK |LMEM_PCCCR_PCCR3_MASK;

当使用以下代码使缓存无效后读取FlexNVM区域时,没有出现读取失败现象。如下是解决方案:

> Cache Invalidate 方法


// 写数据到FlexNVM
/* Enables the processor code bus to invalidate all lines in both ways.
and Initiate the processor code bus code cache command. */
LMEM->PCCCR |= LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK | LMEM_PCCCR_GO_MASK;
/* Wait until the cache command completes. */
while ((LMEM->PCCCR & LMEM_PCCCR_GO_MASK) != 0U)
{
}
/* As a precaution clear the bits to avoid inadvertently re-running this command. */
LMEM->PCCCR &= ~(LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK);
// 从 FlexNVM 读取数据

为什么应用缓存失效后读取失败会消失?缓存无效清除了读取失败现象。但这似乎不是一个解决方案。根本原因是cache 是使能的,但是 FlexNVM 在 write-through 模式下不能工作。数据不会写入目标地址,而是写入高速缓存,读取的数据从高速缓存中读取,因此读取的数据和写入的数据可能不同。根据修改后的SDK FlexNVM示例复制了问题,发现有两种方法可以解决问题:

1) 在SystemInit 函数中禁止 Cache功能

void SystemInit (void) {
#if ((__FPU_PRESENT == 1) && (__FPU_USED == 1))
SCB->CPACR |= ((3UL << 10*2) | (3UL << 11*2)); /* set CP10, CP11 Full Access */
#endif /* ((__FPU_PRESENT == 1) && (__FPU_USED == 1)) */

#if (DISABLE_WDOG)
WDOG->CNT = WDOG_UPDATE_KEY;
WDOG->TOVAL = 0xFFFF;
WDOG->CS = (uint32_t) ((WDOG->CS) & ~WDOG_CS_EN_MASK) | WDOG_CS_UPDATE_MASK;
#endif /* (DISABLE_WDOG) */

/* Initialize Cache */
/* Enable Code Bus Cache */
/* set command to invalidate all ways, enable write buffer
and write GO bit to initiate command */
// LMEM->PCCCR |= LMEM_PCCCR_INVW1_MASK | LMEM_PCCCR_INVW0_MASK;
// LMEM->PCCCR |= LMEM_PCCCR_GO_MASK;
// /* Wait until the command completes */
// while (LMEM->PCCCR & LMEM_PCCCR_GO_MASK) {
// }
// /* Enable cache, enable write buffer */
// LMEM->PCCCR |= (LMEM_PCCCR_ENWRBUF_MASK | LMEM_PCCCR_ENCACHE_MASK);
__ISB();

}

2) 在 LMEM_PCCCR 寄存器中使能 PCCR3 和 PCCR2 位来为FlexNVM启用强制写入模式。

LMEM->PCCCR |= LMEM_PCCCR_INVW1_MASK | LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_PCCR2_MASK |LMEM_PCCCR_PCCR3_MASK;

上述两种方法都可以解决读失败的问题。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5032

    浏览量

    117745
  • FlaSh
    +关注

    关注

    10

    文章

    1551

    浏览量

    146652

原文标题:MKE14F512VLL16 FlexNVM 操作

文章出处:【微信号:嵌入式 MCU,微信公众号:嵌入式 MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32 FSMC操作SRAM的步骤简析

    本次操作的SRAM的型号是IS62WV51216,是高速,8M位静态SRAM。它采用ISSI(Intergrated Silicon Solution, Inc)公司的高性能CMOS技术,按照512K个字(16)位进行组织存储单
    发表于 07-22 14:58 1178次阅读
    STM32 FSMC<b class='flag-5'>操作</b>SRAM的<b class='flag-5'>步骤</b>简析

    USBDMX-512说明书.pdf

    USBDMX-512说明书.pdf
    发表于 06-30 06:31

    搭建一个基于MicroCOS-II实时操作系统的简单程序的步骤说明

    本帖最后由 eehome 于 2013-1-5 09:46 编辑 搭建一个基于MicroCOS-II实时操作系统的简单程序的步骤说明
    发表于 08-17 10:26

    PIC16F877A在proteus中读写AT24C512

    此时把I2C DEBUGGER的SCL线连接到PIC16F877A和AT24C512的SCL线上,这样PIC16F877A可以正常的写AT24C512。当PIC
    发表于 12-30 16:09

    DDR2上512Mbit (32Mbit * 16) 是什么意思?

    一块DDR2的说明写的是512Mbit (32Mbit * 16) ,这个是什么意思?
    发表于 02-10 15:15

    PIC16F877A SD卡读/写低于512字节

    大家好,我是一个嵌入式编程初学者。我在SPICI模式下使用PIC16F87A和SD卡。我需要一个小小的说明。我得到的传感器数据每秒80-100字节。我想把它存储在SD卡中。有人能告诉我,我们能在单块
    发表于 11-06 14:33

    广州黄埔回收工厂电子呆料 收购手机CPU

    T245DGGR UCLAMP2511T.TCTNUC029LANERJP06F6043VBMA223NCP1117ST33T3GNJM2370U10-TE1-#ZZZBXR21V1412IL-0A-EBPAM2321-TDFN3X3-10BM02B-XASS-TF(LF)(SN)LS1043AXE7QQBXC7K
    发表于 08-11 16:46

    MK64FN1M0VLL12器件问题

    MK64FN1M0VLL12和MK64FN1M0VLL12R这颗料带R和不带有什么区别呢?
    发表于 09-15 20:46

    K100A万能空调遥控器操作步骤使用说明

    K100A万能空调遥控器操作步骤使用说明书 设置步骤 (一)手动设置
    发表于 08-01 16:35 1.8w次阅读
    K100A万能空调遥控器<b class='flag-5'>操作</b><b class='flag-5'>步骤</b>使用<b class='flag-5'>说明</b>书

    在AD16中利用IPC向导生成3D封装以及STEP模型的操作步骤

    在Altium Designer 16中利用IPC向导生成3D封装以及STEP模型的操作步骤
    发表于 12-10 16:59 0次下载

    mk60dn512vll10系统版原理图

    mk60dn512vll10系统版原理图
    发表于 02-29 14:51 0次下载

    鸿合大屏刷机简易操作步骤

    鸿合大屏刷机简易操作步骤
    发表于 09-05 09:31 377次下载
    鸿合大屏刷机简易<b class='flag-5'>操作</b><b class='flag-5'>步骤</b>

    DMX512灯控台使用说明书详解

    DMX512灯控台使用说明书详解
    发表于 11-13 09:36 7.5w次阅读

    MK64FX512VLL12微控制器的产品介绍

    MK64FX512VLL12是一款具有FPU的基于120MHz ARM® Cortex®-M4微控制器。K64产品系列成员专为低功耗、USB/以太网连接以及需要高达256KB嵌入式SRAM的成本敏感型应用而设计。这些设备共享 Kinetis系列的广泛支持和可扩展性。
    发表于 11-30 17:27 1007次阅读
    MK64FX<b class='flag-5'>512VLL</b>12微控制器的产品介绍

    倒闸操作的基本步骤

    一、正常情况倒闸操作的基本步骤 1、接受任务 当系统调度员下达操作任务时,操作前,预先用电话或传真将操作票(包括
    的头像 发表于 09-22 11:35 4609次阅读