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

Почему LPUART не будит STM32L0 из режима Stop?

Обновлено Редакция GAW

LPUART — UART малого потребления, который продолжает слушать линию, пока STM32L0 спит в режиме Stop. Но в Stop останавливаются шины APB и системная частота, поэтому большинство «не просыпается» сводится к тактированию: приёмник просто нечем тактировать.

Что должно быть настроено до входа в Stop

ГдеЧтоПо RM0377
RCC_CCIPR, LPUART1SEL10 (HSI16) или 11 (LSE)от APB и SYSCLK пробуждения нет
LPUART_CR1, UESM1разрешает пробуждение из Stop
LPUART_CR3, WUS + WUFIE11 — по RXNE, 10 — по старт-битуWUS пишут при UE = 0
LPUART_CR3, UCESM1 при LSE и 9600 бодтакт LPUART не отключается в Stop
LPUART_ISR, REACK1приёмник действительно включён
EXTI_IMR, IM281линия 28 — LPUART1

Вместо WUFIE можно оставить обычное прерывание RXNEIE — RM0377 допускает оба способа. Если для приёма используется DMA, его выключают перед входом в Stop и включают снова после пробуждения.

Какая скорость возможна

От LSE 32,768 кГц LPUART работает не быстрее 9600 бод, от HSI16 — быстрее, но при пробуждении есть предел: HSI16 должен успеть запуститься, пока идёт старт-бит. В примере RM0377 для режима Stop с основным регулятором и времени пробуждения 8,1 мкс получилось около 46 кбод. Делитель для любой скорости проверяет калькулятор скорости UART.

Перед сном LPUART не должен передавать: флаг BUSY, по RM0377, не гарантирует, что приём не начнётся в момент входа. Если микроконтроллер просыпается, но ток во сне высокий, пройдитесь по списку из ответа «Почему STM32L0 потребляет много тока в Stop». Остальные особенности семейства — на странице STM32L0.

Похожие вопросы

Какую скорость выбрать, если нужен LPUART от LSE?

Не больше 9600 бод: это предел для такта 32,768 кГц по RM0377. При 9600 бод в LPUART_BRR записывают 0x369, реальная скорость получается 9608,94 бод, ошибка 0,093 %. Для пробуждения на такой скорости обязательно ставят бит UCESM.

Будет ли потерян первый байт после пробуждения?

При пробуждении по RXNE байт принимается целиком, потому что приёмник тактируется и в Stop. Если выбрано пробуждение по старт-биту (WUS = 10), RM0377 предупреждает: флаг WUF ставится, а RXNE — нет, поэтому байт нужно дочитать после выхода из Stop.

Нужно ли настраивать EXTI для LPUART?

LPUART1 подключён к прямой линии EXTI 28. По RM0377 после сброса EXTI_IMR равен 0x3F84 0000, то есть линия 28 уже не замаскирована. Если код инициализации записал в EXTI_IMR своё значение, верните бит IM28, иначе запрос пробуждения не дойдёт до ядра.

Источники

  1. STMicroelectronics. RM0377 Reference manual: Ultra-low-power STM32L0x1 advanced Arm-based 32-bit MCUs, Rev 10 — разд. 7.3.19: LPUART1SEL[1:0] в RCC_CCIPR — 00 APB, 01 системная частота, 10 HSI16, 11 LSE; разд. 25.1: от LSE 32,768 кГц — до 9600 бод; разд. 25.4.4: fck от 3 до 4096 скоростей, от LSE не больше 9600 бод, от 32 МГц — до 10 Мбод, табл. 127: 9600 бод от LSE — BRR 0x369, ошибка 0,093 %; разд. 25.4.11: UESM ставят до входа в Stop, при LSE и 9600 бод нужен UCESM, пробуждение по RXNE или по флагу WUF, перед Stop проверяют REACK, DMA приёма выключают; пример: максимальная скорость пробуждения от HSI около 46 кбод; табл. 131: пробуждение из Stop только при такте от HSI16 или LSE; разд. 25.7.3: UCESM — бит 23, WUFIE — бит 22, WUS[1:0] — биты 21:20 (00 совпадение адреса, 10 старт-бит, 11 RXNE), WUS пишут при UE = 0; табл. 54: LPUART1 — прямая линия EXTI 28; разд. 12.5.1: EXTI_IMR после сброса 0x3F84 0000
  2. STMicroelectronics. cmsis-device-l0, Include/stm32l053xx.h (commit 7b7ae8c) — USART_CR1_UESM — бит 1; USART_CR3_WUS — биты 21:20, USART_CR3_WUFIE — бит 22, USART_CR3_UCESM — бит 23; RCC_CCIPR_LPUART1SEL — биты 11:10; EXTI_IMR_IM28 — бит 28

Нашли ошибку?