CC2540 打开串口是如何省电,降低功耗
我现在遇到这个问题。 把HAL_UART 编译进去后。 耗电7mA 左右。(我把power saving 编译进去了好像也没有用,也是7mA)。 cc2540 是被动接收数据的。 没有给cc240 通过串口发数据的时候, 我想让cc2540 进入省电模式。 然后,当有串口发数据来的时候, 我就要退出省电模式,接收串口数据。
当没有串口数据来的时候 :进入省电模式的代码应该放在哪里? 就调用osal_pwrmgr_device这个函数就行了吗?
当有了串口数据来的时候 : 要怎么退出来? 代码应该怎么写? 要设置中断吗?
这是我的串口接收函数。
void sbpSerialAppCallback(uint8 port, uint8 event)
{
(void)event;
int numBytes=0;
delayMs(30);
uint8 pktBuffer[SBP_UART_RX_BUF_SIZE]={0};
if ((numBytes = Hal_UART_RxBufLen(HAL_UART_PORT_0)) > 0 )
{
(void)HalUARTRead (HAL_UART_PORT_0, pktBuffer, numBytes);
sbpSerialAppWrite(buf,numBytes);
}
}
}
YAN~~~
低功耗模式时,串口是无法接收数据的。建议您定时唤醒设备,采用查询方式来做串口
Susan Yang 你好~
那我要怎么知道串口有数据进来呢?
还有要怎么唤醒呢?
我是新手, 希望可以比较详细点。有点代码更好。
thank you~
可以在唤醒后去查询是否有串口数据,可以参考 http://itas109.blog.163.com/blog/static/171911753201382625746963/
关于唤醒,可以使用睡眠定时器,可以参考帖子http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/t/47302.aspx
HI Susan Yang
很感谢您的解答, 但是我还是有一些疑问。
1:
INT_HEAP_LEN=3072
HALNODEBUG
OSAL_CBTIMER_NUM_TASKS=1
HAL_AES_DMA=TRUE
HAL_DMA=TRUE
HAL_UART=TRUE
POWER_SAVING
xPLUS_BROADCASTER
HAL_LCD=TRUE
HAL_LED=TRUE
HAL_UART=TRUE
xHAL_UART_TRANS=TRUE
xHAL_UART_GPIO_ISR
我 只要我 把 HAL_UART=TRUE 编译进去。 不管有没有编译 进 POWER_SAVING 都是很耗电的。 有6~7mA左右, 是不是我还没有进入到省电模式呀?要怎么看进入省电模式了没有?
2: 我要不要把流控打开呢? 打开流控只要 #define SBP_UART_FC TRUE 就行了吗? 还要不要写什么代码吗?
3:
osal_pwrmgr_device(PWRMGR_ALWAYS_ON)
osal_pwrmgr_device(PWRMGR_BATTERY)
就用着两个函数就可以切换省电模式了是吧。 但是具体怎样跟 定时器配合起来还是不懂。
##: 我要实现的功能是: cc2540 上电后。 如果没有串口给cc2540 发来数据 ,我就要cc2540 进入省电模式(要求省电), 如果有数据发来的时候,就切换到正常模式。处理串口发来的数据,处理完后 又进入省电模式。
(我本来的程序是。编译 xPOWER_SAVING HAL_UART=TRUE 运行起来没有问题。 就是耗电,不管发不发数据都是 6~7 mA)
