Використання утиліти ST-LINK для налаштування RTC на поточний час


9

Що я робив

Я використовую мікроконтролер STM32, і для мого проекту мені потрібно мати можливість надсилати дані в певний час доби (скажімо, об 11 годині вечора та 2 вечора). Мікроконтролеру необхідно знати, який час, перш ніж я зможу досягти цього. На жаль, у мене є лише одностороннє спілкування, і тому я не можу запитувати поточний час у мережі.

Тому я хочу встановити поточний час, безпосередньо після того, як я закінчу програмування. Я знав, що я можу записати дані у флеш за допомогою інтерфейсу командного рядка утиліти ST-LINK (ST-LINK_CLI), використовуючи таку команду:

ST-LINK_CLI.exe -w32 <Address> <data> -Rst

Я написав простий тестовий скрипт, який записує часову марку Unix на якусь адресу, яка наразі не використовується кодом.

Я збирався написати функцію для зчитування позначки часу і використовувати її для встановлення часу RTC. Поки я не прочитав наступне в Посібнику користувача ST-LINK Utility :

-w32 підтримує запис у регістри флеш-пам'яті, OTP, SRAM та R / W.

Коли в посібнику сказано, що він підтримує запис у регістри R / W, чи означає це, що я можу безпосередньо отримати доступ до регістрів RTC та встановити їх? Я намагався, але, здається, не пишу до цих регістрів.

Я вважаю за краще використовувати цей метод, якщо він є, тому що мені більше не потрібно писати певну функцію для обробки на мікроконтролері. Це означає, що я можу встановити час RTC будь-якого мікроконтролера, який ми зараз використовуємо, замість того, щоб потребувати оновлення коду.


Що я мав намір зробити

Щоб встановити регістри RTC, я спробував виконати наступні кроки, як описано в довідковому посібнику STM :

  • встановити біт DPB в регістрі PWR_CR
  • запишіть 0xCA в регістр RTC_WPR
  • запишіть 0x53 в регістр RTC_WPR
  • зупиніть RTC, встановивши біт INIT в регістрі RTC_ISR
  • виберіть тактову частоту 1 Гц, записавшись у регістр RTC_PRER
  • завантажте поточний час, записавшись у регістр RTC_TR
  • завантажити поточну дату, записавшись у регістр RTC_DR
  • запустити RTC, скинувши біт INIT в регістр RTC_ISR

Для доступу до регістрів я використав такі адреси:

  • PWR_CR: 0x4000 7000
  • RTC_WPR: 0x4000 2824
  • RTC_ISR: 0x4000 280C
  • RTC_PRER: 0x4000 2810
  • RTC_TR: 0x4000 2800
  • RTC_DR: 0x4000 2804

Що пішло не так

Я не в змозі написати жоден із цих регістрів. За допомогою утиліти ST-LINK я отримую таке повідомлення:

Під час написання пам'яті сталася помилка!

Використання ST-LINK_CLI:

Запис 0x00000100 на 0x40007000 ... Помилка!

Читання цих регістрів не є проблемою, але я не можу писати до них за допомогою утиліти ST-LINK або її інтерфейсу командного рядка.


Питання

Як я можу записатись в регістри П / Ш за допомогою утиліти ST-LINK?

Чи є якийсь захист від запису, щоб дозволити записувати в регістри RTC, які я не помітив?


Можливо, захищено від запису, якщо не введено код-ключ.
Sparky256

Радий бачити, що ви багато чого зрозуміли самі з початкових підказок. Як правило, ви повинні розміщувати рішення як відповідь, а не як редагування питання, і особливо, коли ви до цього часу переслідували його, було б доречно в остаточному підсумку прийняти своє рішення.
Кріс Страттон

Я насправді не думав про це так! Я відчуваю, що я все одно повинен це робити, хоча я хотів би, щоб і ти мав деякі кредити.
Spectre208

Скільки часу після програмування повинен працювати ваш пристрій і наскільки точно має бути час доби? Я просто переживаю, що незалежно від того, наскільки точний ви RTC, в кінцевому підсумку він трохи піде, принаймні, якщо він використовується роками і ваші вимоги до строгості строгі.
Тимо

Він повинен працювати протягом 10 років на одному акумуляторі. Однак часова схема вже трохи змінена на деяке випадкове число, щоб запобігти всім пристроям надсилати свої дані відразу. Зниження часу RTC не є великою проблемою.
Spectre208

Відповіді:


4

Деякі регістри є законними лише для певної ширини доступу (тобто, -w32 може бути невірним), або не можуть прочитати назад записані значення, які можуть спричинити проблеми з верифікацією.

Можуть також існувати обмеження щодо послідовності або штату щодо доступу до речей.

Варіантом, який повинен вирішити найбільш можливі проблеми, буде скласти крихітну програму для виконання тієї роботи, яка буде пов'язана з запуском оперативної пам'яті. Ви можете замінити дані у його двійкові після з'ясування зміщення, завантажити модифіковану версію та запустити її. Або ви могли б змусити програму отримати значення з області ОЗУ за межами розширень файлу, які ви встановили перед запуском. Завдяки більш тонкому контролю над строкою ви також можете передавати значення в регістри процесора, хоча для цього вам може знадобитися (?) Альтернативна програма командного рядка з відкритим вихідним кодом, а не ST (ця невелика процедура у способі оперативної пам'яті - це, до речі, як ця програма виконує запис спалахнути)


3

Отже, як зазначив Кріс Страттон, одна з проблем була:

Деякі регістри .. можуть не читати назад записані значення, які можуть спричинити проблеми з верифікацією.

Це означало, що перевірка не вдалася, внаслідок чого відображалася помилка, навіть незважаючи на те, що операція запису фактично вдалася.

Нижче наведено відповідь, яку я отримую, читаючи регістр PWR_ISR, встановлюючи біт INIT, а потім знову читаю регістр:

0x4000280C: 00000027

Запис 0x00000080 на 0x4000280C ... Помилка!

0x4000280C: 000000A7

Перевірка утиліти ST-LINK перевіряє, чи відповідає значення, записане на адресу та прочитане з адреси адреси. У цьому випадку операція запису пройшла успішно, навіть якщо два значення не збігаються, оскільки тепер встановлено біт INIT.

Інша проблема полягала в тому, що я не міг помітити ефект операції запису. Підключившись до мікроконтролера, ST-LINK (він відомий як "підключення під час скидання") зберігає у стані скидання. Мені потрібно було скористатись опцією підключення HOTPLUG, яка підключається до мікроконтролера без зупинки чи скидання.

Опція «підключення під час скидання» дозволяє підключитися до цілі перед виконанням будь-якої інструкції. Це корисно у багатьох випадках, наприклад, коли ціль містить код, який вимикає шпильки JTAG / SWD.

Опція "HotPlug" дозволяє підключитися до цілі без зупинки та скидання. Це корисно для оновлення RAM-адрес або IP-регістрів під час роботи програми

Пакетний файл повністю працює так, як я цього хотів! Тепер команда виглядає приблизно так:

ST-LINK_CLI.exe -c HOTPLUG -w32 <Address> <data> -w32 <Address> <data> ...

1

Я думаю, що відбувається, що після запису виконується перевірка зчитування. Якщо той самий реєстр повертає поточний час у зчитуванні, хоча вам вдалося оновити RTC, відладчик не реалізує. Це рідше пояснює проблему з регістром живлення (якщо тільки налагоджувач не має доступу до цього регістра під кришкою). Перевірте значення читання вручну. Якщо виникла більш значна проблема, це читання може також не вдатися. Також спробуйте інші регістри у вашому списку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.