35.2
RA6M5/RA4M2内部FLASH的框图分析
RA6M5和RA4M2这两RA子系列MCU的内部FLASH模块其结构是基本一致的。
与RA6M5、RA4M2内部Flash相关的模块框图如下图所示。

点击可查看大图
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

点击可查看大图
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有关的模块框图如下图所示。

点击可查看大图
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外执行。
类似地,必须确保在多线程环境中,当代码闪存操作正在进行时,从代码闪存运行的线程不能变为活动线程。
全部0条评论
快来发表一下你的评论吧 !