verlaty

Members
  • Публикации

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

  • Посещение

Все публикации пользователя verlaty

  1. Добрый день. Есть проект на STM32F3 (использую библиотеку HAL). Для настройки и управления устройством в нем реализован USB порт CDC (Communication Device Class). Возникла необходимость подключения Дальномера к устройству. Дальномер выдает данные по UART. И в принципе нет проблем считывать данные по этому каналу, но для этого надо выводить дополнительный разъем и это не нравится. Появилось желание использовать USB. Предполагаю использовать в Дальномере UART-USB преобразователь (что то типа FTDI) и подключать его к USB порту STM. Вопрос: Как реализовать опрос датчика подключенного к USB порту контроллера. Если кто то сталкивался с похожим вопросом направьте на путь истинный. Спасибо.
  2. STM32 и подключение датчика USB

    Вот вспомнил еще один момент. Первоначальную прошивку делаю через DFU (загружаю свой bootloader, ну и можно начальную прошивку влить) потом уже через свою программку (своеобразная GUI ) заливаю, обновляю и настраиваю устройство.Так что пока что не готов окончательно отказаться от USB.
  3. STM32 и подключение датчика USB

    Тоже вариант
  4. STM32 и подключение датчика USB

    Что бы объяснить все детали немного расскажу о проекте. Это устройство дистанционного управления объективом видеоаппаратуры (позволяет управлять кольцами объектива в разных режимах). Одно устройство - это пульт управления, второе - приемник к которому подключены привода управления. Все управление происходит по радиоканалу. Один из режимов работы - это управление в автоматическом режиме. К приемнику подключен дальномер, эти данные обрабатываются и выдается сигнал на управление приводами. Другой режим когда это устройство используется локально (есть такое устройство, как стедикам - это носимое устройство на которое крепится камера и стабилизирует положение камеры). В этом случае планируется подключать к приемнику маленький пульт управления (типа джойстика) который будет крепится на стедикаме. Так же есть необходимость подключения кабеля управления затвором фотокамеры (делать снимок). В итоге получилось маленькое устройство (4 х 8 см) полностью облепленное разъемами (подключение питания, 3 разъема моторов, USB разъем, разъем затвора, антенна). Теперь еще надо подключить дальномер и проводной пульт управления. Вот поэтому возникло желание использовать USB разъем для подключения периферийных устройств. В конце концов именно для этого создавался USB интерфейс.
  5. STM32 и подключение датчика USB

    Устройство мобильное. К компьютеру будет подключаться только для настройки, обновления ПО. Есть необходимость подключения к нему различных периферийных устройств, одно из них дальномер. Чтение по UART самое простое, но все таки хочется прощупать возможность подключения через USB (это расширит возможность использования). Как правильно отметил " BARS_ OTG в этом МК нет. Теоретически можно любой пин подключить к пятому пину USB для инициализации подключения. Если вы знакомы с реализацией этого через программу USB-host - ткните носом где это можно почитать.
  6. STM32 и подключение датчика USB

    Использую STM32F303CB
  7. STM32 и ADC DMA

    Добрый день,форумчане. Столкнулся с такой проблемой. Использую в проекте STM32F3. Всю периферию настраивал через Cube (работаю с библиотекой HAL). Теперь суть проблемы: снимаю данные ADC с 5 пинов в режиме DMA (normal) регулярный канал (12бит 0-4095). Заметил, что значения канала влияют на значение следующего канала. Например значение 1 канала - 1000, 2 - 3000. При изменении значения первого канала переменным резистором (второй при этом не изменяю) 1 канал - установил 4000, то и 2 канал тоже меняет значения и становится 3400. ( значения примерные, взял из головы для описания сути проблемы). Не могу понять где корень этого зла и как с ним бороться. Не буду загружать тему кодом, если будет необходимость, буду выкладывать по частям.
  8. STM32 и ADC DMA

    Еще раз спасибо. Проблему решил увеличением SamplingTime при инициализации ADC.
  9. STM32 и ADC DMA

    Спасибо большое за быстрый ответ. Буду читать. Природа проблемы понятна. Если все правильно понял, то в этой статье рекомендует ставить емкость по входу. Есть одно Но... Я измеряю данные с четырех резисторов (на эти пины допустим можно повесить и емкость) и еще измеряю Vrefint. Это необходимо для вычисления vdd (вот сюда емкость ни как не прицепишь). Может быть есть способ программно победить эту беду. Или же подскажите как правильно настроить ADC и DMA, на что обратить внимание?. Измерения происходят каждые 10мс
  10. STM32 и ADC DMA

    Спасибо, почитаю более внимательно и поищу мелкие буковки. Если не тяжело, озвучьте примерное место этих буквочек.
  11. Прошивка Stm32 Через Usb

    Доброго дня всем. Использую в проекте STM32F303CB. Для настройки и прошивки использовал Discovery на STM32F3. Прошивал и через SWD, и через COM порт, и через родной USB. Для готового изделия написал GUI интерфейс на Visual Studio для настройки устройства. Теперь появилось желание через него же обновлять ПО (прошивать STM). Теперь суть вопроса: как реализовать обновление ПО через свою программу? (на подобие DfuSeDemo) Буду признателен за любую информацию, которая направит на путь истинный. Может какие нить исходники. Может ткните носом в даташит. p.s. В программировании не силен, поэтому если можно чуток разжевать информацию.
  12. Прошивка Stm32 Через Usb

    Попробую оживить тему. Использую stm32f3 и HAL. Написал bootloader для прошивки из под PC, все работает. Но есть пару нюансов. При переходе в режим прошивки надо переконнектить устройство к РС потому что пропадает связь с COM портом. (точнее при повторной инициализации COM порта) Не могу понять как деинициализировать USB CDC в HAL. По идее он должен исчезнуть из списка оборудования в диспетчере устройств и заново появиться. Суть вопроса: как деинициализировать USB CDC под HAL, что бы он пропал из списка оборудования? Заметил такую вещь. Использую stm32f3discovery. Настроена как USB CDC. При подключении к PC определяется сом порт и нормально с ним работает, но если нажать кнопку ресет, то com порт в системе есть но работать с ним не получается (выдает ошибки) пока не переконнектить usb кабель.
  13. Stm32: Cubemx+Uart_Dma

    Есть такая задача. Надо организовать двухсторонний обмен данными между двумя устройствами по радиоканалу. Радиомодемы подключаются по UART. Решил использовать UART DMA режим. Настройку и сборку проекта делал через Cube. Проблема заключается в следующем: после некоторого времени работы устройства прекращается прием данных. В тоже время если на одном устройстве оставить только передающую, а на другом приемную часть программы – все прекрасно работает. Прошу помощи в решении этого вопроса (к сожалению большого опыта в программировании этих процессоров не имею). Может подскажите готовое решение для двухстороннего обмена данными по UART. Для примера и обсуждения выкладываю часть программы одного устройства (на втором все организовано аналогично, есть небольшие отличия в обработке принимаемого сигнала). Инициализация UART /* USART1 init function */ void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 19200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; huart1.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED ; huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; HAL_UART_Init(&huart1);} Инициализация DMA void MX_DMA_Init(void) { /* DMA controller clock enable */ __DMA1_CLK_ENABLE(); __DMA2_CLK_ENABLE(); /* DMA interrupt init */ HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 0, 0); // DMA1_Channel4 - передача uart HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn); HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 0, 0); // DMA1_Channel5 – прием UART HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn); HAL_NVIC_SetPriority(DMA2_Channel1_IRQn, 0, 0);// DMA2_Channel1 – ADC HAL_NVIC_EnableIRQ(DMA2_Channel1_IRQn);} В main делаю отправку данных вот так: if(TX_Ready == 1) { TX_Ready = 0; HAL_UART_Transmit_DMA(&huart1, (uint8_t *)uartTX, 9); } Флаг сбрасывается вот здесь TX_Ready: void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UartHandle) { TX_Ready = 1; } Прием данных делаю вот здесь: void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle) { if(huart1.RxXferSize == 1) { if(RXbyte[0] == START_BYTE) HAL_UART_Receive_DMA(&huart1, (uint8_t *)uartRX, 3); else HAL_UART_Receive_DMA(&huart1, (uint8_t *)RXbyte, 1); } else { if (uartRX[2] == 2*START_BYTE) IRdist = (uartRX[1] << 8) | uartRX[0]; HAL_UART_Receive_DMA(&huart1, (uint8_t *)RXbyte, 1); } } Немного опишу теорию приема. Запускаю прием одного байта командой HAL_UART_Receive_DMA(&huart1, (uint8_t *)RXbyte, 1). Если принятый байт равен стартовому байту в отправленной пачке, то принимаю пачку из 3 байт HAL_UART_Receive_DMA(&huart1, (uint8_t *)uartRX, 3). Если не равен, снова принимаю байт (ожидаю нужный мне байт) Если принял пачку и контрольный третий байт равен ожидаемому, то формирую сигнал IRdist и снова принимаю один байт. if(huart1.RxXferSize == 1) этим смотрю что я принимал один байт или пачку. В ответном устройстве аналогично принимается пачка из 9 байт, а отправляется 3 байта.
  14. Stm32: Cubemx+Uart_Dma

    Запустил UART в режим DMA circular. Слегка подправил свой код для работы в этом режиме, без постоянных запусков HAL_UART_Receive_DMA . Все проблемы снялись, все работает. Отдельное спасибо mail_robot за активную помощь и участие.
  15. Stm32: Cubemx+Uart_Dma

    Я так понимаю в последнем примере он в circular работает.
  16. Stm32: Cubemx+Uart_Dma

    тема изначально назвалась Cubemx + uart_dma. Заметил такую вещь. Один уарт у меня принимает пачки по 8 байт второй по 3. Тот который по 8 практически не зависает, а вот по 3 постоянно. Хотя все реализовано аналогично, на одной плате, на оном камне, но факт на лице.
  17. Stm32: Cubemx+Uart_Dma

    Да, надо найти причину, а не отключать проверки.
  18. Stm32: Cubemx+Uart_Dma

    В Кубе можно отключить overrun в конфигурации USART. Раз эта опция есть, значит ее можно тыкать.Вопрос на что это повлияет.
  19. Stm32: Cubemx+Uart_Dma

    Точно. Надо сначала очистить буфер. void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) { E_CODE = HAL_UART_GetError (huart); switch (E_CODE) { case HAL_UART_ERROR_ORE: __HAL_UART_FLUSH_DRREGISTER(huart); __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF); CLEARFL = HAL_UART_GetError (huart); break; } } Не прокатило
  20. Stm32: Cubemx+Uart_Dma

    Пробую сбрасывать флаг void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) { E_CODE = HAL_UART_GetError (huart); switch (E_CODE) { case HAL_UART_ERROR_ORE: __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF); CLEARFL = HAL_UART_GetError (huart); break; } сделал переменную CLEARFL для контроля Ну в общем не сбрасывает. Кто сталкивался с этой бедой?
  21. Stm32: Cubemx+Uart_Dma

    Кажется выловил ошибку. huart1.ErrorCode выдает 8. а это HAL_UART_ERROR_ORE ((uint32_t)0x00000008) /*!< Overrun error ORE — ошибка: переполнение входного буфера — приняты новые данные, а старые ещё не прочитаны во всяком случае есть куда капать. Буду разбираться. Если есть дельные советы - внимательно слушаю
  22. Stm32: Cubemx+Uart_Dma

    Ясно. Но я сейчас думаю как то проследить ошибки, статусы, флаги или еще чего там. Передача у меня идет нормально.
  23. Stm32: Cubemx+Uart_Dma

    Давай сначала. Эхо - это просто пустить UART через USB и смотреть в мониторе порта?
  24. Stm32: Cubemx+Uart_Dma

    Все правильно. Выше уже писал, что хал уже делает все эти проверки. Это уже просто от безысходности всякие варианты ищу. А ты опять дал понять что не зачем туда лезть. Спасибо. Голова уже квадратная стала. Надо думать как выявить причину, как отследить где затык.
  25. Stm32: Cubemx+Uart_Dma

    Хочу перенести обработку принятых байтов в void DMA1_Channel4_IRQHandler(void) { /* USER CODE BEGIN DMA1_Channel4_IRQn 0 */ /* USER CODE END DMA1_Channel4_IRQn 0 */ HAL_DMA_IRQHandler(&hdma_usart1_tx); /* USER CODE BEGIN DMA1_Channel4_IRQn 1 */ /* USER CODE END DMA1_Channel4_IRQn 1 */ } Подскажите как правильно сделать обработку по окончанию приема ( не по половине)