提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
最近在做的项目需要用到TCP通信,在使用cubemx配置lwip这一块也踩了不少坑,折腾了不少的时间才ping通并通信上了,故写下这篇新手教程,希望对各位嵌入式的同学们有所帮助!!
我是用的cubemx版本 6.4.0 本文中的硬件平台 野火挑战者 v2 开发板 MCU stm32f429IGTx
注意:cubemx6.5 及以上版本配置上差异巨大,使用6.5以上版本不适用本文
一、工程通用配置
因为是新手教程,故从工程配置说起。
1、RCC时钟配置
2、SYS选项配置
因为FreeRTOS需要使用systick作为时基的时钟源,故这里时基来源推荐选择除systick定时器外的其他定时器做为时基来源,如TIM2(根据项目需求选择)
3、初始化USART1并使能中断
这里初始化一个串口是为了方便后续调试打印相关的信息使用
4、工程名以及保存路径等配置
二、ETH配置
PHY为LAN8720A,硬件连接采用RMLL接口
1.硬件连接
这里值展示PHY与单片机ETH外设的连接部分,野火的板子上将PHY的复位引脚接到单片机的复位引脚了,使用软件复位了,推荐还是接到单片机的通用IO口,在初始化时硬件复位,在这里踩了坑,后面介绍配置上的区别
2、使能RMLL接口并根据原理图实际连接配置GPIO
3、Parameter Settings 选项卡配置
注意:PHY地址由LAN8720A的PHYAD0管脚的硬件连接决定,PHYAD0管脚拉高则这里PHY Address设置为1,PHYAD0管脚拉高浮空或拉低则这里PHY Address设置为0
4、Advanced Parameters选项卡配置
注意:图中红色线框1的内容为设置PHY的名称,本开发平台使用的为LAN8720,如果是LAN8742的话,直接勾选LAN8742选项即可。红色线框2部分的延迟配置在软件自动复位和采用硬件配置有所不同,在正常使用通用GPIO复位时这个地方保持默认配置即可,如果同本文中采用的野火挑战者开发板的将PHY服务脚接到单片机复位脚上了之后,这个地方的延迟需要修改同图中所示,其他的延时值本人也没有试过。
红色线框3部分的PHY相关寄存器配置一般保持默认即可。红色线框4部分按图中设置即可
5、勾选中断
三、FreeRTOS配置
1、开启FreeRTOS
进入FREERTOS选项,选择CMSIS_V1,根据需求修改以下栈空间,其他先保持默认即可。
2、修改默认生成的线程栈空间大小
在上一步开启FreeRTOS后,“Tasks and Queues"选项中会自动生成一个默认线程"defaultTask”,双击该线程在弹出的参数框中修改以下该线程分配的栈空间,因为后面开启lwip后,lwip的初始化会自动添加到该线程中,栈空间太小有可能不会堆栈溢出导致程序不能正常执行,这里也可以根据个人习惯修改一下线程名以及线程入口函数名字,我这里就没有做修改了。另外我新增了一个128bit栈空间的新线程,用来做指示灯闪烁的,这个地方可以跳过。
四、LWIP配置
1、进入LWIP选项卡,勾选Enable并配置"General Settings"选项卡
2、配置"Key Options"选项卡
这里所有参数代表什么意思有兴趣的可以自己查询一下,网络协议太复杂了,本人也说不好,以免误导在这里就不赘述了
3、配置"Checksum"选项卡
五、生成工程下载并ping通
1、cubemx生成工程并完成串口的重定向
生成工程并使用MDK打开工程,在usart.c文件中添加串口的重定向
`void Usart_SendString(uint8_t *str)
{
unsigned int k=0;
do
{
HAL_UART_Transmit(&huart1,(uint8_t *)(str + k) ,1,1000);
k++;
} while(*(str + k)!='\0');
}
///重定向c库函数printf到串口DEBUG_USART,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
/* 发送一个字节数据到串口DEBUG_USART */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);
return (ch);
}
///重定向c库函数scanf到串口DEBUG_USART,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{
int ch;
HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, 1000);
return (ch);
}`
2、打开ethernetif.c文件 HAL_ETH_MspInit函数中添加ETH硬件复位代码
HAL_GPIO_WritePin(GPIOI, GPIO_PIN_1, GPIO_PIN_SET);
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
GPIO_InitStruct.Pin = GPIO_PIN_1;
HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOI, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_Delay(50);
HAL_GPIO_WritePin(GPIOI, GPIO_PIN_1, GPIO_PIN_SET);
HAL_Delay(5);
这个地方的PHY硬件复位管脚需要根据自己的硬件实际连接修改管脚,几遍如野火挑战者开发板一样将硬件复位连接在了单片机复位脚上了,也推荐一个虚拟的管脚到这里。
3、点击魔术棒,Target 选项卡中勾选Use MicroLIB选项
这一步很重要,千万不要落下!!!
好啦,到这里如果不需要AC6编译的极快速度,就已经可以编译并下载工程到开发板并ping通了
六、AC6编译设置
1、点击魔术棒,进行如下配置
1、将下载好的freertos源文件中的 port.c 、portmacro.h文件复制到cubemx生成的工程文件夹中的Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F 目录下替换掉原有 port.c 、portmacro.h 文件
这两个文件没有的可以自行去FREERTOS官网下载源码,或者去野火或者正点原子的学习资料中都能找到FREERTOS源码文件
2、打开 cc.h 文件,注释掉如下两行代码
注意:这里一个比较坑的点就是,每次用cubemx重新生成工程之后,都要重复上述两步的操作,十分麻烦文章来源:https://www.toymoban.com/news/detail-660386.html
3、打开lwip.h文件,添加代码 #define __CC_ARM,到这里编译工程就能享受飞一般的编译速度并且不会报错啦
文章来源地址https://www.toymoban.com/news/detail-660386.html
到了这里,关于CubeMX配置ETH+LWIP+FreeRTOS+AC6编译新手详细教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!