FrameTypeDef ETH_Get_Received_Frame_interrupt(void)这个函数,注释中说的是在接收中断(ETH_GetDMAFlagStatus(ETH_DMA_FLAG_R) == SET)发生的时候调用。因此在lwip的ethernetif.c中的数据包接收函数中调用:
将代码1注释掉,换成自己写的代码2,程序就能正常运行。 STM32F207VE Ethernet SYSCLK=120.0MHz HCLK=120.0MHz PCLK1=30.0MHz PCLK2=60.0MHz MAC Addr: 30:7C:04:11:90:03 [Send] len=350 buffer=0x20000244 descriptor=0 length=60 FS_Rx_Desc=0 LS_Rx_Desc=0 Seg_Count=1 [Recv] len=60 buffer=0x20000244 descriptor=1 length=60 FS_Rx_Desc=0 LS_Rx_Desc=1 Seg_Count=2 [Recv] len=60 buffer=0x20000244 descriptor=2 length=60 FS_Rx_Desc=0 LS_Rx_Desc=2 Seg_Count=3 [Recv] len=60 [Send] len=350 buffer=0x20000244 descriptor=3 length=344 FS_Rx_Desc=0 LS_Rx_Desc=3 Seg_Count=4 [Recv] len=344 buffer=0x20000244 descriptor=4 length=60 FS_Rx_Desc=0 LS_Rx_Desc=4 Seg_Count=5 [Recv] len=60 buffer=0x20000244 descriptor=0 length=60 FS_Rx_Desc=0 LS_Rx_Desc=0 Seg_Count=6 [Recv] len=60 buffer=0x20000244 descriptor=1 length=60 FS_Rx_Desc=0 LS_Rx_Desc=1 Seg_Count=7 [Recv] len=60 [Send] len=350 buffer=0x20000244 descriptor=2 length=344 FS_Rx_Desc=0 LS_Rx_Desc=2 Seg_Count=8 [Recv] len=344 翻阅stm32f2x7_eth.c整个代码,会发现当且仅当FS(First segment)=1且LS(Last segment)=0时,Seg_Count才会被设回1。 而ETH标准库默认的缓冲区大小是1524,这就注定了接收描述符中基本上都是FS和LS同时为1,不可能有FS=1, LS=0的情况,因此Seg_Count的值永远只增不减,返回的frame.buffer值始终指向第一个接收缓冲区,而frame.length则等于当前缓冲区接收到的数据帧大小。
还有,以下两个函数的实现也有问题:
所以,慎用ETH的标准库函数!必要情况下自己写寄存器来实现 |
STM32F207VET6的flash是512KB的,为什么对0x080A0000后512KB的内存进行操作程序没有问题?
STM32F207VET6电源部分的CAP1、CAP2没有按要求接2.2uF为什么上电失败?
sn32f24fg-lqfp48这个芯片做无线通讯,有大佬推荐芯片,我想学习一下
我是新手,之前一直学习51,32不太了解,请问下sn32f24fg-lqfp48这种芯片开发学习,请问下需要注意什么?有不推荐书籍资料
LY的SPI PSRAM搭配STM32F0/STM32F1/STM32F2/STM32F3/STM32F4/系列
做软件开发,有哪些硬件电路相关的技术资料参考下?
stm32f207无法同时接上两个不同串口的数据
请教各位:在keil5安装了pack包的情况下,用cubemx生成工程,keil5打开后提示找不到对应的stm32型号
STM32F2 YMODEM IAP 问题
掉电保持中断问题
一一排除之后,才知道是接收函数有问题
==运算符的优先级比&更高
应该是(A & B) == C才对
而不是A & B == C,因为这相当于A & (B == C),显然是不能正常工作的