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

STM32L072, передача УАПП от ПДП в STOP mode у кого-нибудь работало?

Досталась чужая программа в доработку (слегка перелопаченный пример LoraWan устройства от ST для муратовского модуля на STM32L072+SX1276).

Вкратце: он почти все время спит в STOP mode, изредка его будит набортный будильник (RTC), он чего-то там в себе делает в вызове из главного цикла и снова засыпает.

Добавил я в него, кроме всего прочего, самописный вывод через УАПП (UART). Тактирование УАПП от HSI16, данные грузятся через ПДП (DMA). Моя часть программы просыпается каждые 2 секунды, прямо в прерывании будильника кое-чего делает, добавляет в буфер вывода строку, если ПДП свободен - натравливает его на буфер и засыпает. Все прекрасно работает под отладчиком (пока стоят DBG_SLEEP, DBG_STOP, DBG_STANDBY) и если вместо STOP использовать SLEEP. При переходе же в STOP передача замирает и возобновляется только после выхода из STOP. Пока контроллер не спит - несколько символов успевают передаться, потом контроллер уходит в STOP и вывод снова замирает. Причем это не отключение тактирования УАПП - все символы всегда передаются целиком. И предыдущая версия проги с выводом через прерывание TXE работает без замираний. Такое ощущение, что при уходе в STOP отключается ПДП.

Что сделано: 
1) В USART2_SEL (RCC->CCIPR) записано 10 -тактирование УАПП от HSI16
2) В HSI16KERON (RCC->CR) записана 1 (вроде не должен отключать HSI16 в STOP, хотя в моем случае ни на что не влияет, возможно он критичен для приема).
3) В DMA_SMEN (RCC->AHBSMENR) и USART2_SMEN (RCC->APB2SMENR) записаны 1 - в режиме STOP SLEEP должно оставаться тактирование УАПП и ПДП.
4) В UESM, UE (USARTx->CR) и UCESM (USARTx->CR) записаны 1, то есть опять же тактирование УАПП в STOP mode должно продолжаться.
Все эти биты проверены отладчиком - в них именно то, что я записал. Буфер вывода не переполняется - к моменту замирания он заполнен процентов на 5.
Что там делает Куб с питанием - честно говоря еще не разбирался, но вряд ли что-то криминальное, ведь передача на прерываниях в предыдущей версии программы работает.

Код объемный (кубо-код от ST плюс мои C++ с шаблонами), поэтому показывать его не буду, разве что какие-то кусочки, если понадобится. Документацию прочитал почти всю, включая errata.

Если кто-то запускал такую связку (HSI16+USARTx/передача+DMA+STOP mode на STM32L0x) и оно у вас работало - отпишитесь, буду копать свой код дальше. Или может кто-то подскажет что я делаю не так или не делаю.

Добавлено: вот стоило изложить все на форуме и ответ нашелся - DMA_SMEN разрешает тактирование в SLEEP mode, в STOP mode никто ничего не обещал. Какой корфуз и недоработка конструкторов ST... Придется на время передачи уходить в SLEEP mode.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не надо в STOP пока не всё передали. На крайняк вместо STOP я делал в ULP на 100кГц. С отключением ненужного барахла. В STOP надо смотреть что их нужного ещё остаётся живым. В Lorawan от Semtech есть баг (никак не поправят) при переходе в RX RX2 они рано разрешают STOP. Поэтому стек раком становится случайным образом.  Через несколько впаданий в STOP. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 часов назад, x893 сказал:

Не надо в STOP пока не всё передали.

Появилась идея разрешить TXE с пустым обработчиком. По моему замыслу он будет будить контроллер из STOP, ПДП тоже проснется, быстро закинет очередные данные и флаг сразу же сбросится. По выходу из обработчика снова спать. Приоритет у прерывания ПДП выше, чем у прерывания УАПП, должно все получиться в том числе и на последнем передаваемом байте. Вечером попробую.

6 часов назад, x893 сказал:

На крайняк вместо STOP я делал в ULP на 100кГц. С отключением ненужного барахла.

Слишком муторно. Да и пока все это сделаешь энергии, наверное, потратишь больше, чем сэкономишь за счет STOP.

6 часов назад, x893 сказал:

В Lorawan от Semtech есть баг (никак не поправят) при переходе в RX RX2 они рано разрешают STOP. Поэтому стек раком становится случайным образом

Пока не напарывались. Можно кусочек кода посмотреть? Я внутрь стека пока не лазил - пошагал немного отладчиком, волосы зашевелились от изобилия вложенных функций.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 часов назад, Сергей Борщ сказал:

Какой конфуз и недоработка конструкторов ST...

Ну почему же... В RM они четко пишут, что на время действия STOP выключается домен синхронизации Vcore. В скобках указывают, что домен Vcore - это вся память (Flash + SRAM) и цифровая периферия, включая CPU. Теперь становится понятным, почему не работает: с DMA снимаются клоки.

Кстати, это еще можно проследить по дереву синхронизации
image.png.81d36f2370dc2f1611232d059ada0f5d.png


P.S. А еще рекомендую взглянуть на таблицу 5 в даташите (стр. 18):this:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, Arlleex сказал:

Ну почему же...

Конфуз мой, понятное дело. А недоработка - потому что УАПП и I2C они же сумели заставить работать в STOP, могли бы и ПДП заодно уж...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 6/18/2021 at 9:01 AM, Сергей Борщ said:

А недоработка - потому что УАПП и I2C они же сумели заставить работать в STOP, могли бы и ПДП заодно уж...

Может быть потому что DMA часть ядра, в отличии от периферии UART, I2C

Изменено пользователем pyroman

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, pyroman сказал:

Может быть потому что DMA часть ядра

С чего бы это?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, pyroman сказал:

Может быть потому что DMA часть ядра

Нет, оно обычный периферийный модуль на шине AHB. Скорее потому, что для пересыки пришлось бы будить шины и память, а это неоправданно сложно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18.06.2021 в 08:46, Сергей Борщ сказал:

Появилась идея разрешить TXE с пустым обработчиком. По моему замыслу он будет будить контроллер из STOP, ПДП тоже проснется, быстро закинет очередные данные и флаг сразу же сбросится. По выходу из обработчика снова спать. Приоритет у прерывания ПДП выше, чем у прерывания УАПП, должно все получиться в том числе и на последнем передаваемом байте. Вечером попробую.

Как-то не взлетело. Пока ядро не спит - TXE не сбрасывается при записи в TDR через ПДП. А когда спит - сбрасывается. И чтобы не зациклиться в обработчике прерывания приходится прерывание TXE разрешать перед входом в спячку и запрещать при попадании в этот обработчик. Да к тому же кубик после каждого просыпания раскочегаривает PLL, а это занимает времени больше, чем передача двух с половиной байтов, и все это время ядро молотит вместо спячки. Резюме - реализовать уход на время передачи в SLEEP вместо STOP гораздо проще и суммарное потребление получается меньше. Можно еще поиграться с SLEEPONEXIT, но это потребует переделки остальных обработчиков прерываний.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...