使用ST-LINK实用程序将RTC配置为当前时间


9

我在做什么

我正在使用STM32微控制器,对于我的项目,我需要能够在一天的特定时间(例如,上午11点和下午2点)发送数据。微控制器需要知道现在几点才能实现。不幸的是,我只能进行单向通信,因此无法从网络请求当前时间。

因此,我想在编程后直接设置当前时间。我知道我能够使用以下命令使用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参考手册中所述

  • 将PWR_CR寄存器中的DPB位置1
  • 将0xCA写入RTC_WPR寄存器
  • 将0x53写入RTC_WPR寄存器
  • 通过将RTC_ISR寄存器中的INIT位置1来停止RTC
  • 通过写入RTC_PRER寄存器选择1Hz时钟
  • 通过写入RTC_TR寄存器加载当前时间
  • 通过写入RTC_DR寄存器加载当前日期
  • 通过复位RTC_ISR寄存器中的INIT位来启动RTC

要访问寄存器,我使用了以下地址:

  • 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:

在0x40007000处写入0x00000100 ...错误!

读取这些寄存器没有问题,但是我无法使用ST-LINK实用程序或其命令行界面对其进行写入。


问题

如何使用ST-LINK Utility写入R / W寄存器?

是否有某种写保护允许写入我忽略的RTC寄存器?


除非输入键码,否则可能会受到写保护。
Sparky256 '16

很高兴看到您从最初的提示中发现了很多东西。通常,您应该发布解决方案作为答案,而不是对问题进行编辑,尤其是当您自己进行了如此深入的探索时,最终将您的接受范围移到那是合适的。
克里斯·斯特拉顿

我实际上还没有那样想!我觉得我仍然应该这样做,即使我也希望你也能有所贡献。
Spectre208'6

您的设备必须在编程后运行多长时间,并且一天中的时间必须多精确?我只是担心,无论您的RTC精度如何,它最终都会漂移一点,至少在使用了多年并且您的计时要求严格的情况下。
Timo

它应该使用单个电池运行10年。但是,时间方案已经通过一些随机数进行了稍微修改,以防止所有设备一次发送所有数据。因此,RTC时间漂移并不重要。
Spectre208'6

Answers:


4

某些寄存器仅对特定的访问宽度有效(即-w32可能不正确),或者可能无法读回可能导致验证问题的写入值。

访问事物可能还会有顺序或状态限制。

解决大多数可想到的问题的一种选择是制作一个微型程序来完成将要在RAM中运行的程序。确定偏移量后,可以将数据替换为二进制文件,然后上传修改后的版本并运行。或者,您可以让程序从文件范围之外的RAM区域中获取值,这是在运行之前设置的。通过更细粒度的控制stlink,您还可以在CPU寄存器中传递值,尽管您可能(?)需要备用开源命令行程序而不是ST来执行此操作(RAM方法中的这个小例程恰好是该程序完成写入的方式)闪烁)


3

因此,正如克里斯·斯特拉顿(Chris Stratton)所指出的,问题之一是:

某些寄存器..可能不读回可能导致校验问题的写入值。

这意味着即使写入操作实际上成功了,验证仍然失败,导致显示错误。

以下是读取PWR_ISR寄存器,将INIT位置1,然后再次读回该寄存器时得到的响应:

0x4000280C:00000027

在0x4000280C处写入0x00000080 ...错误!

0x4000280C:000000A7

ST-LINK实用程序的验证将检查写入地址和从地址读取的值是否匹配。在这种情况下,即使两个值不匹配,写操作也会成功,因为现在将INIT位置1。

另一个问题是我无法注意到写操作的效果。当连接到微控制器时,它通过ST-LINK保持在复位状态(称为“复位连接”)。我需要使用HOTPLUG connect选项,该选项无需停机或复位即可连接到微控制器。

“重置时连接”选项允许在执行任何指令之前连接到目标。这在许多情况下很有用,例如当目标包含禁用JTAG / SWD引脚的代码时。

“ HotPlug”选项允许在不停止或重置的情况下连接到目标。这对于在应用程序运行时更新RAM地址或IP寄存器很有用

批处理文件完全可以按我的意愿运行!现在,命令如下所示:

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

1

我认为正在发生的事情是在写入之后执行了验证读取。如果同一寄存器在读取中返回当前时间,尽管您成功更新了RTC,但调试器将无法实现。这不太可能解释电源寄存器的问题(除非调试器也在后台访问该寄存器)。手动检查读取值。如果存在更严重的问题,则此读取也可能会失败。另外,请尝试列表中的其他寄存器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.