您好,我使用Task_sleep(5000000 / Clock_tickPeriod);让系统进入待机模式,待机时间为5秒,并使能一个引脚中断,用于唤醒cc1310。但实测中,在待机模式时,我通过按一个按键触发中断,的确能唤醒cc1310,但唤醒后代码执行中断函数后退出似乎又进入待机模式,除非5秒过后才退出。
所以请问怎么才能唤醒cc1310并且再唤醒后执行Task_sleep的下一句代码?
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.
您好,我使用Task_sleep(5000000 / Clock_tickPeriod);让系统进入待机模式,待机时间为5秒,并使能一个引脚中断,用于唤醒cc1310。但实测中,在待机模式时,我通过按一个按键触发中断,的确能唤醒cc1310,但唤醒后代码执行中断函数后退出似乎又进入待机模式,除非5秒过后才退出。
所以请问怎么才能唤醒cc1310并且再唤醒后执行Task_sleep的下一句代码?
您好,我是在task中调用Task_sleep的。
在task中首先我注册按键下降沿中断
const PIN_Config keyPinTable[] = {
KEY | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_NEGEDGE,
PIN_TERMINATE
};
keyPinHandle = PIN_open(&keyPinState, keyPinTable);
if (keyPinHandle != 0)
{
PIN_registerIntCb(keyPinHandle, &keyCallbackFxn);
}
然后再一个大循环中每睡眠5秒后进行一次RF发送
while(1)
{
RF_TxPacket txPacket = {0};
/* Create packet with incrementing sequence number and random payload */
txPacket.payload[0] = (uint8_t)(seqNumber >> 8);
txPacket.payload[1] = (uint8_t)(seqNumber++);
txPacket.payload[2] = battMeasure();
uint8_t i;
for (i = 3; i < PAYLOAD_LENGTH; i++)
{
txPacket.payload[i] = i;//rand();
}
txPacket.len = PAYLOAD_LENGTH;
txPacket.dstAddr[0] = 0xaa;
txPacket.dstAddr[1] = 0x55;
txPacket.absTime = 0;/*RF_getCurrentTime() + RF_ms_To_RadioTime(1000);*/
LED_Set(Led_Red,1); //红灯亮
RF_transmit(rfHandle, &txPacket);
LED_Set(Led_Red,0); //红灯灭
Task_sleep(5000000 / Clock_tickPeriod);
}
在按键中断函数中让蓝灯反转
void keyCallbackFxn(PIN_Handle handle, PIN_Id pinId)
{
LED_Set(Led_Blue, !PIN_getOutputValue(LED_BLUE));
}
结果的现象是:我在进入待机时,按下按键,蓝色灯反转,说明进入中断,但红色灯不会亮即不发送RF,需等待机5秒后才发送RF
LaoSheng Lin,
你这样按键也不会唤醒task呀,你按键中断跟这个task没任何关系,中断归中断,task还在5秒中睡着呢,所以肯定是每隔5秒醒来一次调用RF_transmit(),所以就是你看到的现象。
正确的做法你应该用semaphore,while(1) 之后等待semaphore, 这个时候这个task就是在sleep的, 然后按键中断的处理函数发送semaphore去唤醒task,不要用sleep函数。
如果你同时想要每隔5秒RF_transmit一下,那么你就要结合timer来做,用的也不是sleep。在上面我说的方法的基础上,设置个timer,每隔5秒用semaphore唤醒task,给task一个event, 在这个event中重新设置timer。如果收到按键中断, 也给个event给task,task在这个event下面停止timer,然后重启5秒的timer。
谢谢Y的指点,我明白了,也就是说TI-RTOS自动会进入待机模式的吧,难怪我以前测试待机电流时,使用Task_Sleep和不使用时的功耗都差不多,都小于1uA
我发现问题了,是我的32.768KHz晶体没有起振,导致休眠电流变大,现在已经解决了。进入Task_sleep之后电流只有0.3uA左右。
0.3uA左右的电流,最大会不会超过资料上说的0.7uA?