This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我尝试使用 TivaWare 上 utils 文件夹中包含的 tftp.c 和 tftp.h 文件在 EK-TM4C1294NCPDT 板中实现 TFTP 协议 2.1.3.156.我想通过 TFTP 读取闪存中特定存储器位置的值。
由于电路板上没有此协议的示例、因此我使用 enet_io 示例并进行修改以添加 TFTP 协议实现。 我使用 TFPInit 函数初始化 TFTP、如下代码所示:
int main (void) { uint32_t ui32User0、ui32User1; uint8_t pui8MACArray[8]; // //确保主振荡器已启用,因为这是所要求的 // PHY。 系统必须将一个25MHz 晶体连接到 OSC //引脚。 晶体时使用 SYSCTL_MOSC_HIGHFREQ 参数 //频率为10MHz 或更高。 // SysCtlMOSCConfigSet (SYSCTL_MOSC_HIGHFREQ); // //从 PLL 以120MHz 运行。 // G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000); // //配置器件引脚。 // PinoutSet (true、false); // //配置调试端口供内部使用。 // UARTStdioConfig (0、115200、g_ui32SysClock); // //清除终端并打印横幅。 // UARTprintf ("\033[2J\033[H"); UARTprintf ("以太网 IO 示例\n"); // //为周期性中断配置 SysTick。 // MAP_SysTickPeriodSet (g_ui32SysClock / SYSTICKHZ); map_SysTickEnable(); map_SysTickIntEnable(); // //为的以太网控制器过滤配置硬件 MAC 地址 //传入数据包。 MAC 地址将存储在非易失性存储器中 // USER0和 User1寄存器。 // map_FlashUserGet (&ui32User0、&ui32User1); if ((ui32User0 == 0xffffffff)||(ui32User1 == 0xffffffff) { // //告知用户没有 MAC 地址 // UARTprintf ("未对 MAC 进行编程!\n"); while (1) { } } // //告诉用户我们现在正在做什么。 // UARTprintf ("正在等待 IP.\n"); // //将24/24拆分 MAC 地址从 NV RAM 转换为32/16拆分 //对硬件寄存器进行编程、然后进行编程所需的 MAC 地址 //以太网控制器寄存器中的 MAC 地址。 // pui8MACArray[0]=((ui32User0 >> 0)& 0xff); pui8MACArray[1]=((ui32User0 >> 8)& 0xff); pui8MACArray[2]=((ui32User0 >> 16)& 0xff); pui8MACArray[3]=((ui32User1 >> 0)& 0xff); pui8MACArray[4]=((ui32User1 >> 8)& 0xff); pui8MACArray[5]=((ui32User1 >> 16)& 0xff); // //使用 DHCP 初始化 lwIP 库。 // lwIPInit (g_ui32SysClock、pui8MACArray、0、0、0、 ipaddr_use_dhcp); // lwIPInit (g_ui32SysClock、pui8MACArray、2887557220、4294934528、 2887526654、IPADDR_USE_STATIC); // //设置设备定位服务。 // LocatorInit(); LocatorMACAddrSet (pui8MACArray); LocatorAppTitleSet ("EK-TM4C1294XL enet_IO"); uint32_t i; 对于(i = 0;i < 99;i++){ Buffer[i]='A'; } Buffer[99]='\0'; // //初始化示例 httpd 服务器。 // httpd_init(); TFTPInit (okToContinuue); // //设置中断优先级。 我们将 SysTick 中断设置为更高的值 //优先级比以太网中断高,以确保文件系统 如果 SysTick 在以太网处理程序运行时发生、则处理// tick //已处理。 这很可能是因为所有 TCP/IP 和 HTTP 工作都是 //在以太网中断上下文中完成。 // MAP_IntPrioritySet (INT_EMAC0、ETHERNET_INT_PRIORITY); MAP_IntPrioritySet (FAULT_SysTick、SysTK_INT_PRIORITY); // //将我们的标记信息传递到 HTTP 服务器。 // HTTP_SET_SSI_handler ((tSSIHandler) SSIHandler、g_pcConfigSSITags、 num_config_SSI_tags); // //将我们的 CGI 处理程序传递到 HTTP 服务器。 // http_set_cgi_handler (g_psConfigCGIURI、NUM_CONFIG_CGI_URI); // //初始化 IO 控件 // io_init(); // //永久循环,处理屏幕动画。 所有其他工作都是 //在中断处理程序中完成。 // while (1) { // //等待新的勾号出现。 // while (!g_ulFlags) { // //不执行任何操作。 // } // //现在我们已经看到了标记,就清除它了。 // HWREGBITW (&g_ulFlags、FLAG_TICK)= 0; // //切换 GPIO // MAP_GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、 (MAP_GPIOPinRead (GPIO_PORTN_BASE、GPIO_PIN_1)^ GPIO_PIN_1); } }
我创建了回调函数、但现在我只执行了 TFPInit 和 pfnGetData Callback。
tTFPError getDataFromTFTP (struct _tTPConnection *psTFTP){ 无符号超长整型 ulOffset; UARTprintf ("获取块%d、%d\n"、psTFTP->ui32BlockNum、psTFTP->ui32DataLength); // //从何处读取该数据块? 这通过进行计算 //请求的 TFTP 块编号。 // ulOffset =((psTFTP->ui32BlockNum - 1)* TFTP_BLOCK_SIZE); // //将数据复制到提供的缓冲区中。 // memcpy (psTFTTFTP ->pui8Data、(unsigned char *)(buffer + ulOffset)、 psTFTP->ui32DataLength); // //告诉呼叫者一切正常。 // return (TFTP_OK); } tTFPError putDataFromTFTP (struct _tTFPTConnection *psTFTP){ 返回 TFTP_OK; } void closeTFTP (struct _tTFTPConnection *psTFTP){ } tFTPError okToContinuue (struct _tTFTPConnection *psTFTP、bool bGet、 int8_t * pui8FileName、tTFPMode eMode){ psTFTTFTP -> pfnClose = closeTFTP; // //这是获取还是提交请求? // if (bGet)(如果(bGet)) { // //获取请求-填写图像大小和数据传输 //函数指针。 // psTFTTFTP ->pfnGetData = getDataFromTFTP; psTFTP->ui32DataRemaining = 100; } 其他 { // //发出请求-填入数据传输函数指针。 // psTFTP->pfnPutData = putDataFromTFTP; } 返回 TFTP_OK; }
板上有 IP 地址、http 服务器工作正常。 但是、当我在窗口中使用本机 TFTP 客户端时、会调用 TFPRecv 函数和 pfnGetData 回调函数。 但当 TFPDataRecv 函数被调用时,TFPRecv 函数被调用,当第618行中的 UDP_recv 被再次调用时,发生 Fault_ISR。
为什么 永远不调用函数 TFPDataRecv?
Leonan、您好!
我有一个关于 TFTP 服务器的问题。 只有我们必须在主程序中初始化 TFPInit 函数? 以及包含 tftp_server.c 和 tftp_server.h 文件的 lwIP 2.0.0软件包。 但其中没有 tftp_server 文件。 请分享您获取该文件的链接。
谢谢。
此致、
Faizan Ahsan