本文将介绍 LPC800 的 IAP 擦写 Flash 功能。
- LPC800 Flash 分配
对 Flash 的操作我们首先要知道 Flash 的分配, 以 LPC804 内部 Flash 为例,如下图所示
总共 32K,分为 32 个 sector ,1 个 sector 分为 16 个 page,但是需要注意,最后两个 page 是不可以使用的。最小擦写为 1 个 page。
- 擦写 Flash API
对 Flash 的擦写主要使用以下 API :
- IAP_PrepareSectorForWrite (uint32_t startSector, uint32_t endSector)
在调用擦除和写入的函数之前必须要线调用此函数,参数就是用户涉及到 sector,数值对应手册里的 Flash 划分,见上图。
- IAP_EraseSector (uint32_t startSector, uint32_t endSector, uint32_t systemCoreClock)
此 API 为擦除 sector 的函数,参数除了 sector 范围,还有的是 flash 的时钟频率,这里一般是主时钟 main clock。
- IAP_ErasePage(uint32_t startPage, uint32_t endPage, uint32_t systemCoreClock)
此 API 为擦除 page 功能,page 范围 0-509,可以在这个范围内选择需要的。
- IAP_CopyRamToFlash(uint32_t dstAddr, uint32_t *srcAddr, uint32_t numOfBytes, uint32_t systemCoreClock)
此 API 为写入功能,第一个参数为目标地址,即 flash 的地址,这里对应哪个 sector,第一张图都有说;第二个参数是源地址,即要写入的数据的起始地址,一般是数组名;第三个是需要写入的数据大小,这里要求是 256 的倍数。
- 注意事项
需要特别注意的就是需要在 ram 区域中保存最后的 32bytes 空间给 IAP 功能使用,详细请看下图手册中的描述,如果用户代码中使用到了最后 32bytes 就会造成 Hardfault 的情况。
在用户代码中的 .scf 文件中修改 ram 的大小即可 :
- 实战演练
随意打开 SDK 中的一个例程,这里选用 led_blinky 工程:
在工程中添加 IAP 的 driver 文件
定义相关参数:
写入数据 API:
读取数据 API :
在 main 函数中调用
通过串口可以看到结果,也可以通过进调试查看:
评论