API 函数库中的 擦写; 编程 ;验证;函数
API函数库
-
FLASH 擦除
在ALLdefine.h 中
extern Uint16 Flash_Erase (Uint16 SectorMask, FLASH_ST *FEraseStat);
其中, sectormask 表示擦写FLASH 中的那一个段。
*FEraseStat 表示FLASH 状态结构指针。
(2)FALSH 编程
extern Uint16 Flash_Program(volatile Uint16 *FlashAddr, volatile Uint16 *BufAddr, Uint32 Length, FLASH_ST *FProgStatus);
其中 *FlashAddr 表示指向要编程FLASH 空间的首地址。
*BufAddr 表示指向缓冲器的指针。
Length 表示要编程16位数据的数量。
*Fprogstatus 表示FLASH状态结构指针。
调用方式: 在Downloader.c 文件中 。
定义了 接收串口超级终端的数组 DataBuffer1[RAM_BUFFER_SIZE]
其中 RAM_BUFFER_SIZE 宏定义的是4096 也就是说databuffer1 的空间大小是4k
定义了 接收串口超级终端的数组 DataBuffer2[RAM_BUFFER_SIZE]
通过#PRAGMA 伪指令
然后在 CMD 文件中
用memory 伪指令 定义了段 RAMH0_1 的起始地址 和 长度
定义了段 RAMH0_1 的起始地址 和 长度
注意是RAM
然后在 CMD文件中的 section 指令中 指定函数名字 或者数组名, 到MEMORY 指定的存储空间中去。
重要结论:如此便保证DspRecovery 底层程序,在接收上位机计算机的串口调试终端232下发下来的数据 就是放在RAM 中, 而不是FLASH 中 。
另外对FLASH_API函数 在CMD 文件中也进行相应的配置,也就保证了FLASH_API 中的擦除函数 以及 编程函数, 校验函数 等都是在 RAM中执行额 。
也就是说。虽然我底层程序下载进入的是 FLASH SECTOR A 但是程序执行FLASH_API 接口函数确是在RAM 中进行的,因为函数中使用了memcopy 函数 等 将FLASH 中的代码拷贝到RAM中执行。
关于 Status = Flash_Program(Flash_ptr,DataBuffer1,Length,&FlashStatus);
Flash_Progma()函数 返回值的问题
函数的返回值 具体的定西见文档 Flash 281x_API_V210
(文档存放在百度网盘)
以下是部分英文翻译
Flash_ptr 指向flash 第一个16位 位置 的指针。
Length 指向的是要被编程到FLASH 中内存单元的个数。
关于函数返回值:
(1)如果 函数成功 则返回 STATUS_SUCCESS
STATUS_SUCCESS 在头文件中 ALLDefines 中定义
(2)如果函数失败,则返回指示失败原因的状态值 ,请参阅 18.11返回值的完整列表。
在PDF 的18.11 第42页处。
NOTES :
-
程序一次操作一个16位的字,直到缓冲区域的所有的数据都被编程;或者程序的执行过程中出现了错误,
-
程序将位 从值1 编程 为值 0 所以擦除了FLASH 以后的内存单元应该全是1
-
以下两种情况要知道:
4-1 例如 在一个Flash 的16位内存单元 先 写入了 0XFFFE
然后 第2次在相同的16位内存单元 再次写入了 0XFFFC
则第2次擦除过程 不再需要一个擦除循环
1111 1111 1111 1110 0XFFFE
1111 1111 1111 1100 0XFFFC
只编程上面紫色的这个位,。 将1编写成0
4-2 情况2 例如在一个FLASH 的16位内存单元 先写入 0X0001
然后第2次在相同的16位内存单元 再写入 0X0002
0000 0000 0000 0001 0X0001
0000 0000 0000 0010 0X0002
这时 函数 将返回这个值 失败, 因为只能从1写入0 不能从0写入1
函数将返回 STATUS_FAIL_ZERO_BIT_ERROR
在 FALSH_API V210 中提供了例程。 该例程实现的是 将 程序中定义的 0X0400个16位数组的元素 写入到 以地址 0X003F0000 为起始地址的FALSH 单元中去,
如何判断 0X003F0000 是FLASH 单元, 因为CMD文件中定义0X003F0000 为起始地址的空间就是FLASH 单元。。
而CMD文件中 又定义了 FLASH_API 函数是在RAM中 运行。 具体参见 FLASH _API 的配置。
(3)校验函数
在头文件中 alldefine.h 中完成声明
extern Uint16 Flash_Verify(volatile Uint16 *StartAddr, volatile Uint16 *BufAddr, Uint32 Length, FLASH_ST *FVerifyStat);
FVerifyStat 是指向 FLASH_ST 数据类型的指针变量
对各形式参数的说明
*StartAddr 指向FLASH 中要编程的第一个位置的指针,
*BufAddr 指向缓冲区的指针。
Length 要被编程到flash中的16位单元个数的数字。