完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
最近,刚接触STM32CubeMX,感觉功能非常强大,特别是对于ETH,USB,FAT等特别方便,不用再像以前那样去找各种移植方法(移植起来既麻烦也耽误时间)。
此处,我以自己手头上一个子头上(STM3207VCT207VCT6)配置过程,中间也有类似的配置过程,希望未来在ETH的时候可以参考,以节省自己的开发周期。 具体过程: 1、打开STM32CubeMX,并选择相应的芯片。文中的芯片为STM32F207VCT6,选择后图: 2、我们配置RCC、ETH、PA8以及使能LWIP; 由于这里的开发板硬件上为RMII方式,所以选择ETH-RMII,若有同志的开发板为MII方式,请参考MII的配置,这里只针对RMII; RCC选择外部设备源,另外勾选MCO1,软件会自动将PA8为MCO1模式,该对对于RMII方式很重要,用于为PHY芯片提供50MHz这个时钟; 使能 LW的IP ;3、内核树相关配置,必须保证MCO1输出为50Mhz,如果频率失调会导致PHY芯片无法工作; 我这里因为芯片为207VCT6,为了使MCO1输出为50Mhz,所以PLL倍频参数的一些调整,大致如下:(同志们配置时可根据自己的芯片配置,但需要保证MCO1的输出为50Mhz)。中的设备配置参数是一开始配置的,后来发现网络虽然能通,但丢包严重,后通过百度找到了采用MCO1输出作为设备的问题,解决方法如下: /* IMPORTANT NOTE ===== ========== 此配置仅在 MCO 引脚用作 RMII 时钟源时有效。 要在 MCO 引脚上输出 50 MHz 时钟信号, 必须遵守以下条件: – 连接到 OSCIN/OSCOUT 引脚的 25 MHz 外部晶振 – RCC_PLLCFGR PLL 系数配置如下: PLLMx = 4,PLLNx = 64,PLLP = 4。 这导致系统时钟为 100 MHz。 – 然后将 RCC_CFGR 寄存器中的 MCO 预分频器设置为 2, 将系统时钟配置为 50 MHz。 */ 将cuMX生成后的工程中配置的地方,分别修改PLLMx = 4, PLLNx = 64, PLLP = 4,可以解决丢包问题! 4、ETH、LWIP、RCC相关参数设置; 至此,比较重要的都在前面了,但还有一点还需要注意,即 PA8 输出速度,几次不成功都因为这个自己没注意。 孩子的设置可以根据同志们自己的需求设置,这里给出 参数我的设置供参考;ETH 参数保持默认,但可以选择一下; LWIP 参数设置如下:(因为我这里是配置UDP 服务器,IP 选择)直接分配) 5、生成工程,做最后的函数修改; 给生成的工程添加UDP服务器的初始化以及端口绑定等相关函数; 我这里直接将之前的官方示例程中的UDP服务器文件添加,如下: 之后将.c文件添加到用户程序,主函数添加Udp的.h头文件;如下:(udp文件的具体内容在给大家) 6、主函数还需要添加几个函数,说明定位函数作用及实现原理讲解,仅做添加说明。 附:udp_echoserver相关文件内容(该文件为官方的示例程序,版权归官方,此处做转载) udp_echoserver.c的内容如下: / *包括------ -------------------------------------------------- ----------*/ #include "main.h" #include "lwip/pbuf.h" #include "lwip/udp.h" #include "lwip/ tcp.h " #include #include /* 私有 typedef ---------------------------------------------- -------------*/ /* 私有定义 ------------------------------- -----------------------------*/ #define UDP_SERVER_PORT 7 /* 定义UDP本地连接端口*/ #define UDP_CLIENT_PORT 7 / * 定义UDP远程连接端口*/ /* 私有宏------------------------------------ ------------------------*/ /* 私有变量 -------------------- -------------------------------------*/ /* 私有函数原型 ------ -----------------------------------------*/ void udp_echoserver_receive_callback(void *arg, struct udp_pcb *upcb、struct pbuf *p、const ip_addr_t *addr、u16_t 端口); /* 私有函数---------------------------------------------- -----------*/ /** * @brief 初始化服务器应用程序。 * @param None * @retval None */ void udp_echoserver_init(void) { struct udp_pcb *upcb; err_t 错误; /* 创建一个新的 UDP 控制块 */ upcb = udp_new(); if (upcb) { /* 将 upcb 绑定到 UDP_PORT 端口 */ /* 使用 IP_ADDR_ANY 允许任何本地接口使用 upcb */ err = udp_bind(upcb, IP_ADDR_ANY, UDP_SERVER_PORT); if(err == ERR_OK) { /* 为 upcb 设置接收回调 */ udp_recv(upcb, udp_echoserver_receive_callback, NULL); } } } /** * @brief 当在UDP_PORT 端口上接收到UDP 数据组时调用此函数。 * @param arg 用户提供的参数 (udp_pcb.recv_arg) * @param pcb 接收数据的 udp_pcb * @param p接收的数据包缓冲区 * @param addr接收数据包的远程 IP 地址 * @param port接收数据包的远程端口 * @retval None */ void udp_echoserver_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port) { /* 连接到远程客户端 */ udp_connect(upcb, addr, UDP_CLIENT_PORT); /* 告诉客户端我们已经接受了 */ udp_send(upcb, p); /* 释放 UDP 连接,以便我们可以接受新客户端 */ udp_disconnect(upcb); /* 释放 p 缓冲区 */ pbuf_free(p); } udp_echoserver.h的内容如下: 的#ifndef __ECHO_H__ 的#define __ECHO_H__ 空隙udp_echoserver_init(无效); #endif /* __MINIMAL_ECHO_H */ 7、至此,所有的工作完成,编译工程,下载至开发板。由于udp_echoserver中绑定的端口号为7,这里我们通过测试工具测试网络的功能,如下: |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1877 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1661 浏览 1 评论
1145 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
760 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1720 浏览 2 评论
1963浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
789浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
612浏览 3评论
629浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
591浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-12 03:38 , Processed in 0.641305 second(s), Total 44, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号