打印
[STM32F7]

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

[复制链接]
792|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我终于还是开始写ST的测评帖子。今天介绍一下STM32F746 Nucleo-144开发板,利用CubeMX从零创建以太网工程。先放张实物图看看M7内核216MHz开发板的大气磅礴。
我从官网上https://www.st.com/zh/evaluation-tools/nucleo-f746zg.html?ecmp=tt9470_gl_link_feb2019&rt=db&id=DB3171#documentation,找到了这块板卡的全部资料,这个链接里面有很多资料,包括AD文件都给了我们。

先了解一下有哪些功能:虽然这块是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

有可能点击新建工程后会出现弹窗,如果出现错误提示,点击OK即可,这个软件需要安装工程库。耐心的等待它完成就可以了。

新建成功后会出现芯片型号的选择,直接勾选即可

之后是选择导出Export,选择你文件储存的位置。

之后便可以开始工程,点击右上角的Start Project

这个时候我们看到的还是一个空的工程,如下图:

(2)外设使能,引脚配置
首先是以太网外设引脚配置,Nucleo-144板上用的PHY LAN8742A,RMII接口,在CubeMX中使能ETH外设,选择RMII接口。CubeMX会自动配置对应的以太网接口,如下图:

STM32的很多引脚都有复用功能,同一个功能也可以remap到不同的引脚。所以这里要记得将CubeMX自动配置的引脚和实际电路中使用的引脚进行对比,保证是一致的。从UM1974中可以找到Nucleo-144板上以太网引脚分配表。对比这张表格和CubeMX的默认配置,会发现PB11,PB12引脚在STM32F746-Nucleo板中没有用做以太网的接口,而是用做其他用途了。


CubeMX的默认分配:

CubeMX中修改引脚配置:修改方法见下图,用同样的方法配置PG11和PG13,配置PG11和PG13后,对应PB11和PB12会自动清除之前的配置,以免冲突。


再次是使能LwIP协议栈,在这个工程内,我们会用到LwIP协议栈,所以还需要在这一页的Middlewares部分将LwIP勾选上。之后就可以在Configuration页面对LwIP协议栈进行配置了。

(3)时钟配置
接下来进行时钟配置。CubeMX默认系统时钟16MHz,但以太网外设需要至少25MHz的系统时钟,所以这里会看到Clock Configuration页面显示错误,打开Clock Configuration页面会自动跳出一个提示框,可以选择让CubeMX来帮你自动调整时钟配置,也可以自己手动进行调整,这里我选择让CubeMX自动配置,CubeMX会自动将时钟配成216MHz。直接点击YES即可。

(4)配置以太网参数
在Parameter Settings页面,可以配置MAC地址,PHY地址,是否进行自动协商等。这里我们设置了MAC地址为本地地址02:00:00:00:00:00。LAN8742A的PHY地址由上电时PHYAD0的状态决定。根据STM32F746-Nucleo板的原理图,设置PHY地址为0。


接收数据的模式有轮询和中断两种方式,中断方式需要和操作系统一起使用,这里我们没有任何操作系统,所以在RXMode这一项只能选择Polling Mode。最后一项是TX IP Header Checksum Computation,STM32de MAC控制器可以在发送数据自动添加IP数据报的checksum,如果需要这一项功能,就将这一项设置为By hardware。

在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,这部分内容需要特别注意。

(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协议关掉。不用担心不知道每项参数是做什么用的,选择每一项参数后都会在窗口的底部显示该项参数的解释。

在Key Options这一页里,有更多的参数可以配置。关于接受/发送内存的配置也是在这里。选择右上方的Show Sdvanced Parameters后,还有更多的参数配置项。这里我们也可以不做修改,使用默认值。CubeMX中每个参数项的名称和代码中的名称相同,这样也方便在代码中进行查找。

到此为止,我们在CubeMX中需要做的配置就全部完成了。选择Project->Generate Code,生成初始的工程。

下面就是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函数,在该函数内,将接收到的数据再发出去。
#include "stats.h"
#include "tcp.h"

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



void tcp_echoserver_init(void)  
{

  //创建一个新的TCP控制块  
  tcp_echoserver_pcb = tcp_new();  
  
  if (tcp_echoserver_pcb != NULL)  
  {  
    err_t err;  
      
    //绑定到端口7  
    err = tcp_bind(tcp_echoserver_pcb, IP_ADDR_ANY, 7);  
      
    if (err == ERR_OK)  
    {  
      //开始监听  
      tcp_echoserver_pcb = tcp_listen(tcp_echoserver_pcb);  
        
      //设置tcp_echoserver_accept为accept的回调函数  
      tcp_accept(tcp_echoserver_pcb, tcp_echoserver_accept);  
    }  
    else   
    {  
      memp_free(MEMP_TCP_PCB,tcp_echoserver_pcb);
    }  
  }  
  
}  

static err_t tcp_echoserver_accept(void *arg,struct tcp_pcb *newpcb,err_t err)
{
        tcp_recv(newpcb,tcp_echoserver_recv);
        return ERR_OK;
}

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

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

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

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_LWIP_Init();
  /* USER CODE BEGIN 2 */
                tcp_echoserver_init();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
                MX_LWIP_Process();
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
编译一下,下载成功后,打开TCP测试工具软件,向STM32F746板发一串数据


好了,实验成功。我在做的过程中遇到了Keil没有F7的程序包,没有Flash,无法下载程序。最后还是从Keil的官网找到了DFP文件包。
从零开始使用CubeMX创建以太网工程.pdf (1.2 MB)
UM1974-STM32 Nucleo-144 board.pdf (2.76 MB)
STM32CubeMX软件安装明细教程.pdf (1.16 MB)
MB1137.pdf (3.2 MB)
TCP&UDP.zip (996.39 KB)

3117660019e28d1922.png (371.74 KB )

3117660019e28d1922.png

343616001b11c0dd9b.png (61.45 KB )

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其实挺方便的。

使用特权

评论回复
5
caoenq| | 2021-1-18 09:55 | 只看该作者
shendu0032 发表于 2021-1-18 09:48
是发帖比较累。用CubeMX其实挺方便的。

是的,尤其这种免费的普及知识的帖子,足见楼主不但知识渊博,而且人品极佳。

使用特权

评论回复
6
shendu0032|  楼主 | 2021-1-18 09:57 | 只看该作者
caoenq 发表于 2021-1-18 09:55
是的,尤其这种免费的普及知识的帖子,足见楼主不但知识渊博,而且人品极佳。 ...

过誉了,我是一个小小白。

使用特权

评论回复
7
usysm| | 2021-3-4 23:49 | 只看该作者
可以做个服务器了。  

使用特权

评论回复
8
aspoke| | 2021-3-7 22:21 | 只看该作者
工作频率高达216 MHz?

使用特权

评论回复
9
aspoke| | 2021-3-7 22:21 | 只看该作者
板子是申请的吗?   

使用特权

评论回复
10
232321122| | 2021-3-7 22:21 | 只看该作者
M7内核的高性能微控制器STM32F7系列

使用特权

评论回复
11
ghuca| | 2021-3-7 22:21 | 只看该作者
stm32f7可以用标准库开发吗

使用特权

评论回复
12
soodesyt| | 2021-3-7 22:21 | 只看该作者
楼主运行起来了吗  

使用特权

评论回复
13
mnynt121| | 2021-3-7 22:22 | 只看该作者
v8能调试stm32f7系列吗  

使用特权

评论回复
14
plsbackup| | 2021-3-7 22:22 | 只看该作者
STM32F746 Nucleo-144开发板  

使用特权

评论回复
15
kmzuaz| | 2021-3-7 22:23 | 只看该作者
如何获得stm32 cpu的唯一ID

使用特权

评论回复
16
qiufengsd| | 2021-3-7 22:23 | 只看该作者
谢谢楼主的资料分享。

使用特权

评论回复
17
wengh2016| | 2021-3-7 22:24 | 只看该作者
以太网这么复杂吗

使用特权

评论回复
18
iyoum| | 2021-3-7 22:24 | 只看该作者
以太网工程真复杂了。  

使用特权

评论回复
19
mnynt121| | 2021-3-7 22:24 | 只看该作者
stm32f7的uart的缓存是多少

使用特权

评论回复
20
soodesyt| | 2021-3-7 22:24 | 只看该作者
支持uclinux吗?   

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

33

主题

259

帖子

4

粉丝