STM32F407和LAN8720调试记录
来源:互联网 发布:java 泛型 class 参数 编辑:程序博客网 时间:2024/06/07 06:23
LAN8720测试代码的整理
1. 在两个工程的基础上修改,分别是正点原子ATK的 “实验55 网络通信实验” 和ST官方的“STSW-STM32070”例程
硬件是原子的explorer和SeerF4kernelV2。
两个例程的问题在于ATK例程用的外部SRAM,注释掉外部SRAM后跑不起来。而ST官方例程用的芯片是DP83848,需要手动修改为LAN8720A。
针对ST的例程,网上有对应的文档:ST 中stsw-stm32070 的网络例子——将DP83848CVV 修改为 LAN8720A
目前按照这个文档对ST例程进行修改。
2.继续在ATK的板子上尝试,关键点在于ATK的例程里自己做了内存管理。所以要放弃SRAM的使用的话,先要把内存管理去掉,把外部FSMC关掉。
在lwip的mem.c和memp.c中,按照lwip自己的方式,申请了ram_heap和memp_memory。而ATK的例程里注释掉了这两个地方,在lwip_comm.c中,从自己的内存池申请了内存分配给这两个单元。因此首先把这两个地方复原。
3.另一个自行管理的内存块在LAN8720.c中的ETH模块DMA缓冲区。
__align(4) ETH_DMADESCTypeDef *DMARxDscrTab;//以太网DMA接收描述符数据结构体指针__align(4) ETH_DMADESCTypeDef *DMATxDscrTab;//以太网DMA发送描述符数据结构体指针 __align(4) uint8_t *Rx_Buff; //以太网底层驱动接收buffers指针 __align(4) uint8_t *Tx_Buff; //以太网底层驱动发送buffers指针
把这块内容改成:
__align(4) ETH_DMADESCTypeDef DMARxDscrTab[ETH_RXBUFNB];//以太网DMA接收描述符数据结构体指针__align(4) ETH_DMADESCTypeDef DMATxDscrTab[ETH_TXBUFNB];//以太网DMA发送描述符数据结构体指针 __align(4) uint8_t Rx_Buff[ETH_RX_BUF_SIZE*ETH_RXBUFNB]; //以太网底层驱动接收buffers指针 __align(4) uint8_t Tx_Buff[ETH_TX_BUF_SIZE*ETH_TXBUFNB]; //以太网底层驱动发送buffers指针
4. 完成了上面的操作后,可以把lwip_comm.c中所有的xxx_malloc()和xxx_free()等函数注释成空函数。
测试程序,仍然能够ping通网卡。至此已经还原Lwip中所有内存管理部分。
5. 在main.c中,将FSMC_SRAM_Init()注释掉,发现ping不通网卡了。
重新把函数放出来。
进入FSMC_SRAM_Init(),注释掉最后的
// FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); //初始化FSMC配置// FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE); // 使能BANK1区域3发现仍然能够ping通,说明问题在上边。
仔细看发现上面有:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE);//使能PD,PE,PF,PG时钟即一些IO时钟的初始化在FSMC_SRAM_Init()中做了,其他组件在进行操作的时候可能没有再重新初始化。
把这句单独拉出来放到main.c中,然后注释掉FSMC_SRAM_Init(),能够成功运行。
可以看到,函数之间的耦合会给后期调试带来麻烦。
至此,一个独立的LAN8720的测试代码已经整理出来。
F4Kernel的调试
u8 ETH_MACDMA_Config(void)函数中的:
ETH_DeInit(); //AHB总线重启以太网ETH_SoftwareReset(); //软件重启网络while (ETH_GetSoftwareResetStatus() == SET);//等待软件重启网络完成程序一直卡在while循环中。
u8 LAN8720_Init(void)中,讲IO初始化的代码注释掉一部分:
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; GPIO_Init(GPIOA, &GPIO_InitStructure);在ATK的板子上模拟连接故障的情况。将代码刷入ATK的板子,程序也卡在了while循环处。
do { timeout++; tmpreg = ETH->MACMIIAR; } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_READ_TO));
把ATK的板子网线拔掉,debug进行对比,也是走到这一步。
- STM32F407和LAN8720调试记录
- STM32F407VGT6+LAN8720 调试笔记
- AM335X连接LAN8720的调试过程
- 再次调试STM32F407+DP83848
- 再次调试STM32F407+DP83848
- STM32F407的RAM调试
- 再次调试STM32F407+DP83848
- STM32F103与STM32F407的SPI调试笔记
- ADS131A02驱动调试笔记(stm32f407+spi)
- MPU6500驱动调试笔记(STM32F407+SPI)
- STM32F407和STM32F051主从I2C通信方法
- STM32F407和STM32F103的移植注意事项
- 【stm32f407】IO引脚复用和映射
- 官方历程 调试STM32F407 VCP例程未知设备问题
- STM32F407学习记录1:MDK开发环境一些配置
- STM32F407学习记录2:SysTick嘀嗒定时器学习
- stm32f407 学习过程中时钟问题(整理记录)
- VOIP:RTP分析和AC490调试记录
- python 计算并绘制灰度直方图
- 配置JAVA的环境变量
- 引用类型(二)Array类型
- Java企业微信开发_04_消息推送之发送消息(主动)
- 作业1 编写多线程程序,模拟多个人通过一个山洞。
- STM32F407和LAN8720调试记录
- Hive安装及使用
- pandas的factorize(),numpy库unique函数
- Linux系统安装svn
- 可变参数列表解析
- Nginx&C++实现简单的fastcgi程序
- struts2
- 微信小程序--request(ajax)请求
- JS获取word文档内容到html页面