cc2540串口睡眠如何去唤醒
我的程序是基于simpleperipheral,加了串口和powersaving,这是我的预编译选项
INT_HEAP_LEN=3072
HALNODEBUG
OSAL_CBTIMER_NUM_TASKS=1
HAL_AES_DMA=TRUE
HAL_DMA=TRUE
POWER_SAVING
xPLUS_BROADCASTER
HAL_UART=TRUE
HAL_LED=FALSE
HAL_UART_DMA=1
HAL_UART_ISR=0
HCI_UART_BR=4
HAL_KEY=FALSE
经过验证,程序可以进入PM2模式,现在的问题是怎样实现PM2的唤醒,保证串口的正常收发。
由于开启了POWER_SAVING选项,CTS和RTS都参与工作,现在得情况是,BTOOL连接到串口模块后,开启通知,通过串口调试助手发送数据,BTool收到数据有错,这是因为没唤醒的原因吗。BTool发数据到CC2540,串口调试助手不能立马收到数据,要把CTS拉低,才可以收到数据,不能通过无线唤醒吗,CC2540收到数据必须要通过外部中断唤醒才能开启串口发送吗。
ethan,
通过无线唤醒系统也能达到目的的。
你可以尝试代码里面把流控关闭试试看。
从机进入睡眠后,能有主机无线唤醒么?
yueliangz0123,
进入PM3之后是不可以的,只有本身IO口的中断才可以唤醒。
进入PM3只有外部中断可以?PM3进入的条件之一是不能有任何定时任务,包括睡眠定时唤醒?
PM2可以用睡眠定时唤醒吧?
PM2模式下能有主机无线唤醒从机?机制是什么样的?
Hi Yan:
关闭流控只需定义#define NPI_UART_FC FALSE吗,流控关闭后对CTS,RTS有什么影响,目前我修改这个参数,测试串口传输功能发现没多大影响,是否还要修改其他参数
yueliangz0123,
请看我回复你的另一个帖子。
PM2 可以用定时唤醒。
PM2 模式下只要建立者连接,只要有RF的中断,就会被唤醒,用于保持连接。
YAN,
simpleBLEperipheral例程中,PM2唤醒是通过sleeptimer在每个连接事件唤醒,也就是说只有在每个连接事件才可以发数据。如果想做到主机发个数据到从机,从机能不能马上建立连接事件
ehtan,
是的,在有连接的情况下,PM2 必须在“必要”的连接事件时候唤醒,这个是由sleep timer来监控,就是32.768K的晶振来实现。这个是为了维持正常连接。
我强调了“必要”,意思是这个是有连接参数来控制何时为“必要”,这个参数就是slave latency, 如果slave latency 为0, 那么每个连接事件从机都必须醒来。如果slave latency不为 0, 那么就在slave latency 个连接事件后 从机才会在接下来那个连接事件中醒过来回复主机的poll.
所以,你说的主机发送到从机,从机立马回应,只有在slave latency 为 0,从机会响应每个连接事件的配置下,能做到。
YAN,
谢谢你的细心解答,我的串口程序,现在测得PM2模式功耗有140多UA,进入PM2之前,我做了IO口的处理
P1SEL = 0; HAL_SLEEP_SET_POWER_MODE(); P1SEL = 0x40;
请问这样做是可行吗,我测了下,电流没多大变化,开启串口后进入睡眠还要做哪些处理
/******************************************************************************
* @fn HalUARTSuspend
*
* @brief Suspend UART hardware before entering PM mode 1, 2 or 3.
*
* @param None
*
* @return None
*****************************************************************************/
void HalUARTSuspend( void )
{
#if HAL_UART_ISR
HalUARTSuspendISR();
#endif
}
这个函数要在什么时候使用
ethan,
最好不要直接调用HAL_SLEEP_SET_POWER_MODE(), 这个函数是只给系统OSAL 去自动调用的,如果你看halsleep() 代码的话,在调用这个函数之前会有许多操作,你直接调用会造成系统紊乱。
你可以试一下 osal_pwrmgr_device()这个函数。
HalUARTSuspend()是在定义了HAL_UART_ISR 模式不等于0的情况下,并且POWER_SAVING是使能的时候才会用到的。默认的UART应该是DMA模式。
Hi YAN,
没有直接调用HALSLEEP_SET_POWER_MODE(); ,是在协议栈里改的,睡眠前将串口IO模式改为普通IO口,唤醒后再将IO口恢复,需要这样做吗。还有,睡眠怎么关闭串口的外设。关于powersaving有没有相关参考文档。谢谢
ethan,
没有必要用P1SEL 之类寄存器去重新设置IO口的输入输出方向属性。
建议你用我上面提到的函数试一下。
power saving没有其他文档,本来这个是有OSAL 自动调度,不需要用户自己去修改的。
主机与从机之前未连接,通过主机去无线唤醒PM2模式的从机 可以吗?
不错,学习了