瑞萨RA系列FSP库开发实战指南之MCU芯片内部FLASH存储器的框图分析

描述

35.2

RA6M5/RA4M2内部FLASH的框图分析

RA6M5和RA4M2这两RA子系列MCU的内部FLASH模块其结构是基本一致的。

与RA6M5、RA4M2内部Flash相关的模块框图如下图所示。

mcu

点击可查看大图

35.2.1

Flash定序器和FACI命令

如图中①所示。

相关信号:

FCLK:Flash时钟输入信号

FIFERR:Flash接口错误中断信号引脚

FRDYI:Flash就绪中断信号引脚

Flash时钟源(FCLK):Flash时钟源是Flash外设在执行所有Flash操作时使用的时钟。调用flash_api_t::open函数时,如果Flash时钟源无效,那么它将返回FSP_ERR_FCLK。一旦打开了Flash API,如果Flash时钟源频率发生了更改,则必须调用flash_api_t::updateFlashClockFreq API函数来通知API已更改Flash时钟源频率。不这样做可能导致Flash操作失败,并且可能损坏部件。

中断:仅当使用数据闪存BGO模式时才需要启用Flash就绪中断。在这种模式下,应用程序可以启动数据闪存操作,然后使用用户提供的回调函数异步通知其完成或错误。回调函数传递了一个包含事件信息的结构,这些信息指示回调事件的源(例如,flash_api_t::FLASH_EVENT_ERASE_COMPLETE)。当FLASH FRDYI中断被启用时,相应的ISR将在FLASH驱动程序中定义。如果用flash_api_t::open API注册了用户回调函数,ISR将调用该函数。

FLASH HP支持额外的FLASH错误中断,FLASH HP启用BGO模式,那么FLASH就绪中断和FLASH错误中断都必须启用(分配优先级)。

Flash定序器(Flash Sequencer)和FACI命令(FACI Commands):FACI根据特定的FACI命令控制FCU。

下表列出了所有的FACI命令(FACI Commands):

表7:FACI Commands

mcu

点击可查看大图

35.2.2

内部Flash存储器

如图中②所示。

此部分包含了用户可通过Flash接口操作的内部Flash存储器:

代码闪存(Code Flash Memory)

数据闪存(Data Flash Memory)

选项设置存储器(Option-Setting Memory)

针对代码闪存,还有一个高速缓存器(Flash Cache)用来加速对代码闪存的访问操作。

35.2.3

FLBIU、FHBIU

如图中③所示。

CPU通过FLBIU、FHBIU这两者来访问内部Flash存储器:

PLBIU(Peripheral Low speed Bus Interface Unit)是外设低速总线接口单元,CPU可通过此访问数据闪存和FACI。该总线接口的最大时钟频率为FCLK的50MHz

PHBIU(Peripheral High speed Bus Interface Unit)是外设高速总线接口单元,CPU可通过此访问代码闪存(高速缓存器)和选项设置存储器。该总线接口的最大时钟频率为ICLK的200MHz

35.3

RA2L1内部FLASH的框图分析

与RA2L1内部Flash有关的模块框图如下图所示。

mcu

点击可查看大图

35.3.1

Flash控制块

如图中①示。

Flash控制块(Flash Control Block (FCB))其功能是实现Flash相关操作的逻辑,与RA6M5和RA4M2的Flash定序器是类似的。

35.3.2

内部Flash存储器

如图中②所示。

此部分包含了用户可通过Flash接口操作的内部Flash存储器:

代码闪存(Code Flash Memory)

数据闪存(Data Flash Memory)

针对代码闪存,还有一个预取缓存器(Prefetch Buffer)用来加速对代码闪存的访问操作。

35.4

内部FLASH的操作过程及使用注意事项

35.4.1

内部FLASH的写入过程

擦除:先擦除Block。擦除操作将擦除所提供地址所在的整个块。

空白检查:对于Data Flash,如果需要确认Block是否已经被擦除,一定是通过空白检查来判断Block是否空白,而不能通过读取数据是否0xFF来判断,因为不能保证擦除的数据闪存块的读取值为0xFF。一般在擦除操作成功后,也可以省略掉进行空白检查的步骤,直接对已擦除的区域进行下一步编程(写入)操作。

编程(写入):将数据写入到Flash。写入操作必须在页边界上对齐,并且必须是页边界大小的倍数。

35.4.2

内部FLASH的读取过程

无论Code Flash还是Data Flash都支持直接通过指定地址读取其中数据。因此在读取内部FLASH数据时,把地址转换为C语言指针进行读取即可。

35.4.3

内部FLASH的使用注意事项

注意事项

不可以对Code Flash或Data Flash连续两次进行编程(对于选项设置区域可以)。若要编程(写入)已经被编程过了的区域,需要先擦除该目标区域。

必须确保在数据闪存操作期间不访问数据闪存,这包括可能访问数据闪存的中断。

不能保证擦除的数据闪存块的读取值为0xFF。应使用空白检查来确定内存是否已被擦除但尚未编程。

代码闪存的使用注意事项

在对代码闪存进行写入、擦除或空白检查时无法访问代码闪存。

在修改访问窗口、选择启动区域或设置ID代码时,无法访问代码闪存。

为了支持修改代码闪存,所有的支持代码必须驻留在RAM。这只有在代码闪存编程启用时才能完成。

代码闪存不支持BGO模式,因此代码闪存操作函数在完成之前不会返回。

默认情况下,矢量表驻留在代码闪存中。如果在代码闪存操作期间发生中断,那么代码闪存将被访问以获取中断的起始地址,并发生错误。最简单的解决方法是在代码闪存操作期间禁用中断。另一种选择是将矢量表复制到RAM,相应地更新VTOR(矢量表偏移寄存器),并确保任何中断服务例程在RAM外执行。

类似地,必须确保在多线程环境中,当代码闪存操作正在进行时,从代码闪存运行的线程不能变为活动线程。

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分