[ENC28J60] Bài 20: Giới thiệu thư viện mạng lwip

stm32-lwip-enc28j60
stm32-lwip-enc28j60

Trong suốt tutorial về enc28j60 – ethernet, mình đã hướng dẫn các bạn tìm hiểu về cơ chế hoạt động của hệ thống mạng và giao thức cơ bản. Tuy nhiên trong ứng dụng sản xuất thực tế, để đảm bảo tính ổn định và tin cậy của hệ thống, chúng ta không nên sử dụng các thư viện mạng tự viết mà sẽ dùng bộ thư viện tiêu chuẩn đã được công nhận và sử dụng rộng rãi.

LWIP là thư viện mạng được sử dụng vô cùng phổ biến. Nó được thiết kế để sử dụng trong các hệ thống nhúng với chỉ khoảng 40Kb Flash và 20KB RAM

LWIP hỗ trợ hầu hết các giao thức cơ bản, quá đủ để chúng ta phát triển ứng dụng của mình

DOWNLOAD

Các bạn tải thư viện lwip tại đây Phiên bản mình đang sử dụng trong bài viết này là 2.1.2

Sau khi tải về, các bạn giải nén và để trong thư mục project

Sử dụng thư viện

Bây giờ, các bạn hãy xóa toàn bộ các thư viện mạng mà chúng ta đã tự viết trong các bài trước đi nhé ( Mất công viết giờ bỏ – hahaha) LWIP chỉ là thư viện mạng, do đó tầng vật lí ( tức là thư viện enc28j60 thì chúng ta vẫn phải để lại)

Nhiệm vụ của chúng ta là liên kết thư viện vật lí (ENC28J60 với thư viện mạng LWIP) và cấu hình các thông số cơ bản để lwip hoạt động theo mong muốn của chúng ta

LWIP yêu cầu người dùng cung cấp tối thiểu các thiết lập sau:

  • File cc.h chứa các thông tin định nghĩa về trình biên dịch
  • File cpu.h chứa thông tin về CPU ( LITTLE_ENDIAN hay BIG_ENDIAN )
  • File lwipopts.h chứa các define chỉ dẫn cho lwip ( ví dụ các giao thức ta muốn dùng, bộ nhớ ta muốn cấp phát )
  • FIle network interface cung cấp các hàm để truy cập vào bộ đệm của tầng vật lí ( thức là bộ đệm mạng của ENC28J60) mình sẽ gọi file này là ethernetif.h
  • Các hàm cung cấp thời gian hệ thống, hàm random ( Mình sẽ viết chúng trong file lwip_user các chức năng khởi tạo lwip mình cũng sẽ viết vào file này luôn

Mình đã viết xong tất cả các file này, các bạn có thể tải về tại đây Sau khi tải về các bạn để vào cùng cấp với thư mục Inc Src của project nhé.

Cùng đừng quên add path vào project ( Nếu dùng keilc ấn f12 -> C/C++ -> Include Path)

Trong cây thư mục project bên trái, các bạn xóa hết các thư viện mạng (tcp udp net arp ….) trong group ENC28J60 vì chúng ta không cần dùng tới chúng nữa ( nhớ để lại thư viện ENC28J60)

Tạo thêm 1 group tên là lwip/user và add các file mà mình đã viết dùng để liên kết thư viện ENC28J60 và thư viện LWIP vào

Bây giờ chúng ta sẽ add thư viện lwip vào project

Add tất cả path của thư viện lwip vào project ( Nếu dùng keilc ấn f12 -> C/C++ -> Include Path) ( Nói chung thằng lwip có bao nhiêu folder các bạn cứ add hết vào)

Tạo thêm 4 group gồm và add các source của thư viện lwip vào group

  • lwip/api
  • lwip/core
  • lwip/netif
  • lwip/core/ipv4

Vậy là xong, thiết lập project với lwip đã hoàn tất

Sử dụng thư viện

Trong phần include ở file main, xóa các file thư viện đã include trong project trước ( vì chúng ta k dùng chúng nữa) các bạn add thư viện lwip_user.h vào là được

Hàm main

Biên dịch và nạp, bật debug lên và điền vào ô wath1 biến lwip_netif các bạn có thể thấy lwip đã chạy DHCP và lấy được IP trong mạng cục bộ

Ở đây IP của mình là 0801A8C0 tức 192.168.1.8

Chúng ta cũng có thể ping thử bằng cmd

Tuyệt vời, thư viện hoạt động hoàn hảo, ở đây mình đang cấu hình thư viện hoạt động ở chế độ DHCP, nếu các bạn muốn sử dụng chết độ static IP hãy định nghĩa LWIP_DHCP là 0 trong file lwipopts.h và điền ip tĩnh trong file lwip_user.c

Như vậy trong bài này, mình đã hướng dẫn các bạn cách cấu hình thư viện lwip vào dự án. Trong phần tiếp theo chúng ta sẽ tìm hiểu sau hơn về cách làm việc với các giao thức ở tầng mạng tcp, http, mqtt ..

Các bạn có thể tải toàn bộ source code cho bài này ở đây

 

Từ tác giả:

Nếu có bất kì thắc mắc nào trong bài viết, vui lòng để lại comment dưới mỗi bài ! Mình sẽ không trả lời thắc mắc của các bạn ở facebook hay email !

Nếu trong phần code bạn nhìn thấy nhưng thứ kiểu như &amp; thì đó là lỗi hiển thị, cụ thể 3 kí tự < > & bị biến đổi thành như thế
&amp; là &
&lt;  là <
&gt; là >

Giới thiệu Đào Nguyện 80 bài viết
DIY,chế cháo, viết blog chia sẽ kiến thức về lập trình,điện tử - IoT. Rất mong được giao lưu, kết bạn với các bạn cùng đam mê. Địa chỉ Facebook: https://www.facebook.com/nguyendao207

2 bình luận

  1. *** Using Compiler ‘V6.19’, folder: ‘C:\Keil_v5\ARM\ARMCLANG\Bin’
    Build target ‘code’
    linking…
    code\code.axf: Error: L6218E: Undefined symbol sio_open (referred from slipif.o).
    code\code.axf: Error: L6218E: Undefined symbol sio_send (referred from slipif.o).
    code\code.axf: Error: L6218E: Undefined symbol sio_tryread (referred from slipif.o).
    Not enough information to list image symbols.
    Not enough information to list load addresses in the image map.
    Finished: 2 information, 0 warning and 3 error messages.
    “code\code.axf” – 3 Error(s), 0 Warning(s).
    Target not created.
    Build Time Elapsed: 00:00:01

    Batch-Build summary: 0 succeeded, 1 failed, 0 skipped – Time Elapsed: 00:00:01

    cho em xin gợi ý sữa lỗi được không ạ

Đã đóng bình luận.