This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C1294NCPDT:RTC 时钟计数器模式应用

Guru**** 2040210 points
Other Parts Discussed in Thread: EK-TM4C1294XL
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/596956/tm4c1294ncpdt-rtc-clock-counter-mode-application

器件型号:TM4C1294NCPDT
Thread 中讨论的其他器件:EK-TM4C1294XL

我尝试使用休眠模块在计数器模式下使用 RTC、但不会将处理器发送到休眠模式。

我正在尝试使用 RTC 匹配寄存器创建次秒级中断-精确地在一秒内10 Hz 中断约10次。 我使用不同的 GPIO 引脚每秒启用一次中断。 在这一秒内、我需要精确的10个10Hz 中断。 我将 RTC 亚秒寄存器和匹配寄存器用于相同的目的。

用于启用 RTC 和 HIB 的代码片段:

//配置休眠模块时钟。
//
HibernateEnableExpClk (ui32SysClock);


//启用 RTC 模式。
//
HibernateRTCEnable();

//
//将休眠模块计数器配置为24小时日历模式。
//
//休眠计数器模式(HIBERNATE_COUNTER_24HR);
//将休眠模块计数器配置为 RTC 计数器模式。
休眠计数器模式(HIBERNATE_COUNTER_RTC);

########## 为了使每一个中断都持续、我们使用 GPIO########################################################################################

// LaunchPad BoosterPack 1接头、用于获取1个 PPS 脉冲配置引脚
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
GPIOPinTypeGPIOInput (GPIO_PORTF_BASE、GPIO_PIN_3);//初始化 PF3作为输入

GPIOPadConfigSet (GPIO_PORTF_BASE、GPIO_PIN_3、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU);

//中断设置
GPIOIntDisable (GPIO_PORTF_BASE、GPIO_PIN_3);//禁用 PF4中断(如果已启用)
GPIOIntClear (GPIO_PORTF_BASE、GPIO_PIN_3);//清除 PF4的挂起中断
//注册端口 F 引脚3的处理程序函数
GPIOIntRegisterPin (GPIO_PORTF_BASE、GPIO_INT_PIN_3、IntGPIOF_Pin3);
GPIOIntTypeSet (GPIO_PORTF_BASE、GPIO_PIN_3、GPIO_RISE_EDGE);

//
//为 GPIO F 引脚3注册中断处理程序函数
//
IntRegister (INT_GPIOF_TM4C129、IntGPIOF_Pin3);

##################################################################################################################

启用休眠匹配中断

//启用休眠匹配中断
HibernateRTCSet (0);//将 RTC 计数器秒设置为零
//清除休眠模块的挂起中断
HibernateIntClear (HIBERNATE_INT_RTC_MATH_0);
//禁用休眠模块的中断
HibernateIntDisable (HIBERNATE_INT_RTC_MATH_0);

HibernateIntRegister (Count10Hz_ISR);//此中断的寄存器处理程序
//为 RTC 匹配0注册中断处理程序函数
//
IntRegister (INT_HIBERNATE_TM4C129、COUNT_10Hz_ISR);
//
//在处理器矢量表中为 RTC 匹配0启用中断
//
// IntEnable (INT_HIBERNATE_TM4C129);//移至主循环之前
//启用处理器中断。


//重置 RTC 计数器秒
HibernateRTCMatchSet (0、0);

##################################################################################################

通过 GPIO 的 iSECOND ISR  

无效
IntGPIOF_Pin3 (空)

//设置 PPS 标志= true 以便在主循环中进行处理

HWREG (UART0_BASE + 0)='$';// 400nS 延迟、550nS 抖动@ 115200波特// UART 发送
////打开该位


PPS_FLAG = true;
hibRegister_subseconds = HibernateRTCSSGet ();// HWREG (HIB_RTCSS);在 ISR 中单独获取子秒

//将两个 RTC 计数器设置为零秒和亚秒

HibernateRTCSet (0);

GPIOIntClear (GPIO_PORTF_BASE、GPIO_INT_PIN_3);

##################################################################################################

由 HIB 匹配 ISR 启用的亚秒级 ISR

//
//
//这是每个1pps 间隔内10Hz 中断的处理程序。
//使用 RTC 匹配值在1秒内生成10次中断
//
//
void Count10Hz_ISR (void){
HWREG (UART0_BASE + 0)='|';//######
//打开位

//主循环标志
RTC_Flag = true;

HWREG (HIB_IC)|= HIBERNATE_INT_RTC_MATCH_0;

}//结束 ISR

########################################################################################################################

主循环

while (1)

//在无限循环中 spit out $
if (pps_FLAG = true){
//重置 pps 标志
PPS_FLAG = false;


MatchDollarCounter = 0;//########



HWREG (HIB_RTCSS)&= 0x0000FFFF;//按原样保留低16位

while (!(HWREG (HIB_CTL)& HIB_CTL_WRC));//#### 下一次写入之前需要
//测量值~90us
HWREG (HIB_RTCSS)|= 0x0CCD0000;//#### 反汇编代码显示这会对4条指令执行读-修改-写操作、这会引入时序错误####
while (!(HWREG (HIB_CTL)& HIB_CTL_WRC));//#### 下一次写入之前需要

HibernateIntEnable (HIBERNATE_INT_RTC_MATH_0);// RTC 中断的中断源}//如果 pps 标志结束


否则、如果(RTC_Flag = true){//######
// UARTFlushTx (false);//刷新 UART 发送缓冲器##########
//关闭位

// GPIOPinWrite (GPIO_PORTP_BASE、GPIO_PIN_1、GPIO_PIN_1);

GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、1);
MatchDollarCounter++;//######

// HibernateRTCMatchValue =(HibernateRTCMatchGet (0)+ 0x1000)<< 16;//每次增加100毫秒。 因此、零是时间############的起始值
休眠 RTCMatchValue =(0xCCD + 0xCCD* MatchDollarCounter)<< 16;//每次增加100ms。 因此、零是时间############的起始值

HWREG (HIB_RTCSS)&= 0x0000FFFF;//保留低16位、如##########
while (!(HWREG (HIB_CTL)& HIB_CTL_WRC));//#### 在下一次写入之前需要(~90us)
HWREG (HIB_RTCSS)|=休眠 RTCMatchValue;//#### 反汇编代码显示这会对多条指令执行读-修改-写操作、这会引入时序错误####
while (!(HWREG (HIB_CTL)& HIB_CTL_WRC));//#### 在下一次写入之前需要(~90us)
// HibernateRTCSSMatchSet (0、HibernateRTCMatchValue);//########## 这将改变子样本秒数、我们不想这么做! ########
RTC_Flag = false;

IF (MatchDollarCounter == 3)
HibernateIntDisable (HIBERNATE_INT_RTC_MATH_0);

GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、0);


}//结束,1

##########################################################################################

问题:我们只能生成3个脉冲、它们不能以10Hz 的频率均匀分布。 它们会随着时间的推移而增加:第一个中断为1/10秒、第二个中断为132微秒、第三个中断为大约250 μ s、我们不会得到第四个中断。

请 TI 尽可能提供帮助。

我要附上从 Tivaware 示例修改的原始代码文件:

Hybernation 模块的示例代码位于 Tivaware 示例\boards\ek-tm4c1294xl\hiberne\hiberne.c 中

谢谢你

Pavitrae2e.ti.com/.../hibernate.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    您的1s 是周期性中断还是基于随机 GPIO 输入?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    中断是周期性的、但由 GPIO 端口 F 引脚3触发、该引脚被编程为每1秒触发一次中断。

    此致
    帕维特拉
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    您能否检查是否将 HIB LFIOSC 用作休眠模块的时钟源? 请注意、片上 HIB 低频振荡器(HIB LFIOSC)的频率变化较大。 不建议将 HIB LFIOSC 用作 RTC 时钟源。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    RTC 使用32.768KHz 晶振。

    我们使用的是具有板载32.768 KHz 晶振的 EK-TM4C1294XL Launchpad。

    谢谢
    帕维特拉
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    你能做一个实验吗? 您能否尝试以5Hz 而非10Hz 的频率生成子段匹配中断? 您实际上并不是在使用休眠模块来节省功耗、而是通过添加下一个子段匹配值来生成子段匹配中断、对吧? 休眠模块运行在32kz OSC 之外、要访问休眠模块寄存器、在32kz 频率下需要一些周期。 从首次清除子段匹配值到写入新的(下一个)子段匹配寄存器的时间、子段计数器已经过。 如果子段计数器值在下一个值被完全写入之前已经计入下一个匹配值、那么匹配可能会丢失。 这只是我要研究的一个方向。 还不需要根本原因。 您可以尝试的另一项操作是为每个0.1秒重置 RTC 计数器、并始终将子段匹配设置为0.1秒。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好

    我知道、由于 SS 匹配值与 SS 时钟值在同一寄存器中、因此会丢失少量的亚秒时间。 因此、我必须进行带屏蔽的读-修改-写操作、以保留 SS 时间(几乎)。 但该误差可以针对进行校正。

    “对于当前的实验,Tiva 几乎没有其他作用,因此100ms 应该有足够的时间来设置下一个间隔。 示波器通过使用测试点标志来确认这一点。 我看到的时间是:从 GPS 1PPS 边沿到第一个 SS 中断100ms、另一个132ms 到下一个、另一个268ms 到第三个(在该点总共500ms);在模式重复的第二个秒之前不再。 每次 GPS 边沿清除计数器、SS 匹配在每次中断时递增0xCCD。

    “是的,RTC 计数器在每100mS 的时间内,或者凭经验生成的匹配可以派生出来使其正常工作。 但我想先了解一下发生了什么。 在基本知识确定之后,我使用 RTC 可能利用计时调整功能,因为最初看来 RTC 似乎是这类问题的自然现象

    谢谢你