پروژه های Stm32

آموزش کامل راه‌اندازی وب سرور صنعتی با STM32 و W5500

 چرا استفاده از W5500 و پورت اترنت در پروژه‌های صنعتی ضروری است؟

در محیط‌های صنعتی، ارتباطات بی‌سیم (مانند Wi-Fi) با چالش‌های مرگباری مثل نویز الکترومغناطیسی (EMI)، تداخل فرکانسی، موانع فیزیکی و افت شدید پایداری مواجه هستند. تراشه W5500 ساخت WIZnet استاندارد طلایی پیاده‌سازی پورت اترنت صنعتی روی انواع میکروکنترلرها (از جمله ESP32، STM32 و TMS320) به شمار می‌رود. دلایل ضرورت این تراشه عبارتند از:

استک سخت‌افزاری TCP/IP (Hardwired TCP/IP Stack)

برخلاف لایه‌های نرم‌افزاری پیچیده مانند LwIP که منابع رم (RAM) و پردازنده (CPU) میکروکنترلر را به شدت درگیر می‌کنند و با یک Memory Leak ساده کل سیستم Crash می‌کند، در W5500 تمام لایه‌های:

  • TCP, UDP, IPv4, ICMP, ARP, IGMP و MAC

به صورت کاملاً سخت‌افزاری درون خود چیپ پردازش می‌شوند. این یعنی کد میکروکنترلر شما هرگز درگیر هندل کردن خطاهای سطح پایین شبکه نمی‌شود.

مصونیت فوق‌العاده در برابر نویز صنعتی (High EMI Immunity).

ارتباط سیمی از طریق کابل شبکه شیلددار (STP/FTP) به همراه ترانسفورمر ایزولاسیون موجود در سوکت‌های شبکه (MagJack)، پالس‌های ولتاژ ناخواسته، اسپایک‌ها و نویزهای ناشی از استارت موتورها و رله‌های قدرت را فیلتر می‌کند؛ جایی که امواج ۲.۴ گیگاهرتز وای‌فای کاملاً کور می‌شوند.

 مدیریت مستقل بافر و ۸ سوکت سخت‌افزاری همزمان

تراشه W5500 دارای ۳۲ کیلوبایت بافر حافظه داخلی است که به شما امکان می‌دهد تا ۸ سوکت مستقل را به صورت همزمان هندل کنید. این ویژگی برای کاربردهای چندمنظوره صنعتی ایده‌آل است:

  • اجرای همزمان سرور Modbus TCP (پورت ۵۰۲)
  • ارسال تله‌متری روی پروتکل MQTT
  • ارائه پنل وب تنظیمات داخلی (HTTP Web Server)
  • سرویس دریافت زمان دقیق (SNTP Client)

 راه‌اندازی سریع و ارتباط انعطاف‌پذیر با SPI پرسرعت

پروتکل ارتباطی W5500 از نوع High-Speed SPI (تا ۸۰ مگاهرتز) است. این یعنی برای اتصال آن به میکروکنترلرهایی مثل ESP32 یا STM32، نیازی به اشغال پین‌های پرشمار رابط RMII ندارید و تنها با ۴ تا ۵ پین GPIO، یک پورت شبکه صنعتی پایدار خواهید داشت.

امنیت فیزیکی و ایزولاسیون شبکه (OT Security)

در شبکه‌های صنعتی، مدیران شبکه (IT/OT) اجازه اتصال تجهیزات بدون سیم با پروتکل‌های باز را در خطوط حساس نمی‌دهند. پورت اترنت به سیستم شما هویت فیزیکی (MAC Address معتبر)، امنیت سطح دسترسی و قابلیت تفکیک در شبکه‌های VLAN را می‌دهد.

البته با اینکه استفاده از تراشه هایی مانند W5500  و سایر اترنت کنترلرهای سخت افزاری مزایا و راحتی خودشون رو دارند به هیچ عنوان نمیتوانند جای استفاده از ترکیب MAC+PYH+TCP/IP Stack رو نمیگیرند و اگر پردازنده مورد استفاده دارای واحد ETH داخلی است روش مناسبتر منطعفتر و با عمکرد بهتر استفاده از واحد اترنت داخلی به همراه لایه PHY خارجی و استفاده از استکهای نرم افزاری مانند LWIP و در صورت امکان RTOS هستش که البته این ترکیب نیازمند تجربه و فهم برنامه نویسی بالایی میباشد.

شماتیک و اتصالات پین‌های STM32F103 به ماژول W5500

 

برای اتصال ماژول W5500 به Stm32F1 از یکی از پورتهای SPI میکرو استفاده میکنیم .

پینهای لازم MISO,MOSI,SCLK,CS و دو پین برای ریست و اینتراپت نیاز داریم. در صورتی که به جای ماژول تمایل دارید چیپ W5500رو بر روی برد خود قرار دهید میتوانید از شکل زیر به عنوان رفرنس استفاده نمایید.

شماتیک اتصال w5500 به stm32
شماتیک اتصال w5500 به stm32

کانفیگ SPI2 و رجیسترهای شبکه در توابع HAL:

در این مثال من از واحد دوم SPI در میکرو خودم که یک stm32f103c8t6 هستش استفاده کردم. تنظیمات لازم کاملا جنرال و بدون نکته خاصی میباشد.فقط در نظر داشته باشید که ارتباط را ابتدا با کلاک SPI پایین تست کنید و بعد از جواب گرفتن واطمینان از صحت ارتباط و عملکرد صحیح کد مقدار کلاک SPI را افزایش دهید.



static void MX_SPI2_Init(void)
{
hspi2.Instance = SPI2;
hspi2.Init.Mode = SPI_MODE_MASTER;
hspi2.Init.Direction = SPI_DIRECTION_2LINES;
hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
hspi2.Init.CLKPolarity = SPI_POLARITY_HIGH;
hspi2.Init.CLKPhase = SPI_PHASE_2EDGE;
hspi2.Init.NSS = SPI_NSS_SOFT;
hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi2.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi2) != HAL_OK)
{
Error_Handler();
}

}


تنظیمات شبکه

در این قسمت با استفاده از یک متغیر از نوعwiz_NetInfo  که یک استراکچر طراحی شده برای نگهداری پارامترهای شبکه میباشد تنظیمات مورد نظر را اعمال میکنیم.


wiz_NetInfo gWIZNETINFO = {
.mac = {0x00, 0x08, 0xDC, 0x11, 0x22, 0x33},
.ip = {192, 168, 1, 150},
.sn = {255, 255, 255, 0},
.gw = {192, 168, 1, 1},
.dns = {8, 8, 8, 8},
.dhcp = NETINFO_STATIC
};

در این استراکچر پارامترهایی مانند IP,SN,GW,DNS را نگه داری میکنیم. در این مثال برخلاف مثال قبلی از ایپی استاتیک استفاده میکنیم به همین منظور مقدار dhcp را برابر با NETINFO_STATIC قرار دادیم.

بعد تنظیم کردن پارامترهای شبکه بافرهای RX-TX چیپ W5500 را باید مقدار دهی کنیم. این چیپ در مجموع ۱۶ کیلوبایت حافظه برای اخصاص به ۸ سوکت در اختیار ما میگذارد که من این ۱۶ کیلوبایت رو به صورت مساوی بین سوکتها با اسفاده از کد زیر اختصاص میدهم.


uint8_t memsize[2][8] = {{2,2,2,2,2,2,2,2}, {2,2,2,2,2,2,2,2}};
ctlwizchip(CW_INIT_WIZCHIP, (void*)memsize);
ctlnetwork(CN_SET_NETINFO, (void*)&gWIZNETINFO);

تابع HTTP_Response:

بعد از کانفیگ اولیه SPI و چیپ W5500 احتیاج به تابعی داریم که دیتای دریافتی از شبکه  را از W5500 بخوانیم یا بتوانیم دیتای ارسالی خودمان در بافر ارسال چیپ برای ارسال قرار دهیم.


void Generate_HTTP_Response(char* req, char* resp, uint16_t* len)

در این تابع ابتدا متن ریکوئست HTTP کاربر یا همان دیتایی که بعد از کلیک روی دکمه در صفحه html وب سرورمون به سمت میکرو فرستاده میشود  پارس می‌شود. اگر عبارت GET /led/toggle یا GET /relay/toggle در هدر وجود داشته باشد، متغیر وضعیت معکوس شده و خروجی GPIO با دستور HAL_GPIO_WritePin تغییر وضعیت می‌دهد.


if (strstr(req, "GET /led/toggle") != NULL) {
led_state = !led_state;
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, led_state ? GPIO_PIN_RESET : GPIO_PIN_SET);
} else if (strstr(req, "GET /relay/toggle") != NULL) {
relay_state = !relay_state;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, relay_state ? GPIO_PIN_SET : GPIO_PIN_RESET);
}

بعد از خواند هدر و اعمال تغییرات بایستی به سمت کاربر پاسخ استاندارد پروتکل HTTP/1.1 ساخته و ارسال شود. شامل کد وضعیت 200 (موفق)، نوع محتوا (HTML)، طول بدنه بر حسب بایت (Content-Length) و اعلان قطع ارتباط پس از ارسال (Connection: close).

اینکار به صورت زیر و به سادگی انجام میشود.


*len = snprintf(resp, BUFFER_SIZE,
"HTTP/1.1 200 OK\r\n"
"Content-Type: text/html\r\n"
"Content-Length: %d\r\n"
"Connection: close\r\n\r\n%s",
(int)strlen(body), body);

ماشین حالت سوکت TCP (WebServer_Process:

در قدم آخر ما نیاز به یک State Machin داریم تا وضعیت سوکتها را بررسی کنند و بر اساس وضعیت سوکت تصمیم بگیرد که چه اقدامی انجام گیرد.

ما ابتدا بایستی با استفاده از تابع


uint8_t status = getSn_SR(HTTP_SOCKET);

وضعیت سوکت را دریافت کرده و براساس آن تصمیم گیری میکنیم.


switch (status) {
case SOCK_CLOSED:

socket(HTTP_SOCKET, Sn_MR_TCP, HTTP_PORT, 0);
break;

case SOCK_INIT:

listen(HTTP_SOCKET);
break;

case SOCK_ESTABLISHED:

if (getSn_IR(HTTP_SOCKET) & Sn_IR_CON) {
setSn_IR(HTTP_SOCKET, Sn_IR_CON);
}

uint16_t size = getSn_RX_RSR(HTTP_SOCKET);
if (size > 0) {
if (size > BUFFER_SIZE) size = BUFFER_SIZE;
memset(rx_buffer, 0, BUFFER_SIZE);
recv(HTTP_SOCKET, rx_buffer, size);

uint16_t send_len = 0;
Generate_HTTP_Response((char*)rx_buffer, (char*)tx_buffer, &send_len);

send(HTTP_SOCKET, tx_buffer, send_len);
disconnect(HTTP_SOCKET);
}
break;

case SOCK_CLOSE_WAIT:
disconnect(HTTP_SOCKET);
close(HTTP_SOCKET);
break;

default:
break;
}

 

  • case SOCK_CLOSED: سوکت بسته است. دستور socket(HTTP_SOCKET, Sn_MR_TCP, HTTP_PORT, 0) آن را روی پورت ۸۰ و در مد TCP باز می‌کند.
  • case SOCK_INIT: سوکت باز شده و با تابع listen(HTTP_SOCKET) در وضعیت گوش‌به‌زنگ برای دریافت درخواست اتصال از کلاینت (مرورگر) قرار می‌گیرد.
  • case SOCK_ESTABLISHED: کانکشن ۳ مرحله‌ای TCP برقرار شده است.

با getSn_RX_RSR حجم دیتای دریافتی را می‌خوانیم.
با تابع recv پکت خام HTTP کلاینت را دریافت و داخل بافر ذخیره می‌کنیم.
تابع پاسخ را می‌سازد و با send به کلاینت تحویل می‌دهد.
در نهایت با disconnect سوکت بسته می‌شود.

  • case SOCK_CLOSE_WAIT: کلاینت قصد قطع ارتباط دارد؛ میکرو فرایند بستن سوکت را تکمیل می‌کند تا پورت برای کلاینت بعدی آزاد شود.
w5500r_dspworld.ir
راه اندازی وب سرور با w5500

جمله پایانی :

این مثال یک تمرین ساده برای یادگیری نحوه ارتباط با چیپ W5500 از طریق پروتکل HTTP  و ایجاد و ساخت یک وبسرور ساده برای کنترل GPIO های میکرو میباشد.

برای ساخت یک محصول تجاری نیاز به لحاظ کردن موارد بیشتر و تغییر درساختار کد و کدهای وبسرور میباشد که میتوانید با مقداری تلاش و جستجو محصولات تجاری و کاربردی متنوعی اجرا نمایید.

برای دانلود فایل پروژه وارد حساب کاربری خود شوید.

دیدگاهتان را بنویسید

دکمه بازگشت به بالا