我不知道你是否已经解决了这个问题。
目前我在一个项目中工作,在该项目中我需要使用 PRU 实现特殊的通信协议,并且我需要使用其特定的时间戳存储所有通信传输,以便生成通信报告以验证一切是否已按预期执行。
为了完成这项任务,我使用了 Beaglebone Black RTC 模块。如果您查阅 AM335x 用户参考手册,您可以看到对该模块、其寄存器和精度的完整说明。如果你只需要秒精度,这是它的极限,这个模块非常适合你。如果没有,您可以将其寄存器提供的信息与 IEP 计时器结合起来。第二种选择要在这里解释更多。如果这是您的情况,请告诉我,我会尽力提供分步指南。
要使用 PRU 的 RTC 模块,可以使用 OCP 端口访问它。这是一段代码,您可以使用它从 PRU 访问 RTC 寄存器。然后我将每个值(小时、分钟、秒、年、月、日)存储在 PRU0 RAM 中,以使它们可以从 host.c 程序中读取,并检查我得到的值是否与在 Linux 终端中输入日期相同。
//************************************************************************
// Reading RTC from PRU
//************************************************************************
// Author : Pablo Alías Mateos
// Project : General
// Description:
//**************************************************************************
//==========================================================================
//**************************************************************************
//==========================================================================
.origin 0
.entrypoint START
//----------------------------------------------------------------------
#define RTC_BASE_ADDRESS 0x44E3E000
#define RTC_SECONDS_OFFSET 0x00000000
#define RTC_MIN_OFFSET 0x00000004
#define RTC_HOUR_OFFSET 0x00000008
#define RTC_DAYS_OFFSET 0x0000000C
#define RTC_MONTH_OFFSET 0x00000010
#define RTC_YEAR_OFFSET 0x00000014
//----------------------------------------------------------------------
START:
// Enable the OCP master port
LBCO r0, c4, 4, 4 // load SYSCFG reg into r0 (use c4 const addr)
CLR r0, r0, 4 // clear bit 4 (STANDBY_INIT)
SBCO r0, c4, 4, 4 // store the modified r0 back at the load addr
MOV r0, RTC_BASE_ADDRESS
MOV r1, 0x00000000 // base RAM0
LBBO r2,r0,RTC_HOUR_OFFSET,4
SBBO r2,r1,0,4
LBBO r2,r0,RTC_MIN_OFFSET,4
SBBO r2,r1,4,4
LBBO r2,r0,RTC_SECONDS_OFFSET,4
SBBO r2,r1,8,4
LBBO r2,r0,RTC_DAYS_OFFSET,4
SBBO r2,r1,12,4
LBBO r2,r0,RTC_MONTH_OFFSET,4
SBBO r2,r1,16,4
LBBO r2,r0,RTC_YEAR_OFFSET,4
SBBO r2,r1,20,4
希望这些信息对您有用,
巴勃罗