STM32
直播中

李桂英

7年用户 1375经验值
私信 关注
[问答]

stm32f107vct6+FreeRTOS+LWIP UDP发送数据会进入HardFault_Handler中断,为什么?

非常感谢你的观看,我在用STM32CUBEMx +FreeRTOS+LWIP遇到一些问题,希望能指导一下
配置:cpu是stm32f107vct6  、PHY是DP83848、LWIP是UDP通信,选择disable DHCP
我用了两个版本的CUBEMx,建立了两个工程(两个工程里面用的udpclient.C.H和83848.C.H都是一样的) 我来列举一下我的问题
1.开始使用的是STM32CubeMX-4.15.0版本
我建立了OldETH文件的工程,在 MX_LWIP_Init()之后使用UDP_client_init(server_ip,server_port)来绑定IP和port,我成功的ping通了,udp中断接收数据没问题,但是我udp发送数据的时候出问题了。
我是通过UDP_DataSend(u8* buf,u8 len)这个函数来发送数据的,
uint8_t  UDPData[20]="I am udp client!rn";

void UDP_DataSend(u8* buf,u8 len)
{
    struct pbuf  *udp_pbuf;                                    
    udp_pbuf=pbuf_alloc(PBUF_RAW,len,PBUF_RAM);                                                            
    if(udp_pbuf != NULL)
    {   
       udp_pbuf -> payload = buf;                 
        udp_send(udp_PCB,udp_pbuf);   //udp_pcb是 UDP_client_init建立的udp控制块                  
    }
      pbuf_free(udp_pbuf);
}

当我发送测试数据UDP_DataSend(UDPData,sizeof(UDPData)) 这个是没有问题的,
然而当我要发送我以太网接受回调中所接受到的数据时,UDP_DataSend(udpReceiveData.buf,udpReceiveData.len)出错了,我必须将UDP_DataSend函数改成下面这样才能发送成功,要不然就会进入HardFault_Handler出错中断里面,这是我不能理解的
void UDP_DataSend(u8* buf,u8 len)
{
    struct pbuf  *udp_pbuf;                                    
    udp_pbuf=pbuf_alloc(PBUF_RAW,len,PBUF_RAM);                                                            
    if(udp_pbuf != NULL)
    {
        uint8_t UDPDataSendBuf[256];
        memcpy(UDPDataSendBuf,buf,len);
       udp_pbuf -> payload = UDPDataSendBuf;                 
        udp_send(udp_pcb,udp_pbuf);   //udp_pcb是 UDP_client_init建立的udp控制块                  
    }
      pbuf_free(udp_pbuf);
}


2.使用的是新版STM32CubeMX-4.25.0版本
建立了NewETH文件里面的工程,在 MX_LWIP_Init()之后使用UDP_client_init(server_ip,server_port)来绑定IP和port,这时候我也ping通了,也能接收数据了。问题来了,现在不管是发送测试数据还是发送以太网接受回调中所接受到的数据都进入HardFault_Handler出错中断里面。

以上就是我现在遇到的问题,感谢你的帮忙

回帖(1)

辛太励

2024-4-29 18:19:49

问题描述:在使用STM32CubeMX-4.15.0版本建立的工程中,使用UDP进行通信时,发送数据会导致进入HardFault_Handler中断。

可能的原因及解决方案:

1. 堆栈溢出:在FreeRTOS中,每个任务都有自己的堆栈。如果任务的堆栈空间不足,可能会导致HardFault。请检查您的任务配置,确保为每个任务分配了足够的堆栈空间。

2. 内存分配问题:在LWIP中,需要为TCP/IP协议栈分配内存。如果内存分配不足,可能会导致HardFault。请检查您的LWIP配置,确保为内存池分配了足够的空间。

3. 中断优先级配置:在STM32中,中断优先级配置不正确可能会导致HardFault。请检查您的中断优先级配置,确保没有冲突。

4. LWIP配置问题:请检查您的LWIP配置,确保所有参数都正确设置。例如,确保您的网络接口配置正确,包括IP地址、子网掩码、网关等。

5. 代码问题:检查您的UDP发送代码,确保没有非法内存访问、数组越界等错误。

6. 固件版本问题:您提到使用了两个版本的STM32CubeMX。请确保您使用的是最新版本的固件,因为新版本可能修复了旧版本中的一些已知问题。

7. 硬件问题:虽然不太可能,但硬件问题(如内存损坏)也可能导致HardFault。请检查您的硬件连接,确保一切正常。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分