我终于还是开始写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)
|