Flash 编程

FM33A048B 支持以下Flash 编程方法:
⚫ 在系统编程(ISP):通过FMSH 专用编程器或者KEIL 用户界面实施芯片编程,使用SWD 接

⚫ 在应用编程(IAP):通过bootloader 代码实现芯片自编程,用户可定义任意串口,可用于实现
程序在线升级

Flash 擦写方法
FM33A048B 支持Flash 擦除操作,以及单次编程和连续编程。执行Flash 擦写使用校准后的RCHF 时
钟,而此时CPU 运行的系统时钟可以是任意时钟。
注意,在擦写Flash 时,必须保证RCHF 开启,并且RCHF 频率选择为8/16/24MHz,当RCHF 为其
他频率时,无法保证Flash 擦写的可靠性。
Flash 擦写前须进行Key 校验,写入顺序错误或写入值错误,或者在Flash Key 验证正确之前就进行
擦除或编程Flash 操作将会进入错误状态,并产生相应中断。Flash Key 认证错误之后将禁止擦写Flash
直到下一次复位。而在正常擦写完成后,向KEY 寄存器写入任意值都会使状态机返回初始的写保护
状态。

全擦操作(Chip Erase)
全擦操作只能由SWD 接口启动,软件禁止进行全擦。全擦操作仅擦除main array,硬件确保NVR
引脚拉低,不会擦除NVR 扇区。SWD 操作流程如下:
⚫ 编程器通过SWD 配置ERTYPE 寄存器为10
⚫ 编程器通过SWD 清除PREQ 寄存器,置位EREQ 寄存器
⚫ 编程器通过SWD 写入Flash 全擦Key:0x9696_9696 和0x7D7D_7D7D
⚫ SWD 向Flash 任意地址写擦除请求0x1234_ABCD
⚫ NVMIF 启动对Flash 的全擦,并暂停任何Master 对Flash 的访问
⚫ 全擦完成后置位中断标志和全擦标志(全擦标志表示main array 全部擦除,任何对main array
的编程将清除此标志)
⚫ 在全擦标志有效的情况下,SWD 可以任意擦写NVR5,否则擦写NVR5 被禁止并触发错误中断
⚫ 软件确认擦除结束后向FlashKEY 寄存器写任意值恢复写保护
全擦操作不会擦除已经映射使用的冗余扇区。对于冗余扇区, 应先从地址
0x1FFFFE20/0x1FFFFE24/0x1FFFFE28/0x1FFFFE2C 中,读出4 words 冗余扇区映射信息,然后根据
映射信息以及5.2 章节Flash 逻辑地址映射关系,参照下一小节内扇区擦操作的流程,擦除被映射使
用的扇区

扇区擦操作(Sector Erase)
SWD和应用代码都可以执行扇区擦。操作流程如下:
⚫ 配置 ERTYPE 寄存器为 00
⚫ 清除 PREQ 寄存器,置位 EREQ 寄存器
⚫ 写入 Flash 擦 除 Key 0x9696_9696 和 0xEAEA_EAEA
⚫ 向需要擦除的扇区内任意地址写擦除请求 0x1234_ABCD
⚫ NVMIF 检查目标扇区是否属于被 ACLOCK 锁定的 Block ,如果没有锁定则启动对目标扇区的
擦除,如果 被锁定则触发错误标志
⚫ 扇区擦完成后置位中断标志
⚫ 软件确认擦除结束后向 FlashKEY 寄存器写任意值恢复写保护

单次编程
单次编程由软件发起,通过总线直接写Flash,每次操作可执行byte/half-word/word编程,操作流程如下:
⚫ 清除 EREQ 寄存器,置位 PREQ 寄存器
⚫ 清除连续编程使能寄存器
⚫ 写入 Flash 编程 Key 0xA5A5_A5A5 和 0xF1F1_F1F1
⚫ 向 Flash 目标地址写数据,如果目标地址被 ACLOCK 锁定,则触发错误标志,如果没有锁定,
则执行编程
⚫ Byte 写入直接完成, half word 写入则由 NVMIF 自动执行 2 次 byte program word 编程由 NVMIF
执行 4 次 byte program
⚫ 编程完成后置位中断标志
⚫ 软件确认编程结束后向 FlashKEY 寄存器写任意值恢复写保护

连续编程
连续编程指通过DMA的Memory通道一次向Flash写入half-sector(256字节)。连续编程时DMA从RAM指定地址读取数据,Flash目标编程地址必须是half-sector对齐的,也就是Flash地址低6位为0。采用这种方式时一次编程的数据长度是固定的,主要用于快速大数据量写入。
在启动连续编程期间,DMA完全占据Flash总线,暂停CPU对Flash的一切访问。连续编程的操作流程如下:
⚫ 清除 EREQ 寄存器,置位 PREQ 寄存器
⚫ 置位连续编程使能寄存器( DMA 模式使能)
⚫ 向 RAM 中写入 256 字节待编程数据
⚫ 配置 DMA 存储器通道,设定传输方向、读地址和写地址
⚫ 使能 DMA 存储器通道
⚫ 写入 Flash 编程 Key 0xA5A5_A5A5 和 0xF1F1_F1F1
⚫ 软件触发 DMA 存储器通道, DMA 连续 64 次读取 RAM 并对 Flash 编程, NVMIF 每收到 1 个
word 自动完成 4 次 byte pro gram
⚫ NVMIF 检查被编程扇区是否被 ACLOCK 锁定,如果锁定则触发错误中断并通知 DMA 停止编

⚫ 256 字节完全编程结束后产生中断,释放 Flash 总线
⚫ 软件确认编程结束后向 FlashKEY 寄存器写任意值恢复写保护
注意:如果CPU在Flash中取指时进行Flash擦写,则CPU取指将被暂停,直到擦写操作完成。如果CPU跳转到RAM中取指运行,则Flash擦写不会暂停CPU的执行。Flash擦写过程中,若用户希望在RAM中执行代码时仍然能够实时响应中断,应将中断向量表重新映射到RAM中。

猜你喜欢

转载自blog.csdn.net/qq_43359615/article/details/130358416