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

Salk

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

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

  • Посещение

Репутация

0 Обычный

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

  1. Что-то не то. Init_I2c_MCP3421(&hi2c3, cfg_MCP3421_18bit_PGA8); void Init_I2c_MCP3421(I2C_HandleTypeDef *hi2c, uint8_t cfg) { while(HAL_I2C_IsDeviceReady(hi2c, addr_MCP3421_Write, 1, HAL_MAX_DELAY) != HAL_OK); HAL_I2C_Master_Transmit_IT(hi2c, addr_MCP3421_Write, cfg, 1); } // Получаю предупреждение "passing argument 3 of 'HAL_I2C_Master_Transmit_IT' makes pointer from integer without a cast " И не работает. Какой тогда выход? Я действительно в ступоре, куда хоть копать скажите, что искать. Только не кидайтесь всей книгой по СИ целиком :)
  2. Понял, принял, спасибо. Пойду дальше нубить. Не ракеты на Марс все же отправляю.
  3. Наверняка эта "проблема" уже избитая и банальна, но я столкнулся с ней в первые и хочется понять её природу. Суть такая, имеется код для работы с внешним АЦП MCP3421 по I2c. Вот тут я его инициализирую его (посылаю cfg байт): uint8_t cfg_MCP3421_18bit_PGA8 = 0x1F; // Ждем готовности на шине I2c while(HAL_I2C_IsDeviceReady(&hi2c3, 0xD0, 1, HAL_MAX_DELAY) != HAL_OK); // Шлем конфигурационный байт HAL_I2C_Master_Transmit_IT(&hi2c3, 0xD0, &cfg_MCP3421_18bit_PGA8, 1); И дальше принимаем 4 байта данных (4й - подтверждение введенного конфига). В такой редакции все работает. Но если я хочу эти две строчки обернуть в функцию и вызвать её, передав тот же конфигурационный байт, то ничего не выходит. При приеме какой-то левый мусор, явно конфигурационный байт посылается неверный. uint8_t cfg_MCP3421_18bit_PGA8 = 0x1F; // Функция инициализации АЦП Init_I2c_MCP3421(&hi2c3, cfg_MCP3421_18bit_PGA8); // Сама функция void Init_I2c_MCP3421(I2C_HandleTypeDef *hi2c, uint8_t cfg) { // ждем готовности на шине I2c while(HAL_I2C_IsDeviceReady(hi2c, 0xD0, 1, HAL_MAX_DELAY) != HAL_OK); // Шлем конфигурационный байт HAL_I2C_Master_Transmit_IT(hi2c, 0xD0, (uint8_t*)&cfg, 1); } // Структура фунц. приема: "HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)" В чем разница этих двух подходов понять не могу. Передаю в функцию обычный байт, он там принимается, cfg становится равный cfg_MCP3421_18bit_PGA8 = 0x1F - это видно при отладке, но по I2c улетает фиг знает что. Еще работает, если в функции, перед отправкой по I2c, байт cfg предварительно перезаписать в любую глобальную переменную, и её уже в свою очередь отправлять. Если объявить буферную переменную, как локальную внутри функции, то работать уже не будет. uint8_t CFG = 0; void Init_I2c_MCP3421(I2C_HandleTypeDef *hi2c, uint8_t cfg) { CFG = cfg; // I2c_Transmited_Block(&hi2c3, addr_MCP3421_Write, cfg_MCP3421_18bit_PGA1); // I2c_Transmited_Mem(&hi2c3, addr_MCP3421_Write, cfg_MCP3421_18bit_PGA1); while(HAL_I2C_IsDeviceReady(hi2c, addr_MCP3421_Write, 1, HAL_MAX_DELAY) != HAL_OK); HAL_I2C_Master_Transmit_IT(hi2c, addr_MCP3421_Write, (uint8_t*)&CFG, 1); } Думал, может компилятор голову морочит, но на разных режимах оптимизации и полностью без неё (NONE) результат один. Пишу на HAL в Cube IDE. Вред ли это проблема с HAL, скорее что-то чисто СИ-шное :)
  4. STM32CubeIDE

    Здравствуйте, не подскажите, как поменять (в CubeIDE) выбранный ранее процессор в уже существующем проекте, к примеру на такой же, но с чуть более вместительной FLASH. Как это правильно сделать, без полного форматирования проекта. В Keil помню было, что-то подобное.
  5. За этот код огромное спасибо, пойду разбираться в нем.
  6. А что конкретно в том коде "жесть"? Мне для общего понимания и развития - не правильно воспользовался функцией strstr или поиск строк через цикл выглядит крипово? :) Да, простите, имел ввиду числа с плавающей точкой. Через sscanf так и не смог их вывести, память сжирает с аппетитом конечно, а результата нет. Пробовал через точку и запятую числа вводить, через пробел - никак. Среда STM32CubeIde. Нашел и воспользовался функцией strtod, предварительно очистив массив от команд, код получился таким: // парсинг чисел в массиве char *tstr; // Указатель, используемый для определения завершения преобразования строки double d = 0; // итог парсинга числа uint8_t Array_of_Numbers[len]; /* где-то тут // Отделяем команды из массива принятых данных, зная заранее их длину (оставляю все, что после) */ // Указатель, на непреобразованный остаток строки Array_of_Numbers char *nstr = (char *)Array_of_Numbers; while(1) { tstr = nstr; // Преобразуем очередной участок строки d = strtod (nstr, &nstr); if (d == 0 && tstr == nstr) break; else f_chislo_V = d; HAL_IWDG_Init(&hiwdg); // добавить таймаут } // выводим полученные данные в порт sprintf((char *)UserTxBufferFS, "%.3f\n", f_chislo_V); CDC_Transmit_FS((uint8_t*)UserTxBufferFS, strlen((const char*)UserTxBufferFS)); HAL_Delay(1); Ввод: "Read13.3" (Read - команда распознана, ранее в коде удаляется из массива, оставляя только числовую часть) Вывод: (парсим число) "13.300" Ввод: "13.3" Вывод: "13.300" Ввод: "ffgg13.3" Вывод: "Unknow command" (число не парсится, т.к. присутствуют недопустимые для чисел символы; "ffgg" не удаляется, т.к. это не является распознанной командой) Ввод: "Read 13Read" Вывод: "13.000" (последний Read так же не учитыввается) Не сильная "жесть"? Функционально код меня полностью устраивает. strpbrk - тоже вещь, поможет в отделении чисел из общего массива. Вы имели ввиду: regex.h, regex_fns.h из glibc. В чем им главное преимущество? Спасибо за ответы.
  7. В лучших традициях ответов в данной теме: strtod (куда проще и парсит числа на раз два)
  8. Тут лимит в одно слово на ответ что-ли? Я вроде в разделе "для новичков" и гуру из себя не строю. Можно как-то поразвернутее, что-ли... Что "МОЗГ"? Функция такая есть, в <brain.h>? Скиньте, скачаю...
  9. Круто, спасибо, вещь реально прикольная, а не подскажите еще как с помощью нее знаковые числа выводить? :) Если я правильно понял, то работать надо с ней так: int i; char str[80]; // преобразование sscanf((char *)UserTxBufferFS, "%s %d", str, &i); sprintf((char *)UserTxBufferFS, "%s %d\n\r", str, i); // вывод в порт CDC_Transmit_FS((uint8_t*)UserTxBufferFS, strlen((const char*)UserTxBufferFS)); Вывод: "hp 22"; 22 - в данном случае беззнаковое число, что очень круто и минималистично! :) При попытке подставить определить "%f": float i; char str[80]; sscanf((char *)UserTxBufferFS, "%s %f", str, &i); sprintf((char *)UserTxBufferFS, "%s %.3f\n\r", str, i); CDC_Transmit_FS((uint8_t*)UserTxBufferFS, strlen((const char*)UserTxBufferFS)); Выдает "0.000". Включение параметра "-u_scanf_float", ситуацию не исправляет, только память сжирает.
  10. STM32 и либа string.h (strstr)

    Прошу помощи, целый день сижу и не могу разрешить одну проблемку. А именно в парсинге строки. Хочу принятую строку данных (по USB VirtaulComPort) разбить на две, если в ней есть числовая часть (пример: "Read13" (команда+число), надо число выделить и переложить в другой массив (так потом легче с отдельным "числовым" массивом работать - преобразовывать уже в цифровые константы. Недавно узнал и начал активно использовать библиотеку string.h. Очень сильно помогает в работе со строками при терминальном общении с МК. Но тут зашел в тупик Код: // Тут описано тело функции, в которую мы попадаем при вводе данных с терминала // Массив строк, состоящих из одних цифр от 0 до 9 char *Numbers[] = {"1","2","3","4","5","6","7","8","9","0"}; // вычисляем длину принятого массива данных по USB (VCP) int16_t len = strlen((const char*)UserRxBufferFS); uint8_t pointer = 0; // индекс массива, первого обнаружения числа // Если что-то пришло в порт if(len > 0) { // копирование данных из буфера RX в буфер TX до конца всей строки (len), с символом конца строки (нул) snprintf((char *)UserTxBufferFS, len+1, "%s", (const char*)UserRxBufferFS); // очистим массив memset(Array_of_Numbers, 0, sizeof(Array_of_Numbers)); // Найдем число из массива данных // Перебираем наш массив данных в поисках совпадений с числами из массива Numbers for (int i = 0; i < sizeof(Numbers)/sizeof(Numbers[0]); i++) { // если нашли совпадение с одним из чисел (0-9) if (strstr((char*)UserTxBufferFS, Numbers[i]) != NULL) { // находим номер индекса с которого начинаются числа в общем массиве данных pointer = strstr((char*)UserTxBufferFS, Numbers[i])-(char*)UserTxBufferFS; // копируем из общего массива в новый, числа начиная с индекса, в котором была обнаружена первая из 10 цифр for (int j = 0; j < len-1; j++) { Array_of_Numbers[j] = UserTxBufferFS[pointer+j]; } break; // выходим из цикла поиска чисел, если нашли первое совпадение } } // выводим ново-созданный массив в порт HAL_Delay(1); strcat((char *)Array_of_Numbers, (char*)" - new mass\n\r"); CDC_Transmit_FS((uint8_t*)Array_of_Numbers, strlen((const char*)Array_of_Numbers)); sprintf((char *)Array_of_Numbers, "Point: %d\n\r", pointer); HAL_Delay(1); CDC_Transmit_FS((uint8_t*)Array_of_Numbers, strlen((const char*)Array_of_Numbers)); } Получается очень странное. Код работает, если вводить числа от 0 до 9, высчитывает индекс и перезаписывает в новый массив, вроде все хорошо. НО если вводить двузначные числа, в которых второе число меньше первого, то в новый массив записывается только это последнее число, игнорируя "первое вхождение". На примере из терминала сверху вниз: ввожу "10" - ОК; "100" - ОК; "11" - ОК; "12" - ОК; "13" - ОК; "ddff11" - ОК (первое вхождение 4); "ddff44" - OK; а вот уже:"ddff43" - считает первое вхождение только с числа "3" и обрезает "4". Тоже самое с числами "21, 31, 32, 43, 42, 41, 54, 53, 52, 51 и т.д.). Конечно код такой себе, но тут уже дело принципа, что и почему не так????? Думал, может цикл два раза выполняется, но нет он выполняется как надо, оператор break вовремя его прерывает. Почему происходит такая лабуда при вводе последовательно чисел. Буду рад помощи :)) Может надо какую то другую функцию из string.h использовать, но на ум приходит только strchr, но не уверен, что он чем то кардинальным отличается от strstr. (на Unknow command не обращайте внимания, издержки тестого кода :))
  11. Т.е. чтобы перенести проект с одного компьютера на другой, я должен иметь: .sch файл схемы .pro сам проект .cache-lib кеш используемых компонентов саму папку с нестандартными библиотеками и в настройке путей, указывать путь к ним "KICAD_USER_TEMPLATE_DIR" файл списка цепей (netlist) .net Все так?
  12. Добрый день, можете в теме последнее сообщение от меня Salk: удалить изображение или даже весь текст сообщения.

     

     

  13. Добрый день, подскажите, пожалуйста. Начинаю только втягиваться в kicad (установлена версия 5.1.5 Win10). Хотелось бы понять цепочку моих действий при переноси проекта с одного компа на другой. Установлена одна и таже версия программы, "библиотеки по ГОСТ" одни и те же (добавленные через менеджер библиотек). Но каталоги библиотек и самой программы отличаются. Так вот, если например открыть дома, проект, ранее сохраненный на другом компе, поначалу все отображается как надо, но стоит нажать "сохранить", как вылезает огромная свора ошибок, мол эти элементы не найдены ни в кеше, ни в библиотеках, после чего вся схема становится в квадратиках со знаками вопроса. А ссылки на библиотеке у всех элементов становятся "Name project-rescue:R_0,25W-Device_GOST". Модератор: картинка удалена по просьбе автора. И что мне теперь делать? Каждый раз выставлять ссылки на библиотеку элементов вручную? Сейчас я запорол вот такую схему (довольно большую) и теперь она в таком виде открывается на обоих компах. И что мне с ней делать? :) Вручную прописывать путь к каждой библиотеке? Или надо с одного компа только файл .sch копировать на другой комп, если хочу продолжить работу в другом месте? Не пойму как правильно-то :)
  14. STM32CubeIDE

    Добрый день, подскажите, пожалуйста, как правильно "перетащить" проект, ранее написанный, с использованием - "keil MDK v5 + Cube MX" в CubeIDE. 1. Нажимаю кнопочку "Open project from File System" в меню "File", далее выбираю папку проекта целиком 2. Удаляю папку MDK-ARM, т.к. она не нужна (файлы для keil) 3. CubeIDE прекрасно распознает файл с расширением .ioc, после генерации проекта создает свои новые файлы, при этом не затрагивая пользовательские файлы main.c и другие Но при попытке компиляции этого проекта, не может найти файл main.h Весь лог ошибок: ../Src/main.c:42:10: fatal error: main.h: No such file or directory #include "main.h" ^~~~~~~~ compilation terminated. make: *** [Src/subdir.mk:21: Src/main.o] Error 1 make: *** Waiting for unfinished jobs.... ../Src/stm32f1xx_hal_msp.c:43:10: fatal error: main.h: No such file or directory #include "main.h" ^~~~~~~~ compilation terminated. make: *** [Src/subdir.mk:23: Src/stm32f1xx_hal_msp.o] Error 1 ../Src/stm32f1xx_it.c:37:10: fatal error: main.h: No such file or directory #include "main.h" ^~~~~~~~ compilation terminated. make: *** [Src/subdir.mk:25: Src/stm32f1xx_it.o] Error 1 ../Src/system_stm32f1xx.c:77:10: fatal error: stm32f1xx.h: No such file or directory #include "stm32f1xx.h" ^~~~~~~~~~~~~ compilation terminated. make: *** [Src/subdir.mk:27: Src/system_stm32f1xx.o] Error 1 ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c:52:10: fatal error: stm32f1xx_hal.h: No such file or directory #include "stm32f1xx_hal.h" ^~~~~~~~~~~~~~~~~ compilation terminated. make: *** [Drivers/STM32F1xx_HAL_Driver/Src/subdir.mk:198: Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.o] Error 1 ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c:276:10: fatal error: stm32f1xx_hal.h: No such file or directory #include "stm32f1xx_hal.h" ^~~~~~~~~~~~~~~~~ compilation terminated. make: *** [Drivers/STM32F1xx_HAL_Driver/Src/subdir.mk:200: Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.o] Error 1 "make -j16 all" terminated with exit code 2. Build might be incomplete. 02:48:13 Build Failed. 13 errors, 0 warnings. (took 11s.700ms) Предполагаю, конечно что сбились пути, но не могу понять и отыскать, как в CubeIDE их переписать. Подскажите, пожалуйста. Спасибо.
×
×
  • Создать...