Other Parts Discussed in Thread: EK-TM4C1294XL
Thread 中讨论的其他器件:EK-TM4C1294XL
您好!
我是微处理器固件开发的新手。
到目前为止、我为 tm4c129器件开发了休眠部件。
在微外设的初始化阶段、休眠外设初始化如下:
启用休眠模块的时钟。
等待晶体加电和稳定
-配置休眠模块的时钟源(用于连接到 XOSC1和 XOSC0的外部晶振)
启用 RTC 功能
设置两个备用唤醒源:HIBERNATE_WAKE_PIN | HIBERNATE_WAKE_RTC
读取 HIBCTL、它指示 VDD3ON、PINWEN、CLK32EN、RTCEN 位设置为1 (调试指令)。
清除任何挂起状态。
当向器件询问重新启动序列时:
RTC 设置为0
-自现在起,匹配0寄存器设置为10秒
休眠请求已完成。
当微唤醒时、会读取 HIBRIS 寄存器值以根据导致微唤醒的源执行操作。
我希望检测到的唯一唤醒源是 RTC、它实际上导致了微控制器的唤醒、但也检测到了其他源。
分析 HIBRIS 位可以注意到:
1) 1) RTCALT 位被设定为1
2) VDDFAIL 位设置为1:如数据表所述:“由于任意断电或一个或多个电源(VDD、VDDA、VDDC)降至定义的工作范围以下,中断被发送到中断控制器”
3) 3) RSTWK 位设置为1:如数据表中所述:“由于 RESET 引脚已编程为将器件从休眠状态唤醒,中断被发送到中断控制器”
4) PADIOWK 位设为1:如数据表中所述:“由于其中一个启用唤醒功能的 GPIO 引脚或外部复位引脚已被置为有效,中断被发送到中断控制器”
1)这正是我所期望的、将 RTC 设置为唤醒源、启用 RTC 并设置微休眠状态和微唤醒时间(10秒)之间的间隔。
2) 2)实际上 HIB 信号会下降、并从 VDD 微型引脚上移除3.3V 电源。 VBAT 保持在3.3V
3) 3)我无法理解为什么我没有将 RESET 引脚编程为唤醒源
4) 4)可以通过唤醒序列进行解释、我认为唤醒序列包含微复位、可能会发送到0复位引脚、但这不是我编程的内容。 此外、我不会对任何 GPIO 引脚进行编程
用作唤醒源。
您是否会想到这种情况? 我所做的事有什么问题吗?
----------------------------------------------------
extern "C"{
#include
}
int main (void)
{
//将计时设置为在120MHz
uint32_t freqSet = SysCtlClockFreqSet (((SYSCTL_XTAL_25MHz | SYSCTL_OSC_main | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);
SysCtlPeripheralEnable (sysctl_Periph_HIBERNATE);
while (!SysCtlPeripheralReady (sysctl_Periph_HIBERNATE)
{}
静态休眠外设休眠内置 Tiva (120000000);
HibernatePeripheralTiva;}-->Init());}-->init();}-->-----------
HibernatePeripheralTiva.cpp
#include
#include
#include
HibernatePeripheralTiva::HibernatePeripheralTiva (uint32_t HibernatePeripheralThiva):myclient (NULL)、myClockFrequency (clockFrequency)
{}
HibernatePeripheralTiva:::~HibernatePeripheralTiva (uintleHibernatePeripheralThiva)
{
DisableHibernateHibernateHibernatePeripheralPeripheralPeripheral (natePeripheralThiva);
}HibernateTime_TimernatewakeFlag
:0)与 UernateWRTCLK_Time_Time_TimereT_HIBERR //bit 0 reg HIBRS/HIBIC
{
//打印"RTC 匹配寄存器"
}
if (wakeFlag 和 HIBERNATE_INT_LOW_BAT) //bit 2 reg HIBRS/HIBIC
{
//打印“低电量”
}
if (wakeFlag & HIBERNATE_INT_PIN_WAKE) //bit 3 reg HIBRS/HIBIC
{
//打印“WAKE 管脚置位”
}
if (wakeFlag & HIBERNATE_INT_WR_COMPLETE) //bit 4 reg HIBRS/HIBIC
{
//打印“HIBCTL 中的 WRC 位集”
}
if (wakeFlag & HIBERNATE_INT_GPIO_WAKE) //bit 5 reg HIBRS/HIBIC
{
//打印“GPIO 引脚置位”
}
if (wakeFlag 和 HIBERNATE_INT_RESET_WAKE) //bit 6 reg HIBRS/HIBIC
{
//打印“复位引脚置位”
}
if (wakeFlag & HIBERNATE_INT_VDDFAIL) //bit 7 reg HIBRS/HIBIC
{
//打印“VDD FAIL”
}
int HibernatePeripheralTiva::Init()
{
if (HibernateIsActive())
{
ui32Status = HibernateIntStatus (false);//读取状态以确定唤醒原因。
//打印 ui32Status
onWakeEvent (ui32Status);
HibernateRTCEnable();//启用 RTC 功能。
HibernateWakeSet (HIBERNATE_WAKE_PIN | HIBERNATE_WAKE_RTC);//配置为在外部 WAKE 管脚有效或 RTC 匹配时唤醒。
HibernateIntClear (ui32状态);
返回0;
}
EnableHibernatePeripheral ();
返回0;
}
void HibernatePeripheralTiva::EnableHibernatePeripheral ()
{
HibernateEnableExpClk (120000000);//启用休眠模块的计时
等待(100);//延迟允许晶振加电和稳定
HibernateClockConfig (120000000);//启用
休眠模块的 HIGRSC 功能;//启用休眠模块的休眠模块。
HibernateWakeSet(. HIBERNATE_WAKE_PIN | HIBERNATE_WAKE_RTC );//配置为在外部 WAKE 管脚有效或 RTC 匹配时唤醒。
ui32Status = HibernateIntStatus (false);
//打印 ui32Status
HibernateIntClear (ui32Status);
}
void HibernatePeripheralTiva::::DisablePeripheralPeripheral()
{
nateDisable ();
}
void HibernateIntClear:::HibernateWakePeripheralWake (UINT32_Hit)当请求
将此函数设置为0或 RT0时、即为1个中断。
HibernateRTCMatchSet (0、HibernateRTCGet ()+ hibTime);//将匹配0寄存器设置为从现在开始的时间等于 hibTime。
StartHibernate();
}
void HibernatePeripheralTiva::StartHibernate() //按下开关按钮
时调用此函数{
HibernateRequest();//请求休眠。
for (;;)//需要此处的循环来等待断电。 在该循环中执行时断电。
{
}
无效休眠外设 Tiva::等待(int 毫秒)
{
//一个计数或节拍将导致3个系统时钟的延迟(也称为机器周期)。
//系统时钟为120MHz。 3个周期等效于120 x 10^6/3或40000000 Hz
// 40000000/1000 =每毫秒40000个周期
SysCtlDelay (毫秒* 40000);}--><!--kadov_tag{</spaces>}}-->
HibernatePeripheralTiva.h
#include
类休眠外设 Tiva
{
public:
HibernatePeripheralTiva (uint32_t clockFrequency);
virtual ~HibernatePeripheralTiva ();
int Init();
void StartPeripheralation ();
void HibernateAndWake (uint32_t sec);
void EnableHibernatePeripheral();
void DisableHibernatePeripheral();
void wait (int milliseconds );
void onWakeEvent(UINT32_t WakeFlag);
private:
HibernatePeripheralClient* myclient;
uint32_t myClockFrequency;
uint32_t ui32Status;
};