AN3966
Application note
LwIP TCP/IP stack demonstration for STM32F407/STM32F417 microcontrollers
STM32F407/STM32F417 microcontrollers feature a high-quality 10/100 Mbit/s Ethernet peripheral that supports both Media Independent Interface (MII) and Reduced Media Independent Interface (RMII) to interface with the Physical Layer (PHY).
When working with an Ethernet communication interface, a TCP/IP stack is mostly used to communicate over a local or a wide area network.
This application note presents a demonstration package built on top of the LwIP (Lightweight IP) TCP/IP stack which is an open source stack intended for embedded devices.
This demonstration package contains nine applications running on top of the LwIP stack:
●Applications running in standalone mode (without an RTOS):
–A Web server
–A TFTP server
–A TCP echo client application
–A TCP echo server application
–A UDP echo client application
–A UDP echo server application
●Applications running with the FreeRTOS operating system:
–A Web server based on netconn API
–A Web server based on socket API
–A TCP/UDP echo server application based on netconn API
November 2011 |
Doc ID 022105 Rev 1 |
1/47 |
www.st.com
Contents |
AN3966 |
|
|
Contents
1 |
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
1 |
|
2 |
LwIP stack overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
6 |
|
|
2.1 |
Stack features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
6 |
|
2.2 |
Folder organization of the LwIP stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
7 |
|
2.3 |
LwIP API overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
7 |
2.3.1 Raw API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3.2 Netconn API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.3.3 Socket API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.4 LwIP buffer management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.4.1 Packet buffer structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.4.2 API for managing pbufs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.5 Interfacing LwIP to STM32F4x7 Ethernet network interface . . . . . . . . . . 11
3 |
STM32F4x7 low level driver overview . . . . . . . . . . . . . . . . . . . . . . . . . . |
13 |
|
3.1 Global Ethernet MAC/DMA functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
13 |
3.1.1 Ethernet MAC/DMA configuration parameters . . . . . . . . . . . . . . . . . . . . 14
3.2 DMA descriptor handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
17 |
3.2.1 DMA descriptors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.2.2 DMA descriptor handling functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.3 PHY control functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 3.4 Hardware checksum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4 |
Developing applications with LwIP stack . . . . . . . . . . . . . . . . . . . . . . . |
22 |
|
4.1 Developing in standalone mode using the Raw API . . . . . . . . . . . . . . . . . |
22 |
4.1.1 Model of operation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 4.1.2 Example of the TCP echo server demo . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.2 Developing with an RTOS using Netconn or Socket API . . . . . . . . . . . . . 26
4.2.1 Model of operation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 4.2.2 Example of a TCP echoserver demo using the Netconn API . . . . . . . . 27
4.3 LwIP memory configuration options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
5 |
Description of the demonstration package . . . . . . . . . . . . . . . . . . . . . |
31 |
2/47 |
Doc ID 022105 Rev 1 |
AN3966 |
Contents |
|
|
5.1 Package directories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 5.2 Demonstration settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
5.2.1 PHY interface configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 5.2.2 MAC and IP address settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 5.2.3 STM324xG-EVAL settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
6 |
Using the demos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
33 |
|
6.1 Standalone demos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
33 |
6.1.1 Httpserver demo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 6.1.2 TCP echo client demo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 6.1.3 TCP echo server demo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 6.1.4 UDP echo client demo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 6.1.5 UDP echo server demo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 6.1.6 TFTP server demo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
6.2 FreeRTOS demos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
6.2.1 HTTP server netconn demo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 6.2.2 HTTP server socket demo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 6.2.3 UDP TCP echo server netconn demo . . . . . . . . . . . . . . . . . . . . . . . . . . 42
7 |
Footprint information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
43 |
|
|
7.1 |
HTTP server demo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
43 |
|
7.2 |
HTTP server netconn demo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
43 |
8 |
Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
45 |
|
9 |
Revision history . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
46 |
Doc ID 022105 Rev 1 |
3/47 |
List of tables |
AN3966 |
|
|
List of tables
Table 1. TCP Raw API functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Table 2. UDP Raw API functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Table 3. Netconn API functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Table 4. Socket API functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Table 5. Pbuf API functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Table 6. ethernet_if.c functions description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Table 7. Global Ethernet MAC/DMA functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Table 8. MAC configuration parameters of an ETH_InitTypeDef structure. . . . . . . . . . . . . . . . . . . . 14 Table 9. DMA configuration parameters of an ETH_InitTypeDef structure. . . . . . . . . . . . . . . . . . . . 16 Table 10. DMA descriptor functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Table 11. PHY control functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Table 12. LwIP memory configuration options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Table 13. STM324xG-EVAL jumper configurations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 Table 14. HTTP server demo footprint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Table 15. Httpserver netconn demo footprint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Table 16. Document revision history . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4/47 |
Doc ID 022105 Rev 1 |
AN3966 |
List of figures |
|
|
List of figures
Figure 1. LwIP folder organization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Figure 2. Pbuf structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Figure 3. Ethernet DMA descriptor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Figure 4. Ethernet DMA descriptor chaining . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Figure 5. STM32F4x7 Ethernet driver buffers and descriptors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Figure 6. Tracking DMA Rx/Tx descriptors to Get/Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Figure 7. Standalone operation model. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Figure 8. LwIP operation model with RTOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Figure 9. Demonstration package structure. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Figure 10. Home page of the HTTP server demo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Figure 11. SSI use in HTTP server demo application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Figure 12. TCP echo client demo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 Figure 13. TCP echo server demo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Figure 14. UDP echo client demo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Figure 15. UDP echo server demon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Figure 16. TFTP tool (tftpd32) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Doc ID 022105 Rev 1 |
5/47 |
LwIP stack overview |
AN3966 |
|
|
LwIP is a free TCP/IP stack developed by Adam Dunkels at the Swedish Institute of Computer Science (SICS) and licensed under a modified BSD license.
The focus of the LwIP TCP/IP implementation is to reduce the RAM use while still having a full scale TCP/IP stack. This makes LwIP suitable for use in embedded systems.
LwIP comes with the following protocols:
●IPv4 and IPv6 (Internet Protocol v4 and v6)
●ICMP (Internet Control Message Protocol) for network maintenance and debugging
●IGMP (Internet Group Management Protocol) for multicast traffic management
●UDP (User Datagram Protocol)
●TCP (Transmission Control Protocol)
●DNS (Domain Name Server)
●SNMP (Simple Network Management Protocol)
●DHCP (Dynamic Host Configuration Protocol)
●PPP (Point to Point Protocol)
●ARP (Address Resolution Protocol)
LwIP has three application programming interface (API) sets:
●Raw API is the native API of LwIP. It enables the development of applications using event callbacks. This API provides the best performance and code size, but adds some complexity for application development.
●Netconn API is a high-level sequential API that requires the services of a real-time operating system (RTOS). The Netconn API enables multi-threaded operations.
●BSD Socket API: Berkeley-like Socket API (developed on top of the Netconn API)
|
The source code for the LwIP stack can be downloaded at the following link: |
|
http://savannah.nongnu.org/projects/LwIP |
Note: |
This application note is based on LwIP v1.3.2 |
6/47 |
Doc ID 022105 Rev 1 |
AN3966 |
LwIP stack overview |
|
|
When unzipped, the LwIP stack files can be found under “\Utilities\Third_Party\LwIP_v1.3.2” as shown in Figure 1.
Figure 1. LwIP folder organization
●doc: documentation text files
●port/STM32F4x7: files implementing the LwIP port to STM32F4x7
–arch: STM32 architecture port files (used data types,...)
–FreeRTOS: LwIP port to STM32F4x7 using FreeRTOS
–Standalone: LwIP port to STM32F4x7 in Standalone mode
●src: source files of the LwIP stack
–api: Netconn and Socket API files
–core: LwIP core files
–include: LwIP include files
–netif: Network interface files
As mentioned above, three types of APIs are offered by LwIP stack:
●Raw API
●Netconn API
●Socket API
2.3.1Raw API
The Raw API is based on the native API of LwIP. It is used to develop callback-based applications.
When initializing the application, the user needs to register callback functions to different core events (such as TCP_Sent, TCP_error,...) . The callback functions will be called from the LwIP core layer when the corresponding event occurs.
Doc ID 022105 Rev 1 |
7/47 |
LwIP stack overview |
AN3966 |
|
|
Table 1 provides a summary of the Raw API functions for TCP applications.
Table 1. |
TCP Raw API functions |
|
||
|
|
API function |
Description |
|
|
|
|
|
|
|
|
tcp_new |
Creates a new TCP PCB (protocol control block). |
|
|
|
|
|
|
|
|
tcp_bind |
Binds a TCP PCB to a local IP address and port. |
|
|
|
|
|
|
|
|
tcp_listen |
Starts the listening process on the TCP PCB. |
|
TCP connection |
|
|
||
tcp_accept |
Assigns a callback function that will be called when a |
|||
setup |
|
|||
|
new TCP connection arrives. |
|||
|
|
|
||
|
|
|
|
|
|
|
tcp_accepted |
Informs the LwIP stack that an incoming TCP |
|
|
|
connection has been accepted. |
||
|
|
|
||
|
|
|
|
|
|
|
tcp_connect |
Connects to a remote TCP host. |
|
|
|
|
|
|
|
|
tcp_write |
Queues up data to be sent. |
|
|
|
|
|
|
Sending TCP data |
tcp_sent |
Assigns a callback function that will be called when sent |
||
data is acknowledged by the remote host. |
||||
|
|
|
||
|
|
|
|
|
|
|
tcp_output |
Forces queued data to be sent. |
|
|
|
|
|
|
|
|
tcp_recv |
Sets the callback function that will be called when new |
|
|
|
data arrives. |
||
Receiving TCP data |
|
|||
|
|
|||
tcp_recved |
Must be called when the application has processed the |
|||
|
|
|||
|
|
incoming data packet (for TCP window management). |
||
|
|
|
||
|
|
|
|
|
|
|
|
Assigns a callback functions that will be called |
|
Application polling |
tcp_poll |
periodically. It can be used by the application to check if |
||
there is remaining application data that needs to be sent |
||||
|
|
|
||
|
|
|
or if there are connections that need to be closed. |
|
|
|
|
|
|
|
|
tcp_close |
Closes a TCP connection with a remote host. |
|
|
|
|
|
|
Closing and aborting |
|
Assigns a callback function for handling connections |
||
tcp_err |
aborted by the LwIP due to errors (such as memory |
|||
connections |
|
|
shortage errors). |
|
|
|
|
||
|
|
|
|
|
|
|
tcp_abort |
Aborts a TCP connection. |
|
|
|
|
|
Table 2 provides a summary of the Raw API functions for UDP applications.
Table 2. |
UDP Raw API functions |
|
API function |
Description |
|
|
|
|
udp_new |
|
Creates a new UDP PCB. |
|
|
|
udp_remove |
Removes and de-allocates a UDP PCB. |
|
|
|
|
udp_bind |
|
Binds a UDP PCB with a local IP address and port. |
|
|
|
udp_connect |
Sets up a UDP PCB remote IP address and port. |
|
|
|
|
udp_disconnect |
Removes a UDP PCB remote IP and port. |
|
|
|
|
udp_send |
|
Sends UDP data. |
|
|
|
udp_recv |
|
Specifies a callback function which is called when a datagram is received. |
|
|
|
8/47 |
Doc ID 022105 Rev 1 |
AN3966 |
LwIP stack overview |
|
|
The Netconn API is a high-level sequential API which has a model of execution based on the blocking open-read-write-close paradigm.
To function correctly, this API must run in a multi-threaded operation mode where there is a separate thread for the LwIP TCP/IP stack and one or multiple threads for the application.
Table 3 provides a summary of the Netconn API functions.
Table 3. |
Netconn API functions |
||
API function |
Description |
||
|
|
||
netconn_new |
Creates a new connection. |
||
|
|
||
netconn_delete |
Deletes an existing connection. |
||
|
|
||
netconn_bind |
Binds a connection to a local IP address and port. |
||
|
|
||
netconn_connect |
Connects to a remote IP address and port. |
||
|
|
|
|
netconn_send |
Sends data to the currently connected remote IP/port (not applicable for |
||
TCP connections). |
|||
|
|
||
|
|
||
netconn_recv |
Receives data from a netconn. |
||
|
|
||
netconn_listen |
Sets a TCP connection into a listening mode. |
||
|
|
||
netconn_accept |
Accepts an incoming connection on a listening TCP connection. |
||
|
|
||
netconn_write |
Sends data on a connected TCP netconn. |
||
|
|
||
netconn_close |
Closes a TCP connection without deleting it. |
||
|
|
|
LwIP offers the standard BSD socket API. This is a sequential API which is internally built on top of the netconn.
Table 3 provides a summary of the main socket API functions.
Table 4. |
Socket API functions |
|
API function |
Description |
|
|
|
|
socket |
|
Creates a new socket. |
|
|
|
bind |
|
Binds a socket to an IP address and port. |
|
|
|
listen |
|
Listens for socket connections. |
|
|
|
connect |
|
Connects a socket to a remote host IP address and port. |
|
|
|
accept |
|
Accepts a new connection on a socket. |
|
|
|
read |
|
Reads data from a socket. |
|
|
|
write |
|
Writes data on a socket. |
|
|
|
close |
|
Closes a socket (socket is deleted). |
|
|
|
Doc ID 022105 Rev 1 |
9/47 |
LwIP stack overview |
AN3966 |
|
|
LwIP manages packet buffers using a data structure called pbuf. The pbuf structure enables the allocation of a dynamic memory to hold a packet content and lets packets reside in the static memory.
Pbufs can be linked together in a chain. This enables packets to span over several pbufs.
Figure 2. Pbuf structure
next
payload
len
tot_len
flags ref
Room for packet headers
next pbuf structure |
MS18173V |
●next: pointer to next pbuf in a pbuf chain
●payload: pointer to packet data payload
●len: length of the data content of the pbuf
●tot_len: sum of pbuf len plus all the len fields of the next pbufs in the chain
●ref: (on 4 bits) reference count that indicates the number of pointers that reference the pbuf. A pbuf can be released from memory only when its reference count is zero.
●flags: (on 4 bits) indicate the type of pbuf.
LwIP defines three types of pbufs, depending on the allocation type:
●PBUF_POOL: pbuf allocation is performed from a pool of statically pre-allocated pbufs that have a predefined size. Depending on the data size that needs to be allocated, one or multiple chained pbufs are allocated.
●PBUF_RAM: pbuf is dynamically allocated in memory (one contiguous chunk of memory for the full pbuf)
●PBUF_ROM: there is no allocation for memory space for user payload, the pbuf payload pointer points to data in the ROM memory (it can be used only for sending constant data).
For packet reception, the suitable pbuf type is PBUF_POOL; it allows to rapidly allocate memory for the received packet from the pool of pbufs. Depending on the size of the received packet, one or multiple chained pbufs are allocated. The PBUF_RAM is not suitable for packet reception because dynamic allocation takes some delay. It may also lead to memory fragmentation.
For packet transmission, depending on the data to be transmitted, the user can choose the most suitable pbuf type.
10/47 |
Doc ID 022105 Rev 1 |
AN3966 |
LwIP stack overview |
|
|
LwIP has a specific API for working with pbufs. This API is implemented in the pbuf.c core file.
Table 5. |
Pbuf API functions |
||
API function |
Description |
||
|
|
||
pbuf_alloc |
Allocates a new pbuf. |
||
|
|
||
pbuf_realloc |
Resizes a pbuf (shrink size only). |
||
|
|
|
|
pbuf_ref |
|
Increments the reference count field of a pbuf. |
|
|
|
|
|
pbuf_free |
Decrements the pbuf reference count. If it reaches zero, the pbuf is de- |
||
allocated. |
|||
|
|
||
|
|
||
pbuf_clen |
Returns the count number of pbufs in a pbuf chain. |
||
|
|
|
|
pbuf_cat |
|
Chains two pbufs together (but does not change the reference count of |
|
|
the tail pbuf chain). |
||
|
|
||
|
|
||
pbuf_chain |
Chains two pbufs together (tail chain reference count is incremented). |
||
|
|
||
pbuf_dechain |
Unchains the first pbuf from its succeeding pbufs in the chain. |
||
|
|
|
|
pbuf_copy_partial |
Copies (part of) the contents of a packet buffer to an application |
||
supplied buffer. |
|||
|
|
||
pbuf_take |
Copies application supplied data into a pbuf. |
||
|
|
||
pbuf_coalesce |
Creates a single pbuf out of a queue of pbufs. |
||
|
|
|
Note: 1 “pbuf” can be a single pbuf or a chain of pbufs.
2When working with the Netconn API, netbufs (network buffers) are used for sending/receiving data.
3A netbuf is simply a wrapper for a pbuf structure. It can accommodate both allocated and referenced data.
4A dedicated API (implemented in file netbuf.c) is provided for managing netbufs (allocating, freeing, chaining, extracting data,...).
The port of LwIP stack to STM32F4x7 is located in folder “/port/STM32F4x7”.
This demonstration package provides two implementations:
●Implementation without RTOS (standalone)
●Implementation with an RTOS using FreeRTOS (http://www.freertos.org/)
For both implementations, the ethernet_if.c file is used to link the LwIP stack to the STM32F4x7 Ethernet network interface.
Doc ID 022105 Rev 1 |
11/47 |
LwIP stack overview |
AN3966 |
|
|
Table 6 provides a summary of the ethernet_if.c functions.
Table 6. ethernet_if.c functions description
Function |
Description |
low_level_init
Calls the Ethernet driver functions to initialize the STM32F4x7 Ethernet peripheral.
low_level_output Calls the Ethernet driver functions to send an Ethernet packet.
low_level_input Calls the Ethernet driver functions to receive an Ethernet packet.
ethernetif_init
Calls low_level_init to initialize the Ethernet peripheral and network interface structure (netif).
ethernet_input Calls low_level_input to receive a packet and provide it to the LwIP stack.
In case of an RTOS implementation, an additional file is used (sys_arch.c). This file implements an emulation layer for the RTOS services (message passing through RTOS mailbox, semaphores,etc.). This file should be tailored according to the current RTOS, which is FreeRTOS in this package.
12/47 |
Doc ID 022105 Rev 1 |
AN3966 |
STM32F4x7 low level driver overview |
|
|
The STM32F4x7 Ethernet low level driver is located in the
\Libraries\STM32F4x7_ETH_Driver\ folder.
|
The set of functions provided in the driver can be divided into the following categories: |
||
|
● Global Ethernet MAC/DMA configuration/control functions |
||
|
● DMA descriptors handling functions |
||
|
● |
DMA configuration/control functions |
|
|
● |
PHY control functions |
|
|
● Power Management (PMT) functions |
||
|
● MAC Management Counters (MMC) functions |
||
3.1 |
Global Ethernet MAC/DMA functions |
||
|
Table 15 provides a summary of the Global Ethernet MAC/DMA functions used for the |
||
|
configuration of the media access control (MAC) and direct memory access (DMA) features. |
||
Table 7. |
Global Ethernet MAC/DMA functions |
||
|
|
|
|
|
|
Function |
Description |
|
|
|
|
ETH_DeInit |
|
Resets the Ethernet peripheral. |
|
|
|
||
ETH_StructInit |
Fills a configuration structure for an Ethernet peripheral with the |
||
|
|
|
default config (see below). |
|
|
|
|
ETH_Init |
|
|
Initializes the Ethernet peripheral (MAC/DMA) registers with the |
|
|
|
required configuration. |
|
|
|
|
ETH_Start |
|
|
Starts the Ethernet MAC/DMA operation. |
|
|
||
ETH_MACTransmissionCmd |
Enables or disables MAC transmission. |
||
|
|
||
ETH_MACReceptionCmd |
Enables or disables MAC reception. |
||
|
|
||
ETH_GetFlowControlBusyStatus |
Checks flow control Busy flag. |
||
|
|
||
ETH_InitiatePauseControlFrame |
Initiates a Pause frame (full-duplex only). |
||
|
|
||
ETH_BackPressureActivationCmd |
Enables or disables Back pressure mechanism (half duplex mode). |
||
|
|
||
ETH_GetMACFlagStatus |
Gets MAC flags status. |
||
|
|
||
ETH_GetMACITStatus |
Gets MAC interrupts status. |
||
|
|
||
ETH_MACITConfig |
Configures MAC interrupts. |
||
|
|
||
ETH_MACAddressConfig |
Configures a MAC address. |
||
|
|
||
ETH_GetMACAddress |
Gets configured MAC address. |
||
|
|
||
ETH_MACAddressPerfectFilterCmd |
Enables or disables MAC perfect filtering for a selected MAC |
||
|
|
|
address. |
|
|
||
ETH_MACAddressFilterConfig |
Configures the MAC address filtering mode. |
||
|
|
||
ETH_MACAddressMaskBytesFilterConf |
Selects MAC address bytes on which filtering will be performed. |
||
ig |
|
|
|
|
|
|
|
Doc ID 022105 Rev 1 |
13/47 |
STM32F4x7 low level driver overview |
AN3966 |
|
|
The configuration structure for an Ethernet MAC/DMA is ETH_InitTypeDef.This structure is composed of the following MAC and DMA configuration parameters.
Table 8. |
MAC configuration parameters of an ETH_InitTypeDef structure |
|||
Parameter |
Description |
Default value* |
||
|
|
|
|
|
ETH_AutoNegotiation |
Enables PHY Auto-Negotiation. |
ETH_AutoNegotiation_Ena |
||
ble |
||||
|
|
|
||
|
|
|
|
|
|
|
Enables or disables Watchdog timer during |
|
|
|
|
frame reception. |
|
|
ETH_Watchdog |
– When enabled, the MAC allows no more than |
ETH_Watchdog_Enable |
||
|
|
2048 bytes to be received. |
|
|
|
|
– When disabled, the MAC can receive up to |
|
|
|
|
16384 bytes. |
|
|
|
|
|
|
|
|
|
– When enabled, the MAC allows no more than |
|
|
ETH_Jabber |
|
2048 bytes to be sent. |
ETH_Jabber_Enable |
|
|
– When disabled, the MAC can send up to 16384 |
|||
|
|
|
||
|
|
bytes. |
|
|
|
|
|
||
ETH_InterFrameGap |
Selects the minimum IFG between frames during |
ETH_InterFrameGap_96Bit |
||
|
|
transmission. |
|
|
ETH_CarrierSense |
Enables the Carrier Sense. |
ETH_CarrierSense_Enable |
||
|
|
|
|
|
ETH_Speed |
|
Sets the Ethernet speed: 10/100 Mbps |
ETH_Speed_100M |
|
|
|
|
|
|
|
|
Enables the ReceiveOwn. |
|
|
ETH_ReceiveOwn |
ReceiveOwn enables the reception of frames |
ETH_ReceiveOwn_Enable |
||
when the TX_EN signal is asserted in Half- |
||||
|
|
|
||
|
|
Duplex mode. |
|
|
|
|
|
|
|
ETH_LoopbackMode |
Enables the internal MAC MII Loopback mode. |
ETH_LoopbackMode_Disabl |
||
e |
||||
|
|
|
||
|
|
|
|
|
ETH_Mode |
|
Selects the MAC duplex mode: Half-Duplex or |
ETH_Mode_FullDuplex |
|
|
Full-Duplex mode |
|||
|
|
|
||
|
|
|
|
|
|
|
Enables the IPv4 checksum checking for |
ETH_ChecksumOffload_Dis |
|
ETH_ChecksumOffload |
received frame payloads for TCP/UDP/ICMP |
|||
able |
||||
|
|
packets. |
||
|
|
|
||
|
|
|
|
|
ETH_RetryTransmission |
Enables the MAC attempt retries transmission |
ETH_RetryTransmission_E |
||
when a collision occurs (Half-Duplex mode). |
nable |
|||
|
|
|||
|
|
|
||
ETH_AutomaticPadCRCStri |
Enables the Automatic MAC Pad/CRC Stripping. |
ETH_AutomaticPadCRCStri |
||
p |
|
|
p_Disable |
|
|
|
|
||
ETH_BackOffLimit |
Selects the BackOff limit value. |
ETH_BackOffLimit_10 |
||
|
|
|
|
|
ETH_DeferralCheck |
Enables the deferral check function (Half-Duplex |
ETH_DeferralCheck_Disab |
||
mode). |
le |
|||
|
|
|||
|
|
|
|
|
ETH_ReceiveAll |
Enables the reception of all frames by the MAC |
ETH_ReceiveAll_Disable |
||
(No filtering). |
||||
|
|
|
||
|
|
|
|
|
ETH_SourceAddrFilter |
Enables Source Address Filter mode. |
ETH_SourceAddrFilter_Di |
||
sable |
||||
|
|
|
||
|
|
|
|
14/47 |
Doc ID 022105 Rev 1 |
AN3966 |
|
STM32F4x7 low level driver overview |
||
|
|
|
|
|
Table 8. |
MAC configuration parameters of an ETH_InitTypeDef structure (continued) |
|||
|
|
|
|
|
|
Parameter |
Description |
Default value* |
|
|
|
|
|
|
ETH_PassControlFrames |
Sets the forwarding mode of the control frames |
ETH_PassControlFrames_B |
||
(including unicast and multicast Pause frames). |
lockAll |
|||
|
|
|||
|
|
|
||
ETH_BroadcastFramesRece |
Enables the reception of Broadcast frames. |
ETH_BroadcastFramesRece |
||
ption |
|
|
ption_Disable |
|
|
|
|
||
ETH_DestinationAddrFilt |
Sets the destination filter mode for both unicast |
ETH_DestinationAddrFilt |
||
er |
|
and multicast frames. |
er_Normal |
|
|
|
|
|
|
ETH_PromiscuousMode |
Enables Promiscuous filtering mode. |
ETH_PromiscuousMode_Dis |
||
able |
||||
|
|
|
||
|
|
|
|
|
ETH_MulticastFramesFilt |
Selects the Multicast frames filter mode: |
ETH_MulticastFramesFilt |
||
None/HashTableFilter/PerfectFilter/PerfectHashT |
||||
er |
|
ableFilter. |
er_Perfect |
|
|
|
|
||
|
|
|
|
|
|
|
Selects the Unicast frames filter mode: |
ETH_UnicastFramesFilter |
|
ETH_UnicastFramesFilter |
HashTableFilter/PerfectFilter/PerfectHashTableFil |
|||
|
|
ter |
_Perfect |
|
|
|
|
||
|
|
|
||
ETH_HashTableHigh |
This field holds the higher 32 bits of Hash table. |
0x0 |
||
|
|
|
||
ETH_HashTableLow |
This field holds the lower 32 bits of Hash table. |
0x0 |
||
|
|
|
||
ETH_PauseTime |
This field holds the value to be used in the Pause |
0x0 |
||
|
|
Time field in the transmit of a control frame. |
|
|
|
|
|
|
|
ETH_ZeroQuantaPause |
Enables the automatic generation of Zero- |
ETH_ZeroQuantaPause_Dis |
||
Quanta Pause control frames. |
able |
|||
|
|
|||
|
|
|
|
|
|
|
Configures the threshold of the Pause to be |
ETH_PauseLowThreshold_M |
|
ETH_PauseLowThreshold |
checked for automatic retransmission of Pause |
|||
inus4 |
||||
|
|
frame. |
||
|
|
|
||
|
|
|
|
|
ETH_UnicastPauseFrameDe |
Enables the MAC detection of the Pause frames |
ETH_UnicastPauseFrameDe |
||
(with MAC Address0 unicast address and unique |
||||
tect |
|
multicast address). |
tect_Disable |
|
|
|
|
||
|
|
|
|
|
|
|
Enables the MAC to decode the received Pause |
ETH_ReceiveFlowControl_ |
|
ETH_ReceiveFlowControl |
frame and disables its transmitter for a specified |
|||
|
|
time (Pause Time). |
Disable |
|
|
|
|
||
|
|
|
|
|
ETH_TransmitFlowControl |
Enables the MAC to transmit Pause frames (Full- |
ETH_TransmitFlowControl |
||
Duplex mode) or the MAC back-pressure |
_Disable |
|||
|
|
operation (Half-Duplex mode). |
||
|
|
|
||
|
|
|
|
|
|
|
Selects the 12-bit VLAN identifier or the |
ETH_VLANTagComparison_1 |
|
ETH_VLANTagComparison |
complete 16-bit VLAN tag for comparison and |
|||
6Bit |
||||
|
|
filtering. |
||
|
|
|
||
|
|
|
||
ETH_VLANTagIdentifier |
Holds the VLAN tag identifier for receive frames. |
0x0 |
||
|
|
|
|
|
Note: |
The Default Value is the value configured by calling the ETH_StructInit function. |
Doc ID 022105 Rev 1 |
15/47 |