Использование утилиты ST-LINK для настройки RTC на текущее время

9

Что я делал

Я использую микроконтроллер 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, которые я пропустил?

Spectre208
источник
Возможно, защищен от записи, если не введен ключевой код.
Sparky256
Рад видеть, что вы многое выяснили из первоначальных намеков. Как правило, вы должны публиковать решение как ответ, а не как редактирование вопроса, и особенно если вы сами дошли до него, было бы целесообразно в конечном итоге перевести ваше согласие на это.
Крис Страттон
Я на самом деле не думал об этом таким образом! Я чувствую, что должен все же сделать это, хотя я хотел бы, чтобы у вас тоже были кредиты.
Spectre208
Через какое время после программирования должно работать ваше устройство и насколько точным должно быть время суток? Я просто волнуюсь, что независимо от того, насколько точен твой RTC, он, в конце концов, будет немного дрейфовать, по крайней мере, если он будет использоваться годами, а твои временные требования будут строгими.
Тимо
Предполагается, что он будет работать в течение 10 лет на одном аккумуляторе. Однако временная схема уже слегка модифицирована некоторым случайным числом, чтобы все устройства не могли отправлять свои данные одновременно. Поэтому дрейф времени по RTC не имеет большого значения.
Spectre208

Ответы:

4

Некоторые регистры допустимы только для определенной ширины доступа (т. Е. -W32 может быть неправильным) или могут не считывать записанные значения, что может вызвать проблемы с проверкой.

Также могут быть ограничения на последовательность или состояние доступа к вещам.

Вариант, который должен обойти большинство мыслимых проблем, - создать крошечную программу, которая будет выполнять работу, связанную с запуском в ОЗУ. Вы можете подставить данные в двоичный файл после определения смещения, загрузить измененную версию и запустить ее. Или вы можете заставить программу получать значения из области оперативной памяти за пределами экстентов файла, которые вы устанавливаете перед запуском. Благодаря более детальному управлению stlink вы также можете передавать значения в регистры ЦП, хотя вам может (?) Потребоваться альтернативная программа командной строки с открытым исходным кодом, а не ST для этого (эта небольшая подпрограмма в методе ОЗУ, кстати, является тем, как эта программа выполняет запись мигать)

Крис Страттон
источник
3

Итак, одна из проблем была, как указал Крис Страттон:

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

Это означало, что проверка не удалась, что привело к отображению ошибки, даже если операция записи действительно прошла успешно.

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

0x4000280C: 00000027

Запись 0x00000080 в 0x4000280C ... Ошибка!

0x4000280C: 000000A7

Проверка утилиты ST-LINK проверяет, совпадают ли значения, записанные по адресу и считанные из адреса. В этом случае операция записи прошла успешно, хотя эти два значения не совпадают, так как теперь установлен бит INIT.

Другая проблема заключалась в том, что я не мог заметить эффект операции записи. При подключении к микроконтроллеру ST-LINK удерживает его в состоянии сброса (так называемое «подключение при сбросе»). Мне нужно было использовать опцию HOTPLUG connect, которая подключается к микроконтроллеру без остановки или сброса.

Опция «Подключить при сбросе» позволяет подключиться к цели перед выполнением любой инструкции. Это полезно во многих случаях, например, когда цель содержит код, который отключает контакты JTAG / SWD.

Опция «HotPlug» позволяет подключаться к цели без остановки или сброса. Это полезно для обновления адресов ОЗУ или регистров IP во время работы приложения

Пакетный файл полностью работает так, как я хотел! Команда теперь выглядит так:

ST-LINK_CLI.exe -c HOTPLUG -w32 <Address> <data> -w32 <Address> <data> ...
Spectre208
источник
1

Я думаю, что происходит то, что после записи выполняется проверочное чтение. Если тот же регистр возвращает текущее время в чтении, хотя вам удалось обновить RTC, отладчик не будет реализован. Это с меньшей вероятностью объясняет проблему с регистром питания (если только отладчик не обращается к этому регистру тоже под капотом). Проверьте прочитанное значение вручную. Если возникла более серьезная проблема, это чтение также может завершиться ошибкой. Кроме того, попробуйте другие регистры в вашем списке.

Шон Хулихейн
источник