API 函数库中的 擦写; 编程 ;验证;函数

API函数库

  1. 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 :

  1. 程序一次操作一个16位的字,直到缓冲区域的所有的数据都被编程;或者程序的执行过程中出现了错误,
  2. 程序将位 从值1 编程 为值 0 所以擦除了FLASH 以后的内存单元应该全是1

     

  3. 以下两种情况要知道:

 

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位单元个数的数字。

 

 

源WORD文档链接

 

 

 

 

猜你喜欢

转载自www.cnblogs.com/bailongwei654321/p/13381415.html