Сергей Борщ 143 17 июня, 2021 Опубликовано 17 июня, 2021 · Жалоба Досталась чужая программа в доработку (слегка перелопаченный пример 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 17 июня, 2021 Опубликовано 17 июня, 2021 · Жалоба Не надо в STOP пока не всё передали. На крайняк вместо STOP я делал в ULP на 100кГц. С отключением ненужного барахла. В STOP надо смотреть что их нужного ещё остаётся живым. В Lorawan от Semtech есть баг (никак не поправят) при переходе в RX RX2 они рано разрешают STOP. Поэтому стек раком становится случайным образом. Через несколько впаданий в STOP. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 18 июня, 2021 Опубликовано 18 июня, 2021 · Жалоба 6 часов назад, x893 сказал: Не надо в STOP пока не всё передали. Появилась идея разрешить TXE с пустым обработчиком. По моему замыслу он будет будить контроллер из STOP, ПДП тоже проснется, быстро закинет очередные данные и флаг сразу же сбросится. По выходу из обработчика снова спать. Приоритет у прерывания ПДП выше, чем у прерывания УАПП, должно все получиться в том числе и на последнем передаваемом байте. Вечером попробую. 6 часов назад, x893 сказал: На крайняк вместо STOP я делал в ULP на 100кГц. С отключением ненужного барахла. Слишком муторно. Да и пока все это сделаешь энергии, наверное, потратишь больше, чем сэкономишь за счет STOP. 6 часов назад, x893 сказал: В Lorawan от Semtech есть баг (никак не поправят) при переходе в RX RX2 они рано разрешают STOP. Поэтому стек раком становится случайным образом Пока не напарывались. Можно кусочек кода посмотреть? Я внутрь стека пока не лазил - пошагал немного отладчиком, волосы зашевелились от изобилия вложенных функций. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 18 июня, 2021 Опубликовано 18 июня, 2021 · Жалоба 8 часов назад, Сергей Борщ сказал: Какой конфуз и недоработка конструкторов ST... Ну почему же... В RM они четко пишут, что на время действия STOP выключается домен синхронизации Vcore. В скобках указывают, что домен Vcore - это вся память (Flash + SRAM) и цифровая периферия, включая CPU. Теперь становится понятным, почему не работает: с DMA снимаются клоки. Кстати, это еще можно проследить по дереву синхронизации P.S. А еще рекомендую взглянуть на таблицу 5 в даташите (стр. 18) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 18 июня, 2021 Опубликовано 18 июня, 2021 · Жалоба 6 минут назад, Arlleex сказал: Ну почему же... Конфуз мой, понятное дело. А недоработка - потому что УАПП и I2C они же сумели заставить работать в STOP, могли бы и ПДП заодно уж... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pyroman 2 19 июня, 2021 Опубликовано 19 июня, 2021 (изменено) · Жалоба On 6/18/2021 at 9:01 AM, Сергей Борщ said: А недоработка - потому что УАПП и I2C они же сумели заставить работать в STOP, могли бы и ПДП заодно уж... Может быть потому что DMA часть ядра, в отличии от периферии UART, I2C Изменено 19 июня, 2021 пользователем pyroman Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 19 июня, 2021 Опубликовано 19 июня, 2021 · Жалоба 4 минуты назад, pyroman сказал: Может быть потому что DMA часть ядра С чего бы это? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 19 июня, 2021 Опубликовано 19 июня, 2021 · Жалоба 3 часа назад, pyroman сказал: Может быть потому что DMA часть ядра Нет, оно обычный периферийный модуль на шине AHB. Скорее потому, что для пересыки пришлось бы будить шины и память, а это неоправданно сложно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 21 июня, 2021 Опубликовано 21 июня, 2021 · Жалоба 18.06.2021 в 08:46, Сергей Борщ сказал: Появилась идея разрешить TXE с пустым обработчиком. По моему замыслу он будет будить контроллер из STOP, ПДП тоже проснется, быстро закинет очередные данные и флаг сразу же сбросится. По выходу из обработчика снова спать. Приоритет у прерывания ПДП выше, чем у прерывания УАПП, должно все получиться в том числе и на последнем передаваемом байте. Вечером попробую. Как-то не взлетело. Пока ядро не спит - TXE не сбрасывается при записи в TDR через ПДП. А когда спит - сбрасывается. И чтобы не зациклиться в обработчике прерывания приходится прерывание TXE разрешать перед входом в спячку и запрещать при попадании в этот обработчик. Да к тому же кубик после каждого просыпания раскочегаривает PLL, а это занимает времени больше, чем передача двух с половиной байтов, и все это время ядро молотит вместо спячки. Резюме - реализовать уход на время передачи в SLEEP вместо STOP гораздо проще и суммарное потребление получается меньше. Можно еще поиграться с SLEEPONEXIT, но это потребует переделки остальных обработчиков прерываний. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться