图3-10 复制Flash API函数
步骤5:初始化Flash_CPUScaleFacter
Flash API使用一个32位的全局变量Flash_CPUScaleFacter来产生合适的软件延时,Flash_CPUScaleFacter值通过步骤2最后的公式计算得到,只要在应用程序中加入如下说明即可:
图3-11 Flash_CPUScaleFacter赋值
步骤6:初始化回调函数指针
回调函数是指在Flash API函数执行期间执行其他的功能的函数,例如通过通信端口发生信息或者清除看门狗。此时Flash和OTP处于安全的状态,可以对其进行任意操作。在本系统中Flash API函数执行时不需要进行其他操作,所以回调函数指针为NULL。
步骤7:解锁代码安全模块CSM
代码安全模块(CSM)保证Flash、OTP、L0、L1模块中的数据被非法读取和修改。当Flash API函数从CSM保护的模块中运行时,它可以修改任何被CSM保护的模块的内容,包括Flash。在这种情况下,不需要对CSM解锁。当Flash API从不被CSM保护的存储器执行时,API就不能读取保护模块内的内容,即不可以修改Flash中的程序。在这种情况下,应用程序必须先解锁CSM,然后调用API。
在完成了以上的准备工作后,就可以调用Flash API函数。
擦除函数
擦除函数Flash_Erase()用来擦除指定的段,其他未指定的段中的数据保持不变。函数声明如下:
Uint16 Flash_Erase(Uint16 SectorMask, FLASH_ST *FEraseStat);
第一个参数是指要擦除的段掩码,指明要擦除的Flash段。利用Flash API擦除只能整个段来擦除,不能擦除任意存储器内容。TMS320F281x系列Flash段掩码与段的对应关系如下图3-12所示:
图3-12 TMS320F281x系列中的Flash段
第二个参数是指向FLASH_ST结构体的指针,FLASH_ST在Flash2812x_API_Library.h中定义,用来向调用函数传递擦除信息成功或者失败的信息:
typedef struct {
Uint32 FirstFailAddr;
Uint16 ExpectedData;
Uint16 ActualData;
}FLASH_ST;
函数的返回值有两种:1)当擦除成功时,函数返回STATUS_SUCCESS;2)当擦除失败时,函数返回状态值说明失败的原因;擦除完成后,所有指定擦除的段内容变为0xFFFF。
烧写函数
烧写函数将一个16位值的缓冲区内的值烧写近Flash或者OTP。函数原型声明如下:
Uint16 Flash_Program(volatile Uint16 *FlashAddr, volatile Uint16 *BufAddr, Uint32 Length, FLASH_ST *FProgStatus);
第一个参数是指向Flash中需要烧写的16位的起始地址的指针;第二个参数是指向数据缓冲区;第三个参数说明要烧写进Flash中的数据的长度;第四个参数指向FLASH_ST结构体。函数的返回值也有两种:1)当擦除成功时,函数返回STATUS_SUCCESS;2)当擦除失败时,函数返回状态值说明失败的原因。Flash API每次烧写16位数据,直到缓冲区内所有内容烧写结束或者遇到错误;烧写操作将Flash中位值1变为0,以和缓冲区内数据一致。通常情况下一个Flash段必须先擦除再烧写。但是,为了保护Flash和给用户更大的操作自由,烧写操作不会尝试烧写先前已被烧写过的位。烧写函数是将位值有1变0,如果没有1则会报错,这是因为擦除函数不可以将单个位的值由0变1。
校验函数
检验缓冲区和相应Flash内容是否一致。尽管烧写函数也有校验步骤,但检验函数作为额外的检验,可以进一步确认烧写进Flash内的数据和缓冲区内的数据一致。函数原型如下:
Uint16 Flash_Verify(volatile Uint16 *StartAddr, volatile Uint16 *BufAddr, Uint32 Length, FLASH_ST *FVerifyStat);
第一个参数指向烧写进Flash中的数据的第一个位置;第二个数据指向缓冲区数据;第三个参数说明烧写的数据的长度,第四个参数指向FLASH_ST结构体。函数的返回值也是两种:1)当擦除成功时,函数返回STATUS_SUCCESS;2)当擦除失败时,函数返回状态值说明失败的原因。 嵌入式设备的远程更新平台(6):http://www.751com.cn/zidonghua/lunwen_9473.html