0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RT-Thread、STM32H7、LWIP简介

RTThread物联网操作系统 来源:lq 2019-05-07 17:27 次阅读

一、写在前面

STM32H7目前还是一个比较新的MCU,网上的资料相对于F1 F4系列相对来说就很少了,我自己在移植这个LWIP的时候走了不少弯路,得到了不少人帮助。写这篇文章也是对我自己移植的一个总结,也是希望后来人能少走弯路。这篇文章有由个人编辑并整理,如有错误,欢迎拍砖。

二、RT-Thread、STM32H7、LWIP简介

RT-Thread是一个来自中国的开源物联网操作系统,它提供了非常强的可伸缩能力:从一个可以运行在ARM Cortex-M0芯片上的极小内核,到中等的ARM Cortex-M3/4/7系统,甚至是运行于MIPS32、ARM Cortex-A系列处理器上功能丰富系统。

STM32H7是ST意法半导体Cortex_M系列最高性能处理器。主频高达400M,FLASH高达2Mbytes,SRAM高达1Mbytes,采用六级流水线,自带 指令 和数据 Cache、集成 JPEG编解码器、 编解码器、 集成双精度硬件浮点计算单元( DPFPU)和 DSP指令。

LWIP是瑞典计算机科学院(SICS)的Adam Dunkels开发的一个小型开源的TCP/IP协议栈。

三、STM32H7的特殊性

这里的特殊性,仅仅只是对比F1 F4系列:

1、RAMF1 F4系列只有一块RAM,在使用RTOS的时候直接分配给RTOS做堆就可以了。H7的RAM构成看下表:

DTCM的速度是400M,但是DMA无法进行访问。AXI SRAM的速度是200M,DMA可以进行访问。SRAM3是以太网USB的缓冲区。

2、CACHEH7比F1 F4多了一个L1 CACHE一级缓存,这个缓存在为低速存储器带来加速的同时,也为程序带 来了一些问题,其中最为主要的时数据一致性的问题。CACHE策略问题请参考言简意赅的介绍M7内核的Cache工作流程,摸爬滚打半年的经验总结。

(链接请复制至外部浏览器打开:http://forum.armfly.com/forum.php?mod=viewthread&tid=90066&highlight=%C3%FE%C5%C0%B9%F6%B4%F2)

3、DMAH7的DAM分为DMA1,DAM2,BDMA,MDMA。其中SDIO和ETH的DMA又是独立的,就是说他们有专用的DMA和其他的DAM之间使用不冲突,无须额外使能,只需要开启中断就默认使用DMA模式。

四、移植前的准备工作

1、确保有一个可以在开发板上能正常运行RT-Thread的工程,目前RT-Thread已经有了正点原子H743的BSP

(地址:https://github.com/RT-Thread/rt-thread/tree/master/bsp/stm32/stm32h743-atk-apollo 喜欢的话不要忘了给RT-Thread点一个),通过ENV工具使用scons --dist来把这个工程拿出来,复制出dist文件夹下的工程就可以直接使用了;

2、使用ENV工具,开启软件模拟IIC,因为正点原子的开发板的PHY复位接到了pcf8574的7号引脚,然后生成工程肯定会报错,这个时候从别的BSP目录下拷贝出pcf8574.c pcf8574.h phy_reset.c,放到工程里,然后在rtconfig.h加入以下代码来启用模拟IIC

1#defineBSP_USING_I2C223#defineBSP_I2C2_SCL_PIN1164#defineBSP_I2C2_SDA_PIN117

这里的引脚号由硬件决定,如果不是原子的开发板可以省略这一步

3、因为RT-Thread目录下的STM32BSP是依赖CUBEMX,所以还需要在CUBEMX里面开启ETH的引脚,这个请和自己的板子一致;

开启RMII模式,注意这里的PC1引脚无法选择成高电平,需要在生成的使msp.c里面自己修改为高电平,并开启中断。

4、检查是否开启了I_CACHE和D_CACHE

这里一定要开启,里面由依赖关系,不然会导致cache无法正确运行。

5、然后通过CUBEMX生成工程并把时钟初始化部分拷贝出来复制到board.c中

6、在drv_mpu.c中加入MPU配置以太网DMA描述符区,只能配置为Strongly - order或者Device。

1MPU_Region_InitTypeDefMPU_InitStruct; 2 3/*DisabletheMPU*/ 4HAL_MPU_Disable(); 5 6/*ConfiguretheMPUattributesasDevicenotcacheable 7forETHDMAdescriptors*/ 8MPU_InitStruct.Enable=MPU_REGION_ENABLE; 9MPU_InitStruct.BaseAddress=0x30040000;10MPU_InitStruct.Size=MPU_REGION_SIZE_256B;11MPU_InitStruct.AccessPermission=MPU_REGION_FULL_ACCESS;12MPU_InitStruct.IsBufferable=MPU_ACCESS_BUFFERABLE;13MPU_InitStruct.IsCacheable=MPU_ACCESS_NOT_CACHEABLE;14MPU_InitStruct.IsShareable=MPU_ACCESS_NOT_SHAREABLE;15MPU_InitStruct.Number=MPU_REGION_NUMBER0;16MPU_InitStruct.TypeExtField=MPU_TEX_LEVEL0;17MPU_InitStruct.SubRegionDisable=0x00;18MPU_InitStruct.DisableExec=MPU_INSTRUCTION_ACCESS_ENABLE;1920HAL_MPU_ConfigRegion(&MPU_InitStruct);2122/*ConfiguretheMPUattributesasCacheablewritethrough23forLwIPRAMheapwhichcontainstheTxbuffers*/24MPU_InitStruct.Enable=MPU_REGION_ENABLE;25MPU_InitStruct.BaseAddress=0x30044000;26MPU_InitStruct.Size=MPU_REGION_SIZE_16KB;27MPU_InitStruct.AccessPermission=MPU_REGION_FULL_ACCESS;28MPU_InitStruct.IsBufferable=MPU_ACCESS_NOT_BUFFERABLE;29MPU_InitStruct.IsCacheable=MPU_ACCESS_CACHEABLE;30MPU_InitStruct.IsShareable=MPU_ACCESS_NOT_SHAREABLE;31MPU_InitStruct.Number=MPU_REGION_NUMBER1;32MPU_InitStruct.TypeExtField=MPU_TEX_LEVEL0;33MPU_InitStruct.SubRegionDisable=0x00;34MPU_InitStruct.DisableExec=MPU_INSTRUCTION_ACCESS_ENABLE;3536HAL_MPU_ConfigRegion(&MPU_InitStruct);3738/*EnabletheMPU*/39HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);

7、在工程中添加ETH库函数,stm32h7xx_hal_eth.c和stm32h7xx_hal_eth_ex.c

五、LWIP协议栈的移植

该移植参考思路,移植也可以通过git log的方式参考这个移植步骤,但是这里移植里面有几处错误后文会提出。后来发现这个移植与STM32CubeRepositorySTM32Cube_FW_H7_V1.3.2ProjectsSTM32H743ZI-NucleoApplicationsLwIP,基本一致。

1、LWIP协议栈的源码如果你有安装CUBEMX,那么直接从STM32CubeRepositorySTM32Cube_FW_H7_V1.3.2MiddlewaresThird_PartyLwIPP的目录下把LWIP的源码拷贝出来就可以了。或者下载参考思路里面的链接把LWIP源码拷贝出来。

2、工程中添加新的文件夹lwip/api:添加LwIPsrcapi目录下的所有文件

lwip/core:添加LwIPsrccore目录下的文件,并包括ipv4文件夹下的文件

lwip/netif:添加ethernet.c,sysarch.c

lwip/port:添加ethernetif.c,lan8742.c(lan8720也可以用)

移植准备工作就全部做完了,下一节修改工程报错!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16011

    浏览量

    343532
  • 编解码器
    +关注

    关注

    0

    文章

    227

    浏览量

    23978
  • STM32H7
    +关注

    关注

    0

    文章

    6

    浏览量

    3555

原文标题:基于RT-Thread在STM32H7上移植LWIP(一)

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    RT-Thread内核简介

    RT-Thread 内核简介前言1、RT-Thread 的架构2、RT-Thread 的内核3、RT-Thread 内核功能部分线程调度时钟
    发表于 08-06 07:44

    RT-Thread的线程简介

    文章目录RT-Thread的线程简介源码分析初始化线程线程脱离启动线程挂起线程线程睡眠线程让出测试参考资料:RTT官网文档关键字:分析RT-Thread源码、stm32、RTOS、线程
    发表于 08-24 07:56

    教你使用RT-Thread开启STM32H7系列的RTC与Alarm组件

    背景【ART-PI】默认没有开启Alarm组件,尝试适配并开启有部分工程师想使用RT-Thread 基于STM32H7系列的RTC 与 Alarm(闹钟功能)验证平台Keil MDK5
    发表于 03-16 14:05

    基于RT-Thread Studio如何去实现STM32H7LWIP移植呢

    1.创建一个新工程,选择STM32H7,串口1,本人板子是自己做的,stm32h750,Y版本,其实相当于stm32h743,请根据自己的板子选择芯片。2.根据官方文档定义ETH相关宏Board.
    发表于 03-17 10:13

    基于RT-Thread Studio实现STM32H7LWIP移植

    1.创建一个新工程,选择STM32H7,串口1,本人板子是自己做的,stm32h750,Y版本,其实相当于stm32h743,请根据自己的板子选择芯片。2.根据官方文档定义ETH相关宏Board.
    发表于 10-18 14:45

    RT-Thread Studio提示STM32H7无法支持串口DMA请问有什么解决方案

    使用RT-Thread Studio版本为2.1.2,STM32H7芯片支持包版本0.1.9,创建STM32H743ZIT6的项目,在RT-Thread Settings中勾选了串口D
    发表于 10-25 10:36

    RT-Thread studio为什么不支持stm32H7的cpu以太网驱动呢?

    rt thread studio不支持stm32H7系列的cpu以太网驱动
    发表于 02-16 10:54

    RT-thread】如何将RT-thread系统移植到stm32

    1.RT-thread简介T-Thread(Real Time-Thread),是一个嵌入式实时多线程操作系统。在 RT-Thread 系统
    发表于 12-08 11:06 20次下载
    【<b class='flag-5'>RT-thread</b>】如何将<b class='flag-5'>RT-thread</b>系统移植到<b class='flag-5'>stm32</b>

    RT-Thread STM32 配置系统时钟(使用外部晶振)

    RT-Thread STM32 配置系统时钟开发环境芯片:STM32F103RCT6RT-Thread Studio: V1.0.6(现在已经更新到1.1.3,由于本人使用RTT开发已经有一段时间
    发表于 12-14 18:45 14次下载
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>STM32</b> 配置系统时钟(使用外部晶振)

    RT-Thread学习笔记 RT-Thread的架构概述

    RT-Thread 简介 作为一名 RTOS 的初学者,也许你对 RT-Thread 还比较陌生。然而,随着你的深入接触,你会逐渐发现 RT-Thread 的魅力和它相较于其他同类型
    的头像 发表于 07-09 11:27 3989次阅读
    <b class='flag-5'>RT-Thread</b>学习笔记 <b class='flag-5'>RT-Thread</b>的架构概述

    RT-Thread文档_RT-Thread 简介

    RT-Thread文档_RT-Thread 简介
    发表于 02-22 18:22 5次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> <b class='flag-5'>简介</b>

    RT-Thread文档_RT-Thread 潘多拉 STM32L475 上手指南

    RT-Thread文档_RT-Thread 潘多拉 STM32L475 上手指南
    发表于 02-22 18:23 7次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> 潘多拉 <b class='flag-5'>STM32</b>L475 上手指南

    RT-Thread文档_RT-Thread SMP 介绍与移植

    RT-Thread文档_RT-Thread SMP 介绍与移植
    发表于 02-22 18:31 7次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> SMP 介绍与移植

    RT-Thread移植使用webserver (lwip+httpd)

    开发环境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的资源包为0.2.2,rt-thread版本为4.0.3。
    的头像 发表于 10-12 12:49 556次阅读
    <b class='flag-5'>RT-Thread</b>移植使用webserver (<b class='flag-5'>lwip</b>+httpd)

    RT-Thread在Lan8720a和 lwip基础上移植ntp流程

    开发环境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的资源包为0.2.2。以RT-Thread中Lan8720和
    的头像 发表于 10-12 16:59 863次阅读
    <b class='flag-5'>RT-Thread</b>在Lan8720a和 <b class='flag-5'>lwip</b>基础上移植ntp流程