STMCU小助手
发布时间:2021-12-25 11:17
|
一,写在前面" |0 [& M/ I+ l+ e7 @, [ 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指令。! ]9 h: t+ m, c, B7 C* m/ o4 F 1 N" w, E/ a& Y! J! l! y; K u LWIP是瑞典计算机科学院(SICS)的Adam Dunkels开发的一个小型开源的TCP/IP协议栈。; p% g8 B/ P0 ]! x$ q' e" v& } 三,STM32H7的特殊性 这里的特殊性,仅仅只是对比F1 F4系列: RAM F1 F4系列只有一块RAM,在使用RTOS的时候直接分配给RTOS做堆就可以了。7 }* f+ @) H- y5 r: [# e H7的RAM构成看下表:# Y) |* d8 m1 n; M' u* A" u: }
DTCM的速度是400M,但是DMA无法进行访问。" u- x) B6 z5 b3 e2 E/ C/ Y4 M, ~: f AXI SRAM的速度是200M,DMA可以进行访问。 SRAM3是以太网和USB的缓冲区。 " E$ V, _6 h, s5 R+ w5 p( | CACHE9 }+ \% Y* @4 C) } H7比F1 F4多了一个L1 CACHE一级缓存,这个缓存在为低速存储器带来加速的同时,也为程序带 来了一些问题,其中最为主要的时数据一致性的问题。 : y! R$ K ?3 j/ Y6 ~ DMA& L, y2 {" ^0 T8 Z9 \5 ~" r5 z H7的DAM分为DMA1,DAM2,BDMA,MDMA。其中SDIO和ETH的DMA又是独立的,就是说他们有专用的DMA和其他的DAM之间使用不冲突,无须额外使能,只需要开启中断就默认使用DMA模式。' S8 ^5 ~0 p! `0 n3 i7 d, p
四 ,移植前的准备工作 确保有一个可以在开发板上能正常运行RT_Thread的工程,目前RT_Thread已经有了正点原子H743的BSP,通过ENV工具使用scons --dist来把这个工程拿出来,复制出dist文件夹下的工程就可以直接使用了;* q& S5 U* Q8 Y" \" Q* `2 i( a, l- a 使用ENV工具,开启软件模拟IIC,因为正点原子的开发板的PHY复位接到了pcf8574的7号引脚,然后生成工程肯定会报错,这个时候从别的BSP目录下拷贝出pcf8574.c pcf8574.h phy_reset.c,放到工程里,然后在rtconfig.h加入以下代码来启用模拟IIC
这里的引脚号由硬件决定,如果不是原子的开发板可以省略这一步( V8 a2 r3 i- K: H" R P 因为RT-Thread目录下的STM32BSP是依赖CUBEMX,所以还需要在CUBEMX里面开启ETH的引脚,这个请和自己的板子一致;( {" _1 l3 k: J9 ?4 s! d + s3 v* k& W# V4 `* F: m8 n* Q4 `
3 t' W4 H; A; f( E! ~4 b$ \ 开启RMII模式,注意这里的PC1引脚无法选择成高电平,需要在生成的使msp.c里面自己修改为高电平,并开启中断。 检查是否开启了I_CACHE和D_CACHE9 T4 D9 Z7 B9 ^7 `+ ~$ f! k- N1 k
0 }, Q7 e8 ?3 o; @- W, _/ E 这里一定要开启,里面由依赖关系,不然会导致cache无法正确运行。& e9 }4 }' X( d ) a9 D8 R, K* J) z1 o 然后通过CUBEMX生成工程并把时钟初始化部分拷贝出来复制到board.c中 2 D* c9 _9 o; ]+ N8 n6 o, f. C+ c 在drv_mpu.c中加入MPU配置4 k/ a+ K# S9 g C a5 [ 以太网DMA描述符区,只能配置为Strongly - order或者Device。! \% O: i* G* P" M
在工程中添加ETH库函数,stm32h7xx_hal_eth.c和stm32h7xx_hal_eth_ex.c$ L5 M- o" }6 e; w# p& a " Q; o% @$ m7 E+ W1 M* G 五,LWIP协议栈的移植 该移植参考思路,移植也可以通过git log的方式参考这个移植步骤,但是这里移植里面有几处错误后文会提出。后来发现这个移植与STM32Cube\Repository\STM32Cube_FW_H7_V1.3.2\Projects\STM32H743ZI-Nucleo\Applications\LwIP,基本一致。, S7 j- c6 I7 c P8 m- w9 H, D ; @2 D" A! i6 P5 a LWIP协议栈的源码7 r' }2 M+ Z4 ^* a8 P 如果你有安装CUBEMX,那么直接从STM32Cube\Repository\STM32Cube_FW_H7_V1.3.2\Middlewares\Third_Party\LwIPP的目录下把LWIP的源码拷贝出来就可以了。或者下载参考思路里面的链接把LWIP源码拷贝出来。$ p$ y) r; W* ~" s( k0 x 工程中添加新的文件夹8 _0 } m0 \' Q1 n+ g( `* t lwip/api:添加LwIP\src\api目录下的所有文件$ q. E* Y( U( ^7 H) `9 z 2 S9 C9 G: z$ j J+ k9 R: v- p K/ u$ K
lwip/core:添加LwIP\src\core目录下的文件,并包括ipv4文件夹下的文件, M( |& r3 h8 l. q
lwip/netif:添加ethernet.c,sysarch.c0 S+ M. Z+ m* _" R. k2 b4 u
lwip/port:添加ethernetif.c,lan8742.c(lan8720也可以用)9 W/ }- A. w1 y/ j ( @" {/ K' C" M, R* t i1 }* |
5 x3 Z$ F4 `6 N( F 移植准备工作就全部做完了,下一节修改工程报错2 M& Z+ X8 ]/ {5 H# p) a - O2 _7 C, V% y) Y. ] ( }; y8 |( |2 Y1 [ |
【 逢7发帖赢大礼】1、利用CubeMX生成正点原子H7R7开发板的STM32CubeIDE工程
【STM32H735G-DK测评】ADC3+TIMER1+DMA 采样模拟信号
【STM32H735DK测评】Ethernet+lwip DHCP获取IP地址
STM32H743基于CubeMx5.0配置手册
【STM32H735G-DK测评】lvgl移植
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
【福利三:逢7发帖赢大礼】使用MPU6050模块、img_dsc、img_btn机制实现一些简单有趣的动画效果
【福利三:逢7发帖赢大礼】使用arc弧形拉条控件控制PWM舵机及使用SPI3接口操作NRF24L01模块进行无线通信
【福利三:逢7发帖赢大礼】调试nucleo-WBA65RI工程测试样板的一些心得
【福利三:逢7发帖赢大礼】lv_timer和BME680实现温度、湿度、气压数据读取
微信公众号
手机版