我在做什么
我正在使用 STM32 微控制器,对于我的项目,我需要能够在一天中的特定时间(例如,上午 11 点和下午 2 点)发送数据。在我能做到这一点之前,微控制器需要知道现在是什么时间。不幸的是,我只有单向通信,因此我无法从网络中请求当前时间。
因此,我想在完成编程后直接设置当前时间。我知道我可以使用 ST-LINK Utility 命令行界面 (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 位
- 将 0xCA 写入 RTC_WPR 寄存器
- 将 0x53 写入 RTC_WPR 寄存器
- 通过设置 RTC_ISR 寄存器中的 INIT 位来停止 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 实用程序写入 R/W 寄存器?
是否有某种写保护允许写入我忽略的 RTC 寄存器?