STM32L0 Маломощный UART-приемник считывает неправильные данные на высокой скорости передачи после пробуждения MCU

Я использую микроконтроллер STM32L0 для своего проекта. MCU имеет таймер с низким энергопотреблением (LPTIM) для вывода MCU из режима останова и маломощный UART (LPUART) как для вывода MCU из режима останова, так и для приема/передачи данных.

Моя проблема: - Когда я позволяю MCU оставаться в рабочем режиме, LPUART работает нормально на скорости более 256000 бод. - Когда я устанавливаю MCU в режим остановки, затем, когда MCU получает что-то от LPUART-Rx, он просыпается и продолжайте читать полученные данные последовательности. Для этой настройки, когда скорость передачи данных UART ниже 56000, он работает нормально. Однако, когда скорость выше этой (например, 115200), LPUART считывает неправильные данные. Я знаю, что в этой настройке первый переданный байт будет потерян, но остальные должны быть прочитаны правильно.

Я пробовал с несколькими разными передаваемыми данными разной длины, однако полученные данные всегда были неверными. (работает нормально, когда скорость составляет 56000).

Нет ли ограничений на скорость передачи данных маломощного UART? Не могли бы вы дать ссылку на справочник?
Привет, да, в маломощном UART есть ограничение, но только при использовании LSI/LSE. В моем случае, когда LPUART что-то получает, DSP просыпается и использует часы HSI. А также в режиме Run у LPUART нет проблем с высокой скоростью передачи данных (по крайней мере, до 256000, как я тестировал). Вот справочное руководство: st.com/content/ccc/resource/technical/document/reference_manual/…
Какова ваша конфигурация часов относительно LPUART?

Ответы (1)

Пробуждение из режима остановки с помощью LPUART

LPUART может вывести MCU из режима остановки, когда установлен бит UESM и часы LPUART установлены на HSI или LSE (см. раздел «Сброс и управление часами» (RCC).

  • Исходные часы LPUART - HSI.
    Если в режиме остановки часы HSI выключены, когда обнаруживается спадающий фронт на линии приема LPUART, интерфейс LPUART запрашивает включение часов HSI. Затем часы HSI используются для приема кадров.

    • Если событие пробуждения подтверждено, MCU выходит из режима пониженного энергопотребления, и прием данных продолжается нормально.
    • Если событие пробуждения не подтверждено, часы HSI снова выключаются, MCU не просыпается и остается в режиме пониженного энергопотребления, а запрос часов снимается.

Когда LPUART начинает получать данные, часы не будут активны немедленно. HSI16 (высокоскоростной внутренний RC-генератор 16 МГц) обычно занимает 3,7 мкс для запуска.*

Вы можете сократить время запуска HSI16, оставив его включенным в режиме остановки, если вам это действительно нужно. Как только HSI16 становится доступным, должен активироваться сам LPUART, что также занимает до 12 мкс*:

* В справочном руководстве не указано время запуска, поскольку оно зависит от каждой отдельной части. Вы можете найти фактические значения в таблице данных, здесь значение для STM32L051x6/8 и указано здесь только в иллюстративных целях.

При скорости 56 кбод период передачи одного бита составляет 17,86 мкс, что едва ли достаточно (все еще, вероятно, не соответствует спецификации), чтобы LPUART проснулся до того, как поступит следующий бит, и все выйдет из синхронизации. Вот почему вы не можете увеличить скорость передачи данных.

См. «Определение максимальной скорости передачи данных LPUART, позволяющей правильно выйти из режима остановки, когда источником синхронизации LPUART являются часы HSI» (стр. 734, справочное руководство ) .

Я думаю, что вы должны скопировать пример расчета в идеальном случае из руководства.
@BenceKaulics OP не раскрыл, какой именно чип используется, поэтому я не могу выполнить фактический расчет. Я сослался на соответствующую часть справочного руководства, если этого недостаточно, не стесняйтесь улучшить мой ответ.
Просто как пример.