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 中
谢谢你