OK!至此STM32就完成了整个TFTP协议文件的接收。
3.2、保存文件数据接收到完整的文件数据之后,我们需要把数据写到STM32的FLASH中,保存起来。 由于STM32内存较小,不可能开辟一个大的内存空间把文件数据保存起来再写到FLASH, 所以需要边接收边写FLASH。 首先在接收到写操作请求后,把存储区域的FLASH擦除: case TFTP_WRQ: /* TFTP WRQ (write request) */
。 ... ...
FlashDestination = HtmlDataAddress;
/* Erase the needed pages where the user application will be loaded */
/* Define the number of page to be erased */
NbrOfPage = FLASH_PagesMask(HtmlTotalSize);//擦除HTML区域
/* Erase the FLASH pages */
FLASH_Unlock();
for (EraseCounter = 0; (EraseCounter < NbrOfPage) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++)
{
FLASHStatus = FLASH_ErasePage(HtmlSizeAddress + (PageSize * EraseCounter));
}
FLASH_Lock();
在文件数据传输过程中,把<=512BYTE的数据写到FLASH: filedata = (uint32_t)pkt_buf->payload + TFTP_DATA_PKT_HDR_LEN;
FLASH_Unlock();
for (n = 0;n < (pkt_buf->len - TFTP_DATA_PKT_HDR_LEN);n += 4)
{
/* Program the data received into STM32F10x Flash */
FLASH_ProgramWord(FlashDestination, *(uint32_t*)filedata);
if (*(uint32_t*)FlashDestination != *(uint32_t*)filedata)
{
/* End session */
tftp_send_error_message(upcb, addr, port, FLASH_VERIFICATION_FAILED);
/* close the connection */
tftp_cleanup_wr(upcb, args); /* close the connection */
}
FlashDestination += 4;
filedata += 4;
}
FLASH_Lock();
到这里,就实现了STM32接收TFTP客户端传输的文件数据,并保存到FLASH地址为FlashDestination的区域中。
|