我在做什么
我正在使用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寄存器?