芯片型号:LM3S9b96 C1和C3;
客户端用
问题:
1 用UDP,一旦启动发送函数,程序就跑飞了(进入硬件错误中断);
2 发送数据时,无论如何设置始终是1秒发送一次数据;
求高手指点???急需解决中.......................
// systick中断处理函数//-----------------------------------------------------------------------------
void SysTickHandler(void)
{ // 调用lwip定时处理函数
lwIPTimer(SYSTICKMS);
}
//这是一个回调函数,当有UDP数据收到时会被调用
void UDP_Receive(void *arg, struct udp_pcb *upcb, struct pbuf *p, struct ip_addr *addr, u16_t port)
{ struct ip_addr destAddr = *addr;
if(p != NULL){ // 如果收到的数据不为空
udp_sendto(upcb,p,&destAddr,port); // 将收到的数据再发送出去
pbuf_free(p); // 释放缓冲区数据
}
}
void lwIPHostTimerHandler(void)
{
static uLong ulLastIPAddress = 0;
static long lStarPos = 0;
static tBoolean bIncrementing = true; uLong ulIPAddress; tRectangle sRect;
ulIPAddress = lwIPLocalIPAddrGet();
// If IP Address has not yet been assigned, update the display accordingly if(ulIPAddress == 0){
UART_TxStr("ulIPAddress == 0\r\n>");
} // Check if IP address has changed, and display if it has.
else{
if(ulLastIPAddress != ulIPAddress)
{ ulLastIPAddress = ulIPAddress; // 显示IP
UART_TxStr("IP地址:");
DisplayIPAddress(ulIPAddress);
ulIPAddress = lwIPLocalNetMaskGet();
UART_TxStr("子网掩码:");
DisplayIPAddress(ulIPAddress);
ulIPAddress = lwIPLocalGWAddrGet();
UART_TxStr("默认网关:");
DisplayIPAddress(ulIPAddress);
}
}
}
void EthernetConfig(void)
{
uLong ulUser0, ulUser1;
uChar pucMACArray[8]; // 使能端口F来作为以太网的LED使用
GPIOPinConfigure(GPIO_PF2_LED1);
GPIOPinConfigure(GPIO_PF3_LED0);
GPIOPinTypeEthernetLED(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_3); //从用户寄存器中 读取MAC地址
//ROM_FlashUserGet(&ulUser0, &ulUser1);
ulUser0 = 0x00563412; // 配置MAC地址为12-34-56-78-9a-ef
ulUser1 = 0x00ef9a78;
if((ulUser0 == 0xffffffff) || (ulUser1 == 0xffffffff)){ // MAC没有编程
UARTprintf("MAC Address Not Programmed!\r\n");
}
else{ //转换用户寄存器到MAC地址
pucMACArray[0] = ((ulUser0 >> 0) & 0xff);
pucMACArray[1] = ((ulUser0 >> 8) & 0xff);
pucMACArray[2] = ((ulUser0 >> 16) & 0xff);
pucMACArray[3] = ((ulUser1 >> 0) & 0xff);
pucMACArray[4] = ((ulUser1 >> 8) & 0xff);
pucMACArray[5] = ((ulUser1 >> 16) & 0xff);
// 初始化lwIP协议栈 静态IP
// IP地址: 192.168.1.20
// 子网掩码:255.255.255.0
// 默认网关:192.168.1.254
lwIPInit(pucMACArray,(Ethernet_Addr[0]<<24)|(Ethernet_Addr[1]<<16)|(Ethernet_Addr[2]<<8)|Ethernet_Addr[3],
(GateWay_Addr[0]<<24)|(GateWay_Addr[1]<<16)|(GateWay_Addr[2]<<8)|GateWay_Addr[3],
(Subnet_Addr[0]<<24)|(Subnet_Addr[1]<<16)|(Subnet_Addr[2]<<8)|Subnet_Addr[3], IPADDR_USE_STATIC);
}
}
int main(void)
{
struct udp_pcb *UdpPcb;
struct ip_addr ipaddr;
struct pbuf *p;
const static unsigned char UDPData[]="TI lm3s9b96 测试!\r\n LwIP UDP客户端测试!\r\n";
//JtagWait(); // 防止JTAG失效,重要!
SystemInit(); // 设置时钟 66.7Mhz 初始化 定时器 串口
/****************** 初始化客户端UDP ******************/
EthernetConfig();
IP4_ADDR(&ipaddr,DEthernet_Addr[0],DEthernet_Addr[1],
DEthernet_Addr[2],DEthernet_Addr[3]); // 远程主机地址
UdpPcb = udp_new();
udp_bind(UdpPcb,IP_ADDR_ANY,4000); // 绑定本地IP地址
udp_connect(UdpPcb,&ipaddr,5000); // 连接远程主机
udp_recv(UdpPcb,UDP_Receive,NULL); // 设置数据接收时的回调函数
// 主循环
while(1){
if(systemVariable.xFlag_200ms){
systemVariable.xFlag_200ms=0;
p = pbuf_alloc(PBUF_TRANSPORT,strlen(UDPData),PBUF_RAM);
if(p != NULL){
memcpy(p->payload, UDPData,strlen(UDPData));
udp_send(UdpPcb,p);
pbuf_free(p);
}
}
}
说明: 其他的API函数都是调用TI驱动程序.
[ 本帖最后由 ekinwyoming 于 2011-4-5 10:30 编辑 ]
回复 沙发 ekinwyoming 的帖子
呵呵。。不失望就说明你已经学到位了。。坛子里面有许多发送UDP的工程,LZ可以参考一下,慢慢来嘛。。
一下子就成功了,就没有意思了。。。也学不了多少东西了。。。
回复 楼主 ekinwyoming 的帖子
检查一下堆栈大小的设置
回复 楼主 ekinwyoming 的帖子
您这么说的太笼统,描述的详细些,或者贴些代码,这样才好帮助您。
楼主先用TI自带的例程试一试,硬件错误中断一般是外设没有使能,网络数据发送慢可以在后面加一句tcp_output(pcb);
你看看你的 网络的 中断有没有打开? 另外可以先用 开发板提供的例子先测试
答复
你的这个问题不好回答你,你可以在ti的E2E论坛挂上你的问题,应该是可以解决的.
Fred