我的程序是基于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收到数据必须要通过外部中断唤醒才能开启串口发送吗。
Yan:
ethan,
通过无线唤醒系统也能达到目的的。
你可以尝试代码里面把流控关闭试试看。
WIND JXC:
回复 Yan:
从机进入睡眠后,能有主机无线唤醒么?
Yan:
回复 WIND JXC:
yueliangz0123,
进入PM3之后是不可以的,只有本身IO口的中断才可以唤醒。
WIND JXC:
回复 Yan:
进入PM3只有外部中断可以???PM3进入的条件之一是不能有任何定时任务,包括睡眠定时唤醒??
PM2可以用睡眠定时唤醒吧?
PM2模式下能有主机无线唤醒从机??机制是什么样的??
ethan:
回复 Yan:
Hi Yan:
关闭流控只需定义#define NPI_UART_FC FALSE吗,流控关闭后对CTS,RTS有什么影响,目前我修改这个参数,测试串口传输功能发现没多大影响,是否还要修改其他参数
Yan:
回复 WIND JXC:
yueliangz0123,
请看我回复你的另一个帖子。
PM2 可以用定时唤醒。
PM2 模式下只要建立者连接,只要有RF的中断,就会被唤醒,用于保持连接。
ethan:
回复 Yan:
YAN,
simpleBLEperipheral例程中,PM2唤醒是通过sleeptimer在每个连接事件唤醒,也就是说只有在每个连接事件才可以发数据。如果想做到主机发个数据到从机,从机能不能马上建立连接事件
ethan:
回复 Yan:
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}
这个函数要在什么时候使用
Yan:
回复 ethan:
ethan,
最好不要直接调用HAL_SLEEP_SET_POWER_MODE(), 这个函数是只给系统OSAL 去自动调用的,如果你看halsleep() 代码的话,在调用这个函数之前会有许多操作,你直接调用会造成系统紊乱。
你可以试一下 osal_pwrmgr_device()这个函数。
HalUARTSuspend()是在定义了HAL_UART_ISR 模式不等于0的情况下,并且POWER_SAVING是使能的时候才会用到的。默认的UART应该是DMA模式。