Что я делал
Я использую микроконтроллер STM32, и для своего проекта мне нужно иметь возможность отправлять данные в определенное время дня (скажем, в 11:00 и 14:00). Микроконтроллер должен знать, сколько времени, прежде чем я смогу достичь этого. К сожалению, у меня есть только односторонняя связь, и поэтому я не могу запросить текущее время из сети.
Поэтому я хочу установить текущее время сразу после завершения программирования. Я знал, что могу записывать данные во флэш-память с помощью интерфейса командной строки утилиты ST-LINK (ST-LINK_CLI), используя следующую команду:
ST-LINK_CLI.exe -w32 <Address> <data> -Rst
Я написал простой тестовый скрипт, который записывает метку времени Unix на некоторый адрес, который в данный момент не используется кодом.
Я собирался написать функцию для чтения метки времени и использовать ее для установки времени RTC. Пока я не прочитал следующее в Руководстве пользователя утилиты ST-LINK :
-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 или ее интерфейс командной строки.
Вопрос
Как я могу записать в регистры R / W, используя утилиту ST-LINK?
Существует ли какая-либо защита от записи, позволяющая записывать в регистры RTC, которые я пропустил?