Перейти к содержанию
    

IvanPletnev

Участник
  • Постов

    68
  • Зарегистрирован

  • Посещение

Весь контент IvanPletnev


  1. Приветствую, уважаемые коллеги! Напишу здесь, может кому пригодится, как сделать так, чтобы контрольная сумма, вычисляемая блоком CRC STM32, совпадала с обычной CRC32 (в онлайн калькуляторах, библиотеках и т.п.). В микроконтроллерах серии F4 блок CRC никак не настраивается, то есть нельзя настроить реверс бит на входе и на выходе блока CRC. Поэтому, для реверса бит, мы применяем инструкцию ARM rbit. Насколько мне известно, она присутствует в ARM, начиная с Cortex M3. Функция реверса выглядит так: uint32_t reverse_32(uint32_t value) { uint32_t result; __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); return(result); } Далее надо реверсировать вход и выход модуля CRC: for (index = 0U; index < BufferLength; index++) { hcrc->Instance->DR = reverse_32(pBuffer[index]); } temp = reverse_32(hcrc->Instance->DR); И инвертировать выход. return ~temp; Всё, теперь контрольная сумма соответствует CRC32. Правда, должен заметить, что если мы используем CRC для расчета контрольной суммы массива байт, то размер массива должен быть кратен четырём. Для расчета остатка меньше четырех байт нужно провести еще кое-какие операции.
  2. Итак, коллеги, снова здравствуйте! Эти микроконтроллеры еще продаются. По 1500 за штуку. Если всё сразу, то по 1000.
  3. Вам тогда в Питере выгоднее купить будет
  4. Ну сколько Вы хотите купить?
  5. В Питер, если я правильно понял? Если возьмете все, отправлю бесплатно.
  6. Уважаемые коллеги! Ошибочно заказал в КОМПЭЛ микроконтроллеры PIC18F44K22-I/P в корпусе DIP, хотя надо было PIC18F44K22-I/PT в TQFP-44. Обратно не берут. Отдам за 200 руб/шт.
  7. Уважаемые коллеги! Ошибочно заказал в КОМПЭЛ микроконтроллеры PIC18F44K22-I/P в корпусе DIP, хотя надо было PIC18F44K22-I/PT в TQFP-44. Обратно не берут. Отдам за 200 руб/шт.
  8. PIC18F44K22 150шт.

    Уважаемые коллеги, добрый день! Ошибочно заказал в КОМПЭЛ 150шт PIC18F44K22 -I/P в корпусе DIP. Хотя нужно было в TQFP-44. Обратно не принимают. Отдам за 200 рублей/шт. UPD. Ой, простите, не заметил раздел форума с продажей компонентов, написал здесь
  9. В моём случае точно не из-за питания, на одной и той же плате всё. Сейчас тестирую, всё работает отлично.
  10. А и правда компилируется этот код. Но избавиться от подсветки "неактивного" кода мне так и не удалось. #include "lwip/opt.h" #if LWIP_NETIF_STATUS_CALLBACK void netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback){ ..... #error bla-bla } #endif Даёт ошибку. Значит, всё работает. Но эта подсветка сильно сбивает с толку.
  11. Здравствуйте, коллеги!! Может, конечно, глупый вопрос задам, не пинайте сильно. В который раз уже замечаю, что CubeIDE иногда отказывается реагировать на define. Вот пример: В файле lwipopts.h #define LWIP_NETIF_STATUS_CALLBACK 1 в файле netif.c #include "lwip/opt.h" #if LWIP_NETIF_STATUS_CALLBACK void netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback){ ..... } Соответственно, в файле lwip/opt.h подключен файл lwipopts.h. Всё, как обычно. Но! Код, который внутри #if #endif неактивен(подсвечен) и не компилируется. При наведении курсора на LWIP_NETIF_STATUS_CALLBACK в подсказке показывается 0. При этом в файле opt.h конструкция #if !defined LWIP_NETIF_STATUS_CALLBACK || defined __DOXYGEN__ #define LWIP_NETIF_STATUS_CALLBACK 0 #endif работает. И если нажать в файле netif.c на LWIP_NETIF_STATUS_CALLBACK с зажатым ctrl, то редактор перекидывает на этот дефайн в файле lwipopts.h, где стоит единица. Такое регулярно случается, потом проходит само собой. Почему это происходит и как бороться с этим, кто нибудь может объяснить?
  12. В общем, экспериментальным путём я выяснил, что эта проблема появляется, когда код генерируется CubeMX v. 6.2.1 и STM32Cube F4 v. 1.26.1. Когда код сгенерирован CubeMX v. 6.1.1 или 6.1.2 и STM32Cube F4 v. 1.25.2 всё работает отлично. Заметил, что в версии 1.26.1 обновлена FreeRTOS до 10.3.1. Пока не разбирался, в чём там отличия.
  13. Больше нет никакой разницы. Просто мне понадобился web интерфейс на устройство, которое уже почти готово. Для того, чтобы потренироваться с http сервером я не стал встраивать его сразу в устройство, а решил сначала сделать для него отдельный проект. Взял CubeIDE, настроил LWIP, сгенерировал, запустил. И потом несколько дней провозился собственно с сабжем. Пока не создал проект в CubeMX с точно такими же настройками. Всё совершенно одинаково, но проект из CubeMX работает хорошо, а из CubeIDE нет. Теперь вот надо прикручивать SGI и SSI. Если кто-то поделится опытом в этом смысле, буду благодарен.
  14. STM32CubeMX встроен в STM32CubeIDE, то есть в Eclipse, по сути. Но, видимо, кривовато
  15. В общем, коллеги, я совершенно не понимаю, почему, но когда я сгенерировал проект не в STM32CubeIDE, а в STM32CubeMX, проблема пропала сама собой. Теперь мой сервер работает отлично.
  16. Сегодня проверил то же самое с F746-DISCO. Собрал пример от ST, закинул свою страницу, запустил. Всё работает отлично, несмотря на то, что стек жалуется на нехватку памяти. Но с нехваткой памяти я знаю, как справиться. А когда генерирую новый проект из CubeIDE, http сервер работает медленно и генерирует ретрансмиты. Код сервера беру из этого же примера. Три дня уже потратил в поисках проблемы. Куда смотреть, подскажите пожалуйста.
  17. void http_server_serve(struct netconn *conn) { struct netbuf *inbuf; err_t recv_err; char* buf; u16_t buflen; struct fs_file file; /* Read the data from the port, blocking if nothing yet there. We assume the request (the part we care about) is in one netbuf */ recv_err = netconn_recv(conn, &inbuf); if (recv_err == ERR_OK) { if (netconn_err(conn) == ERR_OK) { netbuf_data(inbuf, (void**)&buf, &buflen); /* Is this an HTTP GET command? (only check the first 5 chars, since there are other formats for GET, and we're keeping it very simple )*/ if ((buflen >=5) && (strncmp(buf, "GET /", 5) == 0)) { if ((strncmp((char const *)buf,"GET / ",6)==0)||(strncmp((char const *)buf,"GET /index.html",15)==0)) { fs_open(&file, "/index.html"); netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY); fs_close(&file); } else if (strncmp((char const *)buf,"GET /port1.html",15)==0) { fs_open(&file, "/port1.html"); netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY); fs_close(&file); } else if (strncmp((char const *)buf,"GET /IMG/logo.png",17)==0) { fs_open(&file, "/IMG/logo.png"); netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY); fs_close(&file); } else if (strncmp((char const *)buf,"GET /NotoSerif.woff",19)==0) { fs_open(&file, "/NotoSerif.woff"); netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY); fs_close(&file); } else if (strncmp((char const *)buf,"GET /style.css",14)==0) { fs_open(&file, "/style.css"); netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY); fs_close(&file); } else if (strncmp((char const *)buf,"GET /IMG/img1.jpg",17)==0) { fs_open(&file, "/IMG/img1.jpg"); netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY); fs_close(&file); } else if (strncmp((char const *)buf,"GET /IMG/img2.jpg",17)==0) { fs_open(&file, "/IMG/img2.jpg"); netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY); fs_close(&file); } else if (strncmp((char const *)buf,"GET /IMG/img3.jpg",17)==0) { fs_open(&file, "/IMG/img3.jpg"); netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY); fs_close(&file); } else if (strncmp((char const *)buf,"GET /IMG/arrow.png",18)==0) { fs_open(&file, "/IMG/arrow.png"); netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY); fs_close(&file); } else { fs_open(&file, "/404.html"); netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY); fs_close(&file); } printf("Heap minimum size %u\r\n",xPortGetMinimumEverFreeHeapSize()); } } } /* Close the connection (server closes in HTTP) */ netconn_close(conn); /* Delete the buffer (netconn_recv gives us ownership, so we have to make sure to deallocate the buffer) */ netbuf_delete(inbuf); } На самом деле, сейчас функция передачи это функция из примера ST. Только с моими файлами и путями. Только в примере она работает, как нужно, а у меня пока нет. Сейчас смотрю в сторону приоритетов прерываний, сравниваю пример с моими.
  18. Да, и еще. Вставляю свою страницу в пример от ST, меняю пути к файлам, всё работает отлично. Хотя в lwipopts у меня гораздо больше ресурсов, чем в примере от ST.
  19. Уважаемые коллеги, здравствуйте! Делаю http сервер на sockets API, всё в целом работает, но во-первых, иногда (не всегда) страница 60кб довольно долго грузится (3-4c), а во-вторых, wireshark показывает ретрансмиты (см. картинку). Статистика LWIP показывает, что всего хватает. И памяти, и буферов. Ошибки в статистике все по нолям. И в общем, эти ретрансмиты не мешают, но всё равно хочется избавиться от них. Пробовал делать параллельный сервер (отдельная задача на каждый сокет), но во-первых это не помогло уйти от ретрансмитов, а во-вторых появилась проблема некорректного закрытия сокетов, которые со временем накапливались и вешали приложение напрочь. В общем, подскажите, пожалуйста, может у кого-то есть решение вышеперечисленных проблем?
  20. Да, именно так. Поэтому спасибо за наводку)
  21. Да, коллеги, это делается элементарно, оказывается. int optValue = 1; setsockopt(newconn, IPPROTO_TCP, TCP_NODELAY, (void*)&optValue, sizeof(optValue)); Работает идеально, я получил, что хотел.
  22. UDP тоже надо сделать. Позже займусь) А как определить текущий PCB для tcp_nagle_disable?
  23. Уважаемые коллеги, здравствуйте! Делаю устройство на STM32F427 с использованием LWIP Sockets. Отправляю в сокет пакеты длиной 9 байт с частотой 120Гц. На приёмной стороне среднее количество полученных девятибайтовых пакетов за секунду 120. То есть все пакеты доходят до адресата отлично. Но! Wireshark мне показывает вот такую картину. Он говорит, что за секунду отправляется 5 TCP пакетов с payload 216 байт. То есть 24 девятибайтовых посылки в одном пакете. Мне нужно передавать быстроменяющийся сигнал, и за 200мс он безнадежно устареет. Вопрос такой. Как сделать, чтобы LWIP старался отправить TCP пакет сразу, а не накапливал данные в буфере? Я понимаю, что такой подход неэффективен, но нужно именно так. Заранее благодарю за ответы.
  24. Уважаемые коллеги, не нашел на форуме ветки про ESP32, поэтому напишу здесь. Тем, кто изучает этот МК полезно будет это знать. Начал знакомиться с этим МК, запустил пример TCP сервера из комплекта SDK, всё работает замечательно. Решил пропинговать пакетами по 64 байта, заметил, что время пинга значительное - от 80 до 200мс. Начал изучать документацию, оказалось, что начиная с версии 3.1, по умолчанию стоит режим пониженного потребления (WIFI_PS_MIN_MODEM). Это значит, что в промежутке между маяками точки доступа WiFi спит. Чтобы включить нормальный режим, нужно вызвать функцию esp_wifi_set_ps(WIFI_PS_NONE); Время пинга теперь составляет от 2 до 5 мс. Пользуйтесь.
×
×
  • Создать...