[STM32F7] ST评测+STM32F746 Nucleo-144开发板测评——使用 CubeMX 创建以太...

[复制链接]
 楼主| shendu0032 发表于 2021-1-15 23:52 | 显示全部楼层 |阅读模式
我终于还是开始写ST的测评帖子。今天介绍一下STM32F746 Nucleo-144开发板,利用CubeMX从零创建以太网工程。先放张实物图看看M7内核216MHz开发板的大气磅礴。 实物图.jpg 实物图2.jpg 实物图3.png 正面注释图.png 背面注释图.png
我从官网上https://www.st.com/zh/evaluation-tools/nucleo-f746zg.html?ecmp=tt9470_gl_link_feb2019&rt=db&id=DB3171#documentation,找到了这块板卡的全部资料,这个链接里面有很多资料,包括AD文件都给了我们。
文件哪里找.png
先了解一下有哪些功能:虽然这块是STM32F7高性能的单片机,但板载的外设资源比较少,基本上都是排针把引脚引出来,这样方便接线和连接其他功能模块。Nucleo板不同于Discovery,只是单纯的核心板,像显示屏,按键(基本的两个按键还是有的),陀螺仪等都是没有的。
硬件资源:
(1)ST-Link V2-1(具有三个功能:ST-Link调试下载器,虚拟串口,大容量的存储盘(U盘))
(2)具有ST最新设计的ST Zio扩展口,兼容Arduino UNO R3接口
(3)ST morpho扩展接口,可访问MCU的所有IO口
(4)灵活的电源选择:ST-Link 5v供电 ,外部3.3V供电,外部5V供电,外部7~12V供电
(5)USB OTG全速
(6)3个用户LED,一个电源LED,一个ST-LInk双色LED
(7)2个按键:蓝色用户按键,黑色复位按键
(8)网络接口:IEEE-802.3-2002 10/100Mbps
(9)支持多种编程工具:IAR,Keil,GCC-based IDEs,ARM mbed
从上面的介绍可以看出,板载资源还是相对丰富的,作为一块核心板使用绰绰有余,当然,这块开发板最大的特点之一就是其丰富的扩展接口:兼容Arduino UNO接口,主要引脚有A0~A5,D0~D15,该接口有大量的扩展板可以使用,并且是标准接口,可以方便的即插即用。在Arduino UNO基础上,ST全新设计了ST Zio接口,提供大量模拟数字接口A6~A8,D16~D72,便于访问STM32的更多外设。还有ST morpho扩展接口,可以访问板上STM32的所有IO口。关于接口的原理图,我放在链接中,或者查看这篇帖子,他里面也有详细介绍 https://www.21ic.com/evm/evaluate/MCU/201603/665553_2.htm下面介绍一下STM32F746ZG的特点,虽然他的帖子中也有介绍,我再废话一下吧。基于ARM 32位Cortex-M7内核,带FPU,DSP指令,MPU,ST ART加速器,L1缓存,零等待周期执行,最高主频216MHz,性能高达462 DMIPS/2.14 DMIPS/MHz(Dhrystone 2.1)1M Flash,320K SRAM,最高32位数据总线的FMC可用于扩展SRAM,PSRAM,SDRAM/LPSDRSDRAM,NOR/NAND等。支持Quad-SPI......总之,作为STM32的高性能MCU,资源也是非常丰富的,能满足嵌入式MCU各个领域的应用要求,是中高端应用领域的良好选择之一。下面我开始详细介绍用CubeMX这个开发工具从零来创建以太网工程,虽然ST的官网给了我一个PDF的使用说明,但由于CubeMX的版本问题,以及结合自身Keil软件的生态,有必要再解释一下。
我目前使用CubeMX的是最新版本6.0.0。而说明手册上使用的是4.18版本,显然有点低。
(1)新建一个Project,在向导中选择STM32F746ZGTU
New Project.png
有可能点击新建工程后会出现弹窗,如果出现错误提示,点击OK即可,这个软件需要安装工程库。耐心的等待它完成就可以了。
新建工程后出现弹窗.png
新建成功后会出现芯片型号的选择,直接勾选即可
新建工程后选择型号.png
之后是选择导出Export,选择你文件储存的位置。
导出.png
之后便可以开始工程,点击右上角的Start Project
开始工程.png
这个时候我们看到的还是一个空的工程,如下图:
空的工程.png
(2)外设使能,引脚配置
首先是以太网外设引脚配置,Nucleo-144板上用的PHY LAN8742A,RMII接口,在CubeMX中使能ETH外设,选择RMII接口。CubeMX会自动配置对应的以太网接口,如下图:
第一步使能.png
STM32的很多引脚都有复用功能,同一个功能也可以remap到不同的引脚。所以这里要记得将CubeMX自动配置的引脚和实际电路中使用的引脚进行对比,保证是一致的。从UM1974中可以找到Nucleo-144板上以太网引脚分配表。对比这张表格和CubeMX的默认配置,会发现PB11,PB12引脚在STM32F746-Nucleo板中没有用做以太网的接口,而是用做其他用途了。
PG11.png
PG13.png
CubeMX的默认分配:
默认配置.png
CubeMX中修改引脚配置:修改方法见下图,用同样的方法配置PG11和PG13,配置PG11和PG13后,对应PB11和PB12会自动清除之前的配置,以免冲突。
PG11完成.png
PG13完成.png
再次是使能LwIP协议栈,在这个工程内,我们会用到LwIP协议栈,所以还需要在这一页的Middlewares部分将LwIP勾选上。之后就可以在Configuration页面对LwIP协议栈进行配置了。
使能协议栈.png
(3)时钟配置
接下来进行时钟配置。CubeMX默认系统时钟16MHz,但以太网外设需要至少25MHz的系统时钟,所以这里会看到Clock Configuration页面显示错误,打开Clock Configuration页面会自动跳出一个提示框,可以选择让CubeMX来帮你自动调整时钟配置,也可以自己手动进行调整,这里我选择让CubeMX自动配置,CubeMX会自动将时钟配成216MHz。直接点击YES即可。
时钟错误.png
(4)配置以太网参数
在Parameter Settings页面,可以配置MAC地址,PHY地址,是否进行自动协商等。这里我们设置了MAC地址为本地地址02:00:00:00:00:00。LAN8742A的PHY地址由上电时PHYAD0的状态决定。根据STM32F746-Nucleo板的原理图,设置PHY地址为0。
MAC.png
状态.png
接收数据的模式有轮询和中断两种方式,中断方式需要和操作系统一起使用,这里我们没有任何操作系统,所以在RXMode这一项只能选择Polling Mode。最后一项是TX IP Header Checksum Computation,STM32de MAC控制器可以在发送数据自动添加IP数据报的checksum,如果需要这一项功能,就将这一项设置为By hardware。
RX MODE.png
在Advanced Parameters页,可以根据所用的PHY修改寄存器的地址和一些MASK的设置。因为STM32F746的两款开发板上用的都是PHY LAN8742A,所以CubeMX中默认的配置是以LAN8742A为例进行设置的,所以这里,我们不需要做任何修改就可以直接用。但如果是其他的PHY,可以在PHY这一项选择user PHY,然后根据所用PHY的数据手册,配置下面的参数,对于部分无法通过CubeMX进行配置的参数,需要手动的修改代码。将有冲突的地方删除,或者添加某个功能。Advanced Parameters页分为三部分:External PHY Configuration.复位延时,读/写超时的参数设置。Common:External PHY Configuration。PHY的基础寄存器配置,这部分寄存器对于大部分PHY都是相同或类似的。Extended:External PHY Configuration。PHY的扩展寄存器配置,这部分对于每个PHY都是不一样的。如果是使用非CubeMX默认的PHY,这部分内容需要特别注意。
不动.png
(5)修改LWIP的参数
配置好以太网参数后,回到CubeMX的配置界面。选择LWIP继续进行参数配置。首先是General Settings页面,在这里我们可以看到LWIP的版本号。配置IP地址信息,可以选择通过DHCP的方式动态分配IP,也可以分配一个静态的IP地址。这里,我们选择配置静态的IP地址192.168.0.10,子网掩码255.255.255.0,网关192.168.0.1。ICMP协议打开,因为我们用的是TCP协议,所以吧UDP协议关掉。不用担心不知道每项参数是做什么用的,选择每一项参数后都会在窗口的底部显示该项参数的解释。
子网掩码.png
在Key Options这一页里,有更多的参数可以配置。关于接受/发送内存的配置也是在这里。选择右上方的Show Sdvanced Parameters后,还有更多的参数配置项。这里我们也可以不做修改,使用默认值。CubeMX中每个参数项的名称和代码中的名称相同,这样也方便在代码中进行查找。
key.png
到此为止,我们在CubeMX中需要做的配置就全部完成了。选择Project->Generate Code,生成初始的工程。
最后.png
下面就是Keil上的操作。
首先新建tcp_echoserver.c文件,在此文件里面要做下面几件事情。
(1)新建tcp_echoserver_pcb(调用tcp_new函数)
(2)将新建的tcp_echoserver_pcb与要监听的端口绑定(调用tcp_blind函数)
(3)转成监听状态(调用tcp_listen函数)
(4)注册回调函数tcp_echoserver_accept,当有新连接建立后会调用该函数(调用tcp_accept函数)
(5)注册回调函数tcp_echoserver_recv,当该连接接收到数据后会调用该函数(调用tcp_recv函数)
(6)完成tcp_echoserver_recv函数,在该函数内,将接收到的数据再发出去。
  1. #include "stats.h"
  2. #include "tcp.h"

  3. void tcp_echoserver_init(void);
  4. static err_t tcp_echoserver_accept(void *arg,struct tcp_pcb *newpcb,err_t err);
  5. static err_t tcp_echoserver_recv(void *arg,struct tcp_pcb *tpcb,struct pbuf *p,err_t err);
  6. static struct tcp_pcb *tcp_echoserver_pcb;



  7. void tcp_echoserver_init(void)  
  8. {

  9.   //创建一个新的TCP控制块  
  10.   tcp_echoserver_pcb = tcp_new();  
  11.   
  12.   if (tcp_echoserver_pcb != NULL)  
  13.   {  
  14.     err_t err;  
  15.       
  16.     //绑定到端口7  
  17.     err = tcp_bind(tcp_echoserver_pcb, IP_ADDR_ANY, 7);  
  18.       
  19.     if (err == ERR_OK)  
  20.     {  
  21.       //开始监听  
  22.       tcp_echoserver_pcb = tcp_listen(tcp_echoserver_pcb);  
  23.         
  24.       //设置tcp_echoserver_accept为accept的回调函数  
  25.       tcp_accept(tcp_echoserver_pcb, tcp_echoserver_accept);  
  26.     }  
  27.     else   
  28.     {  
  29.       memp_free(MEMP_TCP_PCB,tcp_echoserver_pcb);
  30.     }  
  31.   }  
  32.   
  33. }  

  34. static err_t tcp_echoserver_accept(void *arg,struct tcp_pcb *newpcb,err_t err)
  35. {
  36.         tcp_recv(newpcb,tcp_echoserver_recv);
  37.         return ERR_OK;
  38. }

  39. static err_t tcp_echoserver_recv(void *arg,struct tcp_pcb *tpcb,struct pbuf *p,err_t err)
  40. {
  41.         tcp_write(tpcb,p->payload,p->len,1);
  42.         pbuf_free(p);
  43.         return ERR_OK;
  44. }
在main函数中添加tcp_echoserver_init()在while(1)中添加MX_LWIP_Process()查询接收数据。记得要将代码加在/* USER CODE BEGIN 3 */  /* USER CODE END 3 */之间,这样才不会在下次使用CubeMX生成代码时被覆盖掉。
  1. int main(void)
  2. {
  3.   /* USER CODE BEGIN 1 */

  4.   /* USER CODE END 1 */

  5.   /* MCU Configuration--------------------------------------------------------*/

  6.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  7.   HAL_Init();

  8.   /* USER CODE BEGIN Init */

  9.   /* USER CODE END Init */

  10.   /* Configure the system clock */
  11.   SystemClock_Config();

  12.   /* USER CODE BEGIN SysInit */

  13.   /* USER CODE END SysInit */

  14.   /* Initialize all configured peripherals */
  15.   MX_GPIO_Init();
  16.   MX_LWIP_Init();
  17.   /* USER CODE BEGIN 2 */
  18.                 tcp_echoserver_init();
  19.   /* USER CODE END 2 */

  20.   /* Infinite loop */
  21.   /* USER CODE BEGIN WHILE */
  22.   while (1)
  23.   {
  24.     /* USER CODE END WHILE */
  25.                 MX_LWIP_Process();
  26.     /* USER CODE BEGIN 3 */
  27.   }
  28.   /* USER CODE END 3 */
  29. }
编译一下,下载成功后,打开TCP测试工具软件,向STM32F746板发一串数据
成果.jpg
yes.png
好了,实验成功。我在做的过程中遇到了Keil没有F7的程序包,没有Flash,无法下载程序。最后还是从Keil的官网找到了DFP文件包。
从零开始使用CubeMX创建以太网工程.pdf (1.2 MB, 下载次数: 6)
UM1974-STM32 Nucleo-144 board.pdf (2.76 MB, 下载次数: 3)
STM32CubeMX软件安装明细教程.pdf (1.16 MB, 下载次数: 3)
MB1137.pdf (3.2 MB, 下载次数: 1)
TCP&UDP.zip (996.39 KB, 下载次数: 7)
3117660019e28d1922.png
343616001b11c0dd9b.png
wds-zou 发表于 2021-1-17 12:28 来自手机 | 显示全部楼层
谢谢分享!学习学习!
caoenq 发表于 2021-1-18 09:39 | 显示全部楼层
感谢分享。不过STM32搞以太网是不是有点累
 楼主| shendu0032 发表于 2021-1-18 09:48 | 显示全部楼层
caoenq 发表于 2021-1-18 09:39
感谢分享。不过STM32搞以太网是不是有点累

是发帖比较累。用CubeMX其实挺方便的。
caoenq 发表于 2021-1-18 09:55 | 显示全部楼层
shendu0032 发表于 2021-1-18 09:48
是发帖比较累。用CubeMX其实挺方便的。

是的,尤其这种免费的普及知识的帖子,足见楼主不但知识渊博,而且人品极佳。
 楼主| shendu0032 发表于 2021-1-18 09:57 | 显示全部楼层
caoenq 发表于 2021-1-18 09:55
是的,尤其这种免费的普及知识的帖子,足见楼主不但知识渊博,而且人品极佳。 ...

过誉了,我是一个小小白。
usysm 发表于 2021-3-4 23:49 | 显示全部楼层
可以做个服务器了。  
aspoke 发表于 2021-3-7 22:21 | 显示全部楼层
工作频率高达216 MHz?
aspoke 发表于 2021-3-7 22:21 | 显示全部楼层
板子是申请的吗?   
232321122 发表于 2021-3-7 22:21 | 显示全部楼层
M7内核的高性能微控制器STM32F7系列
ghuca 发表于 2021-3-7 22:21 | 显示全部楼层
stm32f7可以用标准库开发吗
soodesyt 发表于 2021-3-7 22:21 | 显示全部楼层
楼主运行起来了吗  
mnynt121 发表于 2021-3-7 22:22 | 显示全部楼层
v8能调试stm32f7系列吗  
plsbackup 发表于 2021-3-7 22:22 | 显示全部楼层
STM32F746 Nucleo-144开发板  
kmzuaz 发表于 2021-3-7 22:23 | 显示全部楼层
如何获得stm32 cpu的唯一ID
qiufengsd 发表于 2021-3-7 22:23 | 显示全部楼层
谢谢楼主的资料分享。
wengh2016 发表于 2021-3-7 22:24 | 显示全部楼层
以太网这么复杂吗
iyoum 发表于 2021-3-7 22:24 | 显示全部楼层
以太网工程真复杂了。  
mnynt121 发表于 2021-3-7 22:24 | 显示全部楼层
stm32f7的uart的缓存是多少
soodesyt 发表于 2021-3-7 22:24 | 显示全部楼层
支持uclinux吗?   
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:总是缺乏自信,进进退退,走走停停,不停的自我耗损,又不断的为自我耗损而再耗损。

33

主题

261

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部