关于使用STM32 CubeMX创建带有LWIP和FreeRTOS系统的若干问题汇总

STM32CubeMX配置底层驱动过程

  1. 首先配置单片机的时钟源,如果是晶振就在RCC的HSE中选择Crystal/Ceramic Resonator。在Clock Configuration界面里面配置为HSE,并对应设置系统的时钟。
  2. 返回Pinout&Configuration界面中设置SYS中配置使用的Debug,如果是ST-Link就配置为Serial Wire,注意不要配置错误,否则容易出现下载时经常出现连接失败而报错的故障。此外由于系统中使用了FreeRTOS操作系统,所以在这个界面中在CubueMX建议下更换Timebase Source时钟源,可以随便挑一个,但是不要用Systick(个人觉的没问题,只是使systick后生成固件中的HAL_Delay函数变得更加不准确,会增加一些时间)。
  3. 在Pinout&Configuration的Connectivity里面开启ETH 在ETH Mode and Configuration中配置模式,在此为了减少接口线数,我们配置为精简介质接口RMII,能够帮助初始化网卡芯片实现底层硬件接口初始化,注意默认初始化使用的网卡芯片的型号是LAN8742phy芯片,如果不是的话要进行一定的修改,但是对于以太网的网卡芯片默认都支持NE2000的标准,其中初始的16个配置寄存器都是一样的。所以基本通用,但是还是要留心。其他配置可以不用修改使用默认的方式。
  4. 接着在Pinout&Configuration界面中的Middleware中开启FREERTOS,在FREERTOS Mode and Configuration 里选择Interface CMSIS_V1,这个版本是默认给单核单片机使用的通常使用的比较多。其他Configuration项可以不改。
  5. 继续在Pinout&Configuration界面开启LWIP功能,在LWIP Mode and Configuration里面进行enbaled即可,其他配置可以不改,但是为了方便观看效果,我将令单片机配置为网站服务器,我们在Configuration 界面中的HTTPD进行Enabled,即可使能。
  6. 单片机功能和硬件配置基本结束,这一步是工程和编译器的配置,熟悉朋友可以跳过。我们切换到Project Manager界面,配置好工程名Project Name在Project Location 中配置工程路径,在ToolChain/IDE中挑选自己习惯使用的编译器,这里使用的是MDK5-ARM V5.32到此配置结束,点击右上角的GENERATE CODE按钮即会生对应的工程,生成后在弹出的提示窗中点击OPEN Project就能打开新建的工程。

工程配置好之后的若干修改(重点)

新建的工程还不能直接使用,编译会出现若干问题,解决这些问题这是本篇的主要内容,首先第一个是编译就会出现的问题,是文件fsdata_custom.c找不到,这个问题的出现是由于LWIP开启了HTTPD功能,而默认CubeMX会自动开启HTTPD_USE_CUSTOM_FSDATA 为1,也就是使用定制的HTTP网页文件,但是定制的网页文件需要我们自己完成设计并生成fsdata_custom.c文件将html文件转化为常量数组进行存储,而且没法在CubeMX关闭,但是我们可以在MDK中手动关闭,具体是在MDK编辑器中打开lwipopts.h文件,在文件最后添加上两句内容:#undef HTTPD_USE_CUSTOM_FSDATA #define HTTPD_USE_CUSTOM_FSDATA 0记得放在/* USER CODE BEGIN 1 /和/ USER CODE END 1 */之间,避免下次使用CubeMx时被修改。改完后编译过程就不会再报错了。在这里插入图片描述
但是革命尚未成功,还有问题,其中一个是在有FPU的单片机上如果开启了LWIP的协议栈,会导致单片机下载之后即使进行硬件复位也不会运行,而进行ST-Link Debug时,必须多次按下run才能正常运行程序,究其原因是因为在LWIP协议栈中默认#include了cc.h和arch.h文件,注意工程必须完成一次编译链接操作,否则看不到这两个文件,在这两个文件中使用了printf函数,这个函数需要stdio也就是标准输入输出作为接口,由于这两个函数的使用使得CubeMX会自动将生成的工程配置为使用 MicroLIB库,MDK编译器打开工程默认是不会勾选使用MicroLIB这个库,这就导致单片机上电、复位启动后进入__main时找不到入口,导致单片机还没运行就死机了,所以解决这个问题有我这里有两种方式,第一在MDK中勾选使用 MicroLIB库具体如下,勾完后记得最后的OK:
在这里插入图片描述
这个库会支持一些输出定向,使得printf的输入输出不再是Debug时的电脑主机接口,而是默认定向到串口1,并且这个库具备减小最后执行文件大小的功能,但是会减慢一些函数的执行比如memcopy函数,所以本人为了性能,放弃这种修改方式,且看第二种:第二种方式是在工程经过一次编译后搜索printf全单词匹配的工程文件,找到cc.h文件和arch.h文件,在cc.h文件中找到#define LWIP_PLATFORM_ASSERT(x) do {printf("Assertion \"%s\" failed at line %d in %s\n", \ x, __LINE__, __FILE__); } while(0)原语句,改为#define LWIP_PLATFORM_ASSERT(x) /*do {printf("Assertion \"%s\" failed at line %d in %s\n", \ x, __LINE__, __FILE__); } while(0)*/就是将LWIP_PLATFORM_ASSERT(x)定义为空,同样的在文件arch.h文件中找到原语句#define LWIP_PLATFORM_DIAG(x) do {printf x;} while(0)改为#define LWIP_PLATFORM_DIAG(x) /*do {printf x;} while(0)*/将含有printf函数的语句注释,避免使用,然后在在工程中找个地方添加退出半主机模式的语句如下:

#include "stdio.h"
struct __FILE 
{
int handle; 
}; 

FILE __stdout; 
void _sys_exit(int x) 
{
	x = x; 
}

如下是本人的三个操作结果,希望做此修改的朋友可以对照找到文件和行数:
在这里插入图片描述
至此工程基本修改完毕可以编译和执行了,但是我还有点小操作可以更完善这个工程,很多时候下载完毕想立即令单片机自动复位重启并自动执行程序,这时可以在MDK上做如下配置,总共8步,第6步没编号是勾选Reset and Run:
在这里插入图片描述
在这里插入图片描述
到此配置结束,重新编译。

最后功能验证

将新建的工程编译好之后,使用下载器将工程下载到单片机中,并将网线的一端连接单片机的网口,另一端连接具备DHCP功能的设备,可以是路由器,然后在将电脑通过网线或者wifi连接到提供DHCP的设备(路由器)保证单片机和电脑主机的ip在同一个网段或局域网内,本人用的是路由器,且电脑主机已经连接WiFi,从路由器设备管理界面看到分配给单片机的ip,在电脑上同时按win+R,在弹出命令窗输出cmd点击确认在弹出的cmd.exe窗口中输入ping ip,其中ip是刚刚在路由器管理界面看到分配给单片机的ip本人的是192.168.3.15,如果看到ping通的话就成功了如:
在这里插入图片描述
最后打开浏览器在浏览器地址中输入http://ip 也可以直接输入ip地址也是一样的,最后会看到lwip的网页了如下:
在这里插入图片描述
对不起,让你们看到了不安全,这个问题不是问题!

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
使用STM32CubeMX、LAN8720、LwIPFreeRTOS实现网络通信,需要注意以下几点。 首先,STM32CubeMX是一个图形化配置工具,用于为STM32微控制器生成初始化的代码框架。我们可以通过选择所需的外设(如以太网控制器)和配置参数来生成代码。 其次,LAN8720是一个用于实现以太网通信的PHY(物理层)芯片,负责将数据从媒介访问控制层(MAC层)转换为物理传输信号。 接下来,LwIP(Lightweight IP)是一个轻量级的网络协议栈,用于实现TCP/IP协议。我们需要将LwIP集成到项目中,并配置好网络参数,如IP地址、子网掩码和网关。 最后,FreeRTOS是一个流行的实时操作系统,用于管理任务调度和资源管理。我们可以将网络通信任务添加到FreeRTOS的任务列表中,并通过队列和信号量等机制进行任务间通信和同步。 总体实现步骤如下: 1. 使用STM32CubeMX选择并配置以太网控制器和PHY,并生成初始化代码。 2. 配置LwIP的网络参数,如IP地址、子网掩码和网关。 3. 将LwIP集成到项目中,包括源代码和相应的头文件。 4. 添加网络通信任务到FreeRTOS的任务列表中。 5. 在网络任务中,使用LwIP提供的API进行网络初始化、连接设置以及数据收发等操作。 6. 通过使用队列或信号量等机制,实现不同任务间的数据共享和同步。 7. 在主函数中初始化FreeRTOS,并启动任务调度器。 通过以上步骤,我们可以利用STM32CubeMX、LAN8720、LwIPFreeRTOS实现网络通信功能。这样我们就可以在STM32微控制器上实现网络连接、数据传输等网络应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值