【前言】
在STM32H7带来了大内存,供用户使用的内存增多,为了让系统稳定运行,MPU起到了重要的作用。书写这次的分享主要是在STM32H7S78-DK中的lwip配置中MPU的配置。
【硬件环境】
STM32H7S78-DK【软件环境】
1、stm32cubeIDE
2、stm32cubeMX
3、mdk5.38
【内存地址】
在一些文章中有介绍,stm32H7系列的lwip的内存需要放到DTCM或者SRAM中,要过查看STM32H7S78的一些Lwip的示例,其配置在SRAM中,地址为0x24020000中长度为16K。在RM0477第七章150-151页中有内存地址的详细介绍。
4、打开ETH中的app选项,Mode选择RMII,使能ETH PHY——INTN中断引脚。
5、在基本参数设置中,MAC地址选择默认生成的,如果在同一域局网内有多个相同模块,请手工设置。TX 、RX描述符地址选择0x20200080与0x20200000,长度为4位。RX的缓冲地址为0x24020100,长度为1000。
在描述符的长度介绍中,有前辈倪博的天空画出了详细的描述的图形
【注】图片要有侵权请联系删除
根据上述的图形描述结合STM32H7S7x8的内存地址图,来综合设置他的内存地址。特别说明一下,在stm32H7系列中经常会因为内存保护没有设置对而造成程序跑起来的,同样的代码,就是跑不起来!
6、GPIO的设置,需要参照开发板的用户手册进行对应的IO设置,这块开发板注意点是ETH-MDC这个引脚,在原理图中这PB10,但是在开发板介绍中有使用J6跳线来选择PC1的。同时修改IO的Very High的通信速度。
7、如果使用RTOS或者是中断接收。需要使能他的中断。
8、MPU的配置,在生成工程后,在MPU中添加对ETH的内存地址配置:
/** Initializes and configures the Region and the memory to be protected */ MPU_InitStruct.Number = MPU_REGION_NUMBER2; MPU_InitStruct.BaseAddress = 0x24020000; MPU_InitStruct.Size = MPU_REGION_SIZE_32KB; MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0; MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE; MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE; HAL_MPU_ConfigRegion(&MPU_InitStruct);
9、同时在.sct配置中添加配置选项:
RW_DMARxDscrTab 0x24020000 0x80 { *(.RxDescripSection) } RW_DMATxDscrTab 0x24020080 0x80 { *(.TxDescripSection) } memory_RX_POOL_base 0x24020100 0x8000-0x100 { *(.Rx_PoolSection) }
10、在代码中确认描述符与缓冲是否对应:
【验证】
在经过这样的配置后,配置好Lwip的其他选项,下载到开发板,便可以正常的引导ETH了。