stm32f407以太网及USB OTG快速开发

引言

想要快速完成网络协议栈和USB OTG功能,使用ST自家的工具STM32CubMx再好不过的了。如果你还不会使用,别着急下面我会一步一步的用图片告诉你如何做。

软件平台:windows、STM32CubMx、keil v5

硬件平台:原子的stm32f407ZGT6开发板

STM32CubMx配置

1、以太网管脚的映射配置

第一:阅读原理图,使用STM32CubMx完成配置,原理图这里不说明。直接到STM32CubMx配置。

(1)、打开STM32CubMx软件,选择New Project,在弹出的菜单选择,选择对应的芯片,点击OK即可。如下图:

​​

(2)    设置clock,板子使用的是8MHz的晶振,软件对应的是Peripheral –>RCC。如下图:

​​

(3)      根据原理图配置以太网,选择的是RMII接口,注意由于有管脚的复用,所有选择RMII后,软件自动的软件不一定和原理的对应上,我们应该按照原理图来配置管脚!对应上的就不用更改,不对应上就必须更改。如下图:

​​

原图上的以太网PHY芯片管脚连接图是RMII接口,如下图所示:

​​

相应的管脚,软件对应管脚配置

​​

RMII_REF_CLK 、ETH_MDIO、RMII_CRS_DV、ETH_RESET、RMII_TX_EN、RMII_TXD0、RMII_TXD1这些管脚对应的位置以及软件上的配置,如下图:

​​

​​

​​

​​

经过上述配置以太网的管脚基本上映射好了。修改管脚配置,方法:点击某个关键在弹出的功能菜单选中对应的功能即可!

2、USB OTG管脚映射

OTG配置!使用FS做OTG,因为原理图上面用的是FS。

​​

管脚使用默认的管脚无需更改。

3、UART1作为打印口映射

​​

4、第三方库的配置

(1)      第三方库的配置主要是文件系统(USB OTG需要)、网络协议栈(以太网需要)、RT OS(选配本次使用OS方便后面的以太网和USB OTG任务的调度)。

如下:由于选了OS,而OS的滴答基于Systick来运作的,所以我们得另外选择定时器用来做软件的tcik的这里选这TIM1。如下图所示:

配置sys tick,系统记时,单位是ms

​​

第三方库的选配:

文件系统选择USB Disk USB硬盘设备

使能freeOS(嵌入式实时操作系统)、LWIP(TCP/IP协议栈)

​​

细节方面:

系统时钟的配置

系统时钟的配置,Clock configuration选项卡里设置,如下配置:使用168MHz的时钟,USB时钟必须是48MHz。具体配置如下:

​​

功能的配置 Configuration选项卡里面设置,为了方便网页的开发,我这里配置LWIP的httpd功能,GPIO设置输出设置为High。如下图:

​​

总体细节框架如下:

​​

生成代码框架步骤:

生成代码框架,菜单project->setting设置编译平台和目录,Generator code生成代码框架!

代码的配置

1、进入到软件的及代码平台的编写!

(1)      PHY驱动的编写

由于按照上面的步骤生成的代码基本上是可以用的,但是该代码基于的是LAN8742A芯片配置的PHY,原理图上用的是LAN8720,注意PHY芯片基本都上都一样的主芯片和PHY通信是通过MDIO接口来通信的,这个是标准化的,所以框架程序里面也是这样子的,这些基本不用改,而且PHY是IEEE802.3中定义的一个标准模块,PHY芯片的寄存器地址0-31地址具体功能IEEE802.3也是规范化标准了的,所以移植的时候就很方便了,不同的是PHY复位时间和PHY芯片地址,关于地址LAN8720有如下描述:

The PHYAD0 bit is driven high or low togive each PHY a unique address.

PHYAD 0 bit设置为1或者0以给PHY一个唯一的地址,就是LAN7820A的地址。Thisaddress is latched into aninternal register at the end of a hardware reset (default = 0b). PHY芯片硬件复位后地址被锁在内部寄存器。

In a multi-PHY application (such as a repeater), the controller isable to manage each PHY via the unique address. 多PHY芯片应用场景(例如一个中继器),控制器能够通过这个唯一的地址管理每隔PHY芯片。

Each PHY checks eachmanagement data frame for a matching address in the relevant bits. 每隔PHY芯片检查检查每个管理数据帧的相关位来匹配这个地址。

When a match is recognized, the PHYresponds to that particular frame. 当一个匹配被检查到,PHY响应一个特殊的帧。

The PHY address is also used to seed the scrambler.PHY.地址也用于种子的扰码

In a multi-PHYapplication, this ensures that the scramblers are out of synchronization and dispersesthe electromagneticradiation across the frequency spectrum.

根据上面的说法我们这里LAN7820的地址应该是0,所以找到LAN8742A_PHY_ADDRESS这个定义改为0即可。

位置:Stm32f4xx_hal_conf.h

复位时间

IP修改

修改自己的IP,注意该框架是默认打开DHCP的,DHCP功能,设备能在网内能请求DHCP服器来动态的配置设备的IP,我们这里要设置为固定iP,所以禁用DHCP!如下:

头文件:lwipopts.h

​​

lwip.c文件修改

​​

固定IP修改,为了方便使用,我这定义一个联合体类型来存储IP地址,如下图:

​​

修改HAL_ETH_Init函数,添加硬复位如下:

​​

​​

LWIP测试结果

经过这样子就修改就可以完成了!只用主机能ping通,注意打印口映射代码没写出来,这个很简单,百度一下就有。具体实验图如下:

​​

使用正点原子的串口工具,必须用它的。注意要打开一些调试信息就可以看到了这些打印信息了。

​​

USB OTG 则直接可以用,答应USB监听状态,实验效果图如下:

​​

USB测试结果

​​

插入USB,主机检测到了USB连接上了,可以调用mount然后fopen函数来正常的读取文件了,到此基本完成!

总结

1、完成了LWIP和USB的功能,剩下就是网络通信,这些都是应用程序了,相对来说简单。网络通信无非就是SOCKET、以及USB就是fopen函数的调用write和read函数等。

2、关于打印口看到了httpd_init,那是因为我添加了网页设计,通过网页可以修改IP等。

3、使用STM的STM32CubMx软件快速开发出你想要的框架,底层配置大多数可以不用自己的手工的去计算,比如时钟,如果通过自己的计算来给各个总线来分配时钟源那会相当麻烦,从做STM32F103的时候就深有体会。如果还不会这个软件的,建议还是得学会,因为它可以帮我们很大的忙。作为从事STM32和linux开发的我来说,省去一大部分的时间了。

stm32f407以太网及USB OTG快速开发的更多相关文章

  1. STM32F767ZI NUCLEO144 基于CubeIDE快速开发入门指南

    刚入手的NUCLEO-F767ZI:整合官网资源,理清思路,便于快速进行快发: 文章目录 1 NUCLEO 系列 2 NUCLEO-F767ZI 3 环境搭建 3.1 Keil/IAR安装 3.2 C ...

  2. 快速开发MQTT(一)电子工程师眼中的MQTT

    转载:https://zhuanlan.zhihu.com/p/54669124 DigCore 主页http://www.digcore.cn 文章首发于同名微信公众号:DigCore 欢迎关注同名 ...

  3. USB otg 学习笔记

    1 USB OTG的工作原理 OTG补充规范对USB2.0的最重要的扩展是其更具节能性的电源管理和允许设备以主机和外设两种形式工作.OTG有两种设备类型:两用OTG设备(Dualrole device ...

  4. USB OTG to PC USB API简介

    本API分为四部分:Linux或Android内核 (主要是gadget驱动).linux端API及其DEMO.Windows 驱动.Windows API及其Demo. 一.linux.Androi ...

  5. [分享]我的LABVIEW快速开发串口测试软件实例

    LABVIEW是美国国家仪器公司(National Instruments,简称NI)的创新产品,它允许编程人员使用图形方式来进行编程,摒弃了艰涩难懂的代码,只需要拖动相应图形控件然后连线,进行简单的 ...

  6. 详述USB OTG发展及协议标准

    USB On-The-Go 扩大了USB 的应用领域,将USB 从传统的PC 与外设通讯的模式,扩展到移动电子和嵌入式领域中,抛开主机PC,实现通常的外设与外设之间点对点(Point to Point ...

  7. USB OTG简单介绍

    1 引言 随着USB2.0版本号的公布,USB越来越流行,已经成为一种标准接口.如今,USB支持三种传输速率:低速(1.5Mb/s).全速(12Mb/s)和快速(480Mb/s),四种传输类型:块传输 ...

  8. Basic4android:多功能的Android应用软件快速开发平台

    Basic4android 是目前最简单.最强大的Android平台快速应用开发工具. ( "Basic4android is the simplest and most powerful ...

  9. USB OTG简要

    1 介绍 随着USB2.0发布版本号,USB更受欢迎.它已成为一种标准接口.现在,USB它支持三种速度:低速(1.5Mb/s).全速(12Mb/s)速(480Mb/s),四种传输类型:块传输.同步传输 ...

随机推荐

  1. vector 的用法--------------自绘资源

    创建 命名 选择根元素 当然你也可以选择其他元素 属性介绍vector 元素 name:定义该矢量图形的名字.通过名字找到这个矢量图width,height:定义该矢量图形的固有宽高(必须的,矢量图内 ...

  2. 20175226 2018-2019-2 《Java程序设计》第四周学习总结

    20175226 2018-2019-2 <Java程序设计>第四周学习总结 教材学习内容总结 子类与父类 格式class 子类名 extends 父类名 Object类是所有类的祖先类 ...

  3. 二阶环路滤波器的matlab 设计

    clc; Rs=10*10^6; %码速率 es=0.707; %阻尼系数 fs=8*10^6; %采样频率.系统时钟频率 Bit_Loop_out=27;%环路滤波器输入输出位宽 N=31; %NC ...

  4. django中静态文件的配置路径

    一  先找到配置文件 二  将配置文件添加上(注意名字一定要大写)

  5. react 20180504

    react 入门 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  6. mq_receive

    NAME mq_receive - 从消息队列中获取消息 (REALTIME) SYNOPSIS #include <mqueue.h> ssize_t mq_receive(mqd_t ...

  7. Redis数据结构之ziplist

    本文及后续文章,Redis版本均是v3.2.8 本篇文章我们来分析下一种特殊编码的双向链表-ziplist(压缩列表),这种数据结构的功能是将一系列数据与其编码信息存储在一块连续的内存区域,这块内存物 ...

  8. day11.装饰器初识

    1.开放封闭原则 原则: 开放封闭原则,对扩展是开放的,对修改是封闭的. 封版概念:当写好一个功能以后,就不可以再修改此函数,避免下面一系列的调用产生错误. 因此产生了装饰器 2.装饰器形成过程 我们 ...

  9. Codeforces 750E New Year and Old Subsequence 线段树 + dp (看题解)

    New Year and Old Subsequence 第一感觉是离线之后分治求dp, 但是感觉如果要把左边的dp值和右边的dp值合起来, 感觉很麻烦而且时间复杂度不怎么对.. 然后就gun取看题解 ...

  10. ef core的外键约束笔记

    ef core设置可选外键,有如下几种方式:1.在依赖实体AAA中,并不显式设置外键属性XXXId 2.手动设置外键属性XXXId为可空类型(int?等类型) 3.在实体类与数据表进行映射时,配置狭隘 ...