主题中讨论的其他器件: SYSBIOS
工具/软件:
从待机模式返回后、RF、TIMER、UART 等会进行初始化并发送数据包。 初始化后、大约需要 30ms 计时器中断发生。 这是由振荡器稳定时间造成的吗? 还有、是否有方法可以缩短这一时间?
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.
工具/软件:
从待机模式返回后、RF、TIMER、UART 等会进行初始化并发送数据包。 初始化后、大约需要 30ms 计时器中断发生。 这是由振荡器稳定时间造成的吗? 还有、是否有方法可以缩短这一时间?
您好、
振荡器/XTAL 启动应在器件启动时处理、根据我观察到的情况、所需的时间可以忽略不计(可能小于 30ms)。
您的问题是在设备已启动且过了一段时间后发生的吗? 例如
您能否提供更多信息、以便我们更好地支持您:
谢谢、
Toby
这是回调。 具体实现如下:
void timerCallback((Timer_Handle myHandle、int_fast16_t 状态)
{
TP2_HI;
tick_1msec_counter++;
TP2_LO;
}
void timer_Initialize( void )
{
/*
*将计时器设置为连续回调模式,调用回调
*每 1,000,000 微秒或 1 秒运行一次。
*/
Timer_Params_(&timerParams);
timerParams.period = 1000;
timerParams.periodUnits = Timer_PERIOD_US;
timerParams.timerMode = Timer_CONTINUAL_CALLBACK;
timerParams.timerCallback = timerCallback;
timer0 = Timer_OPEN (CONFIG_TIMER_0、&timerParams);
if (timer0 == NULL)
{
/*无法初始化计时器*/
while (1){}
}
IF (Timer_START (timer0)= Timer_STATUS_ERROR)
{
/*无法启动计时器*/
while (1){}
}
}
SDK simplelink_cc13xx_cc26xx_sdk_8_30_01_01
2. base simplelink_cc13xx_cc26xx_sdk_8_30_01_01\examples\nortos\CC1312R1_LAUNCHXL\prop_rfPacketRx
虽然这是定制板、但射频部分与 LAUNCHXL-CC1312R1 相同。
CCS 版本:10.4.0.00006
最初的 30 毫秒是一个错误;时间被认为是振荡稳定时间是 340ms。
我将在示波器上发送实际代码和状态图像。
{μ s
//待机进入
G_eventFlag = 0;
G_aonRtcEventFlag = 0;
while (g_eventFlag == 0 && g_aonRtcEventFlag == 0){
power_idleFunc ();
}
//退出
TP1_HI;
G_eventFlag = 0;
G_aonRtcEventFlag = 0;
UART1_Initialize ( BPS115200, STOP_1bit, PARITY_EVEN , DATA_8bit );
Timer_Initialize();
pwm_Initialize();
SPI1_init ();
TP1_LO;
・μ s
・μ s
}μ s
void timerCallback((Timer_Handle myHandle、int_fast16_t 状态)
{
TP2_HI;
tick_1msec_counter++;
TP2_LO;
}
void timer_Initialize( void )
{
/*
*将计时器设置为连续回调模式,调用回调
*每 1,000,000 微秒或 1 秒运行一次。
*/
Timer_Params_(&timerParams);
timerParams.period = 1000;
timerParams.periodUnits = Timer_PERIOD_US;
timerParams.timerMode = Timer_CONTINUAL_CALLBACK;
timerParams.timerCallback = timerCallback;
timer0 = Timer_OPEN (CONFIG_TIMER_0、&timerParams);
if (timer0 == NULL)
{
/*无法初始化计时器*/
while (1){}
}
IF (Timer_START (timer0)= Timer_STATUS_ERROR)
{
/*无法启动计时器*/
while (1){}
}
}
示波器波形是在退出待机模式后获取的。
第一个 TP1 是代码中的以下部分。
TP1_HI;
G_eventFlag = 0;
G_aonRtcEventFlag = 0;
UART1_Initialize ( BPS115200, STOP_1bit, PARITY_EVEN , DATA_8bit );
Timer_Initialize();
pwm_Initialize();
SPI1_init ();
TP1_LO;
在它里面,我们执行
timer_Initialize();
并在那里注册计时器回调。
TP2 在回调中输出。
void timerCallback((Timer_Handle myHandle、int_fast16_t 状态)
{
TP2_HI;
tick_1msec_counter++;
TP2_LO;
}
我不明白为什么从 timer_Initialize () 到 TP2 出现需要 340ms。 尊敬的 Shingo:
您捕获的第二个 TP1 脉冲是多少(在 TP2 活动之前的那个脉冲)?
为了更好地了解将要执行的操作、您可以连接 TI Logger 并启用功耗驱动程序调试声明。
这将有助于我们了解转换是否按预期触发。
您是否尝试用空的 while 循环来运行它、而不是调用 Power_idleFunc();? 器件是否由电源驱动器设置为睡眠?
此致、
Theo
第二个 TP1 是数据包实际通过射频传输的时序。
在传输函数中使用了 RF_runCmd、并且已确认发送数据包。
我确定了电源驱动器已将器件设置为待机模式、方法是在电源线中插入电流表并测量下降到 8μA 的电流、因此我得出结论认为器件处于待机模式。
为了到达这一点、我使用了 Power_getDependencyCount 来找出哪些模块阻止了待机。
实际上、在停止和关闭每个模块后、我会循环 Power_idleFunc();。
使用 Power_idleFunc ();转换到待机模式有什么问题吗?
实际实现功能
↓μ s
Void SleepSystem(){
SPI1_CLOSE ();
timer_close();
pwm_close();
LED_ALL_OFF;
UART1_CLOSE ();
//待机进入
G_eventFlag = 0;
G_aonRtcEventFlag = 0;
while (g_eventFlag == 0 && g_aonRtcEventFlag == 0){
power_idleFunc ();
}
//退出
TP1_HI;
G_eventFlag = 0;
G_aonRtcEventFlag = 0;
UART1_Initialize ( BPS115200, STOP_1bit, PARITY_EVEN , DATA_8bit );
Timer_Initialize();
pwm_Initialize();
SPI1_init ();
TP1_LO;
}
尊敬的 Shingo:
问题在于电源驱动器应自动处理运行和待机之间的转换。
为此、您只需确保没有外设阻止器件转换到待机模式、并确保 MCU 处于空闲状态。 然后、电源驱动程序将根据待机策略将设备转换为待机、而无需调用 Power_idleFunc()。
接下来、在空的 while 循环上尝试挂起。
请告诉我结果。 我目前怀疑您的电源驱动程序处于错误状态、因此我建议使用 TI Logger 查看电源驱动程序的调试声明。
此致、
Theo
我用如下所示的空循环尝试了它、但电流消耗是 6.3mA、它似乎没有进入待机模式。
while (g_eventFlag == 0 && g_aonRtcEventFlag == 0){
// Power_idleFunc ();
}
此程序已根据
simplelink_cc13xx_cc26xx_sdk_8_30_01_01\examples\nortos\CC1312R1_LAUNCHXL\prop_rfPacketRx 进行了修改。
电源驱动器何时工作?
尊敬的 Shingo:
我怀疑程序是空闲的、这还不够清楚。
请在信标上添加待处理状态、如下所示:
#include
#include
//主循环信标
Semaphore_Struct semMainLoop;
Semaphore_Handle hSemMainLoop;
Void YourWakeupCallbakc(空)
{
信标_POST (hSemMainLoop);
}
void *mainThread (void *arg0)
{
//信标初始化
Semaphore_Params semParams;
Semaphore_Params_初始化 (&semParams);
信标构造 (&semMainLoop、0、&semParams);
hSemMainLoop =信标_handle (&semMainLoop);
while (1)
{
信标_pend (hSemMainLoop、BIOS_WAIT_FOREVER);
}
}
此致、
Theo