STM32cubeMX配置LWIP+FREERTOS
1、选择并使能RCC时钟源为:HSE RTC时钟晶振为LSE
2、选择并使能FreeRTOS操作系统:
要特别注意的是内存配置里的TOTAL_HEAP_SIZE参数,建的任务内存不能超过这个数值;
配置比较简单,只需要在上面选中使用哪个版本,然后在下面“tasks and queues”中添加任务
这样就可以了
在stmcubeMX中进行配置的时候,如果使用了freertos系统,生成代码的时候会有如下提示:
其意思就是,当使用了FreeRtos的时候,强烈建议HAL库使用除了Systick以外的时钟源。也就是说当不使用FreeRtos的时候,HAL使用的是systick作为时钟源,现在使用了rtos,不建议hal库和rtos一起使用systick作为时钟源。
接着根据软件的建议,使用定时作为HAL库的时钟源:
这里我们使用TIM1(TIM2)作为HAL库的时钟源,点击生成代码时,上边的警告已经不再出现了
HAL库使用TIM1作为时钟源后,生成了一个文件
该文件里边的HAL_InitTick(uint32_t TickPriority)里边对tim1进行了配置
该文件里边的函数就是用来配置定时器的,1ms中断一次
在main()->HAL_Init()->HAL_InitTick(TICK_INT_PRIORITY);其中TICK_INT_PRIORITY的值为0,此时tim1的中断优先级是最高的。在tim1的中断函数中,我们可以看到,HAL库使用tim1的更新中断作为了时钟源
HAL_InitTick(uint32_t TickPriority)函数,有一段说明,里边有一点要注意,就是说当中断函数里边调用HAL_Delay()的时候,必须保证systick的优先级比中断函数的优先级高,因为这里是使用tim1作为时钟源,所以就是要求tim1的优先级比中断函数的优先级高,什么意思呢?例如串口中断的优先级是5,tim1的优先级是6,那么串口中断的优先级是高于tim1,此时调用HAL_Delay()是会出问题的。只有当tim1的优先级高于串口中断的时候(设置的数值小于5),才能调用,所以这里tim1的优先级就设置为了0,最高优先级。
3、选择并使能ETH接口为:RMII类型接口,本次使用的是LAN8742A模块,是RMII类型接口
LAN8720A 地址可以通过 PHYAD0 引脚来配置,该引脚与 RXER 引脚复用,芯片内部自带下拉电阻,当硬复位结束后, LAN8720A 会读取该引脚电平,作为器件的 SMI 地址,接下拉电阻时(浮空也可以,因为芯片内部自带了下拉电阻),设置 SMI 地址为 0,当外接上拉电阻后,可以设置为 1。本硬件RXER引脚浮空,其PHY芯片地址为0
PHY前16个寄存器是通用的标准的,所以都一样。第31个寄存器是比较重要,可以读取这个寄存器获取通讯速度和是否处在自协商模式
关于LWIP的PHY搭建,采用的PHY芯片为LAN8720A,RMII模式。
关于硬件连接部分采用的是原子的板子F407,硬件连接如下:
配置引脚时只需配置红色框内的,绿色框时和RJ45网卡硬件相连
注意,ETH_RESET引脚配置为输出模式,在程序中要先对复位引脚复位
注意:LAN8720A 可以通过 PHYAD0 引脚(如PHY芯片引脚10)来配置,该引脚与 RXER 引脚复用,芯片内部自带下拉电阻,当硬复位结束后, LAN8720A 会读取该引脚电平,作为器件的 SMI 地址,接下拉电阻时(浮空也可以,因为芯片内部自带了下拉电阻),设置 SMI 地址为 0,当外接上拉电阻后,可以设置为 1。本硬件RXER引脚浮空,其PHY芯片地址为0
关于SMT32CubeMx引脚时钟等配置根据实际情况配置即可,不在此进行赘述;
点开ETH配置中的Parameter Setting选项卡,配置如下:
在这个选项卡中,只需按照实际填写PHY地址即可,我用的PHY芯片地址为0,在此输入0即可;
点开ETH配置中的Advanced Parameters选项卡,选择如下:
由于STM32CubeMx系统默认的是,LAN8742A,因此我们选择user PHY配置LAN8720A;
其配置如下:
关于PHY芯片的配置项不多,多数采用默认参数即可,需要更改的已用红线标示如来:
PHY Address Value:就是我们在之前设置的PHY芯片地址;
PHY Name:这个仅是一个标志符,可以随便设置,在这里我设置的是LAN8720;
PHY Special Control/Status Register Offset:可以根据芯片手册查到,如下:
注意:该寄存器的地址是十进制的31
同样的,关于PHY Speed mask和PHY Duplex mask寄存器的设置如下:
其中Bits4:2就包含了PHY Speed mask和PHY Duplex mask的掩码,
Bits2代表两种速度10MB/s和100MB/s;PHY Speed mask(0x0004)
Bits4代表两种工作方式半双工和全双工;PHY Duplex mask(0x0010)
然后开启ETH的中断即可,采用默认优先级即可;
4、选择并使能LWIP协议栈:
切记,一定要使能CRC,载坑了
5、选择并使能UART3为:Asynchronous模式
6、设置LED的端口模式:可根据自己的板子原理图调整GPIO口
7、设置KEY的端口模式:可根据自己的板子原理图调整到相应的GPIO口
生成程序以后可以直接打开,ETH居然不用复位也可以获取到ip地址
并且还能ping通