Jump to content

    

lomy

Участник
  • Content Count

    16
  • Joined

  • Last visited

Community Reputation

0 Обычный

About lomy

  • Rank
    Участник
  • Birthday 01/06/1981

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array
  1. Хорошо, попробую. Спасибо!
  2. Да 57 нога так и настроена. А на счет задержки, хотелось бы как то по другому сделать, т.к. у меня используется прерывание от компаратора в котором запускается АЦП и таймеры. Получается так, что компаратор запустился и сразу же вызывается прерывание.
  3. Здравствуйте! Вопрос по использованию аналогового компаратора. Микроконтроллер STM32L476, периферия COMP2. В компараторе задействован Input+ соответственно на него подается аналоговый сигнал, Input- на нем установлено ¾ Internal VRef и включен External Output, в моем случае это 57 нога контроллера на нее выводится сигнал полученный с компаратора. Инициализация MX_COMP2_Init(); проходит нормально. Столкнулся с тем, что при старте компаратора HAL_COMP_Start(&hcomp2); он кратковременно срабатывает на время 40 мкс., выдает высокий потенциал. Это происходит только один раз при старте, дальше он работает абсолютно корректно, но если его остановить HAL_COMP_Stop(&hcomp2); и запустить заново, то при старте он опять сработает. Время всегда одинаковое 40 мкс. При работе использую библиотеку HAL, с помощью отладчика нашел место, где переключается порт: /* Enable the selected comparator */ SET_BIT(hcomp->Instance->CSR, COMP_CSR_EN); Это установка бита EN, им можно управлять напрямую без HAL результат тот же, при установке EN компаратор разово срабатывает. Может, кто подскажет, как запустить компаратор, что бы не было этого импульса, иначе в программу приходится вставлять кучу костылей, которые проверяют, что появившийся импульс пришел не от запуска компаратора. Заранее спасибо.
  4. STM32 HAL UART+DMA

    Спасибо, Omen и uriy. Попробую разобраться с прерыванием по idle.
  5. STM32 HAL UART+DMA

    Здравствуйте, уважаемые коллеги. Прошу помочь разобраться с использованием связки UART+DMA на прием, в частности интересует работа функции HAL_UART_Receive_DMA(…). Сразу оговорюсь, что я перечитал много постов по этой теме на большинстве известных форумов и многое оттуда почерпнул. Теперь к сути: в большом проекте есть кусок, который отвечает за связь между двумя контроллерами, один из которых раз в несколько миллисекунд отправляет короткое сообщение (не более 20 байт) другому контроллеру сообщение все время одинакового размера. UART включен на прием, DMA работает в нормальном режиме (не в циклическом). В main вызываю HAL_UART_Receive_DMA(&huart5,(uint8_t*) mc_mes, 4); //4 байта взято просто для эксперимента В бесконечном цикле мониторю hdma_uart5_rx.State if (hdma_uart5_rx.State == HAL_DMA_STATE_READY) { HAL_UART_Receive_DMA(&huart5,(uint8_t*) mc_mes, 4); hdma_uart5_rx.State = HAL_DMA_STATE_BUSY; } Вот собственно и весь упрощенный код. Как я понимаю работу этой функции, поправьте меня, если я не прав: Вызывая функцию HAL_UART_Receive_DMA(…) мы передаем ей ожидаемое кол-во байт для приема. Этот параметр устанавливает внутренний счетчик DMA, (регистр NDT). Для каждого байта, который он получает, счетчик уменьшается на единицу, пока не достигнет нуля. Когда счетчик становится равен нулю происходит передача данных. В этот момент мы попадаем в условие (hdma_usart2_rx.State==HAL_DMA_STATE_READY_MEM0), где мы опять вызываем функцию HAL_UART_Receive_DMA(…). Проблема: если мы намеренно посылаем пакет большего размера чем у нас заявлено, например, вместо четырех байт отправим пять, то массив принятых данных сбивается, «лишние» эл-ты заносятся в массив mc_mes [] на первые места (так как будто DMA работает в циклическом режиме!). А этого быть не должно т.к. у нас режим работы DMA – нормальный. Может кто-то сталкивался с такой проблемой и может объяснить, почему так происходит?
  6. В предыдущем варианте устройства, было сделано на логике, сейчас была поставлена задача, все оптимизировать, если что-то может делать контроллер то логику исключить.
  7. Да нечто подобное подробно описано в Application note, который выложил A.Lex на первой страницы этого обсуждения глава называется: Arbitrary waveform generation using timer DMA-burst feature (стр. 45). Я не смог реализовать такую штуку для двух каналов одного таймера, но это скорее от недостатка опыта, думаю Ваша идея пригодится кому-то более опытному.
  8. Просто с таймерами я уже некоторое время провозился и более менее разобрался как их настраивать. А с dual-SPI мне нужно еще нужно разобраться, но я попробую. Если все получится то отпишусь в этой теме.
  9. Задача решена на связке нескольких таймеров. За основу взяты три таймера TIM3, TIM2 и TIM1. TIM3 отсчитывает длинные периоды по 15 мс по окончании счета тактирует TIM2 и TIM1 по ITR2. TIM2 настроен как Slave, своим первым каналом он управляет портом МК в режиме PWM Generation. Обязательно включить One Pulse Mode. TIM1 тоже настроен как Slave, и своим первым каналом он управляет портом МК в режиме PWM Generation. Обязательно включить One Pulse Mode и задать счет повторений Repetition Counter ( по моему эта функция есть только у Advanced-control timers). Собственно все работает самостоятельно, без каких либо пользовательских прерываний. Поэтому синхронизация импульсов получается идеальная (видно на осциллограмме). Частоту можно задавать изменением тактирования частоты таймеров или изменением длительностей импульсов PWM. Спасибо всем кто откликнулся на обсуждение. Если будут вопросы с удовольствием отвечу.
  10. Спасибо за разъяснение. Я уже начал читать про dual-SPI. Однако если кто-то реализовал нечто подобное на связках таймеров в STM32, поделитесь своим опытом, пожалуйста.
  11. Если синхронности не дает, то не буду тратить на это время. К тому моменту как я обратился на форум, я перерыл много информации в интернете. У меня сложилось такое ощущение, что это задача имеет решение с помощью двух таймеров (один ведомый другой ведущий) и периферии которой они могут управлять напрямую. Наверное я заблуждался.
  12. Спасибо, jcxz и e-serg, я постараюсь разобраться в предложенных вариантах.
  13. Хорошо, буду читать. Но разве там линии не полностью инверсны друг другу? Мне нужно что бы когда нет импульсов обе линии были в нуле.
  14. Да, к сожалению, свободных программистов для этого проекта нет, поэтому приходится делать самому. Если есть возможность дайте ссылки на инфу как можно использовать dual-SPI для решения задачи.
  15. Спасибо за ответ. Я активно использовал этот Application note, и научился его помощью генерировать пачки импульсов. Но я не смог решить своей задачи. Если у Вас будет время взгляните, пожалуйста, на диаграмму стр. 68. Там видно, что в инверсном канале остается «лишний импульс». Возможно ли сделать то, что там называется “Commutation update to inactive mode” на один импульс раньше?