Почему LPUART не будит STM32L0 из режима Stop?
Обновлено Редакция GAW
LPUART — UART малого потребления, который продолжает слушать линию, пока STM32L0 спит в режиме Stop. Но в Stop останавливаются шины APB и системная частота, поэтому большинство «не просыпается» сводится к тактированию: приёмник просто нечем тактировать.
Что должно быть настроено до входа в Stop
| Где | Что | По RM0377 |
|---|---|---|
| RCC_CCIPR, LPUART1SEL | 10 (HSI16) или 11 (LSE) | от APB и SYSCLK пробуждения нет |
| LPUART_CR1, UESM | 1 | разрешает пробуждение из Stop |
| LPUART_CR3, WUS + WUFIE | 11 — по RXNE, 10 — по старт-биту | WUS пишут при UE = 0 |
| LPUART_CR3, UCESM | 1 при LSE и 9600 бод | такт LPUART не отключается в Stop |
| LPUART_ISR, REACK | 1 | приёмник действительно включён |
| EXTI_IMR, IM28 | 1 | линия 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, иначе запрос пробуждения не дойдёт до ядра.
Источники
- 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
- 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
Нашли ошибку?
Смотрите также
- LPUART (UART малого потребления)UART STM32, принимающий данные в режиме Stop от такта LSE 32,768 кГц
- STM32L0Cortex-M0+, до 32 МГц, малое потребление: L010, L0x1, L0x2 с USB, L0x3 с ЖКИ — линейки и распиновки
- Почему STM32L0 потребляет много тока в режиме Stop?DBG_STOP, ULP = 0, LPSDSR = 0, цифровые входы и висящие флаги EXTI
- Скорость UARTUBRR, BRR, TH1 и ошибка скорости
- Режим StopРежим низкого потребления STM32: такты остановлены, ОЗУ и регистры сохранены