Що я робив
Я використовую мікроконтролер 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, які я не помітив?