关于CC2541 UART的问题
我在设置UART的时候,发现要把POWER_SAVING关掉之后才能正常通过UART口把数据发出去,但是这样一来程序不是不能进入省电状态了吗
请问TI的工程师为什么会这样,有没有什么方式可以UART正常工作,但是还会比较省电的情况。
谢谢!
wang jhon.
我不是TI的工程师,不过我刚解决这个问题。
你可以尝试用osal_pwrmgr_device( PWRMGR_ALWAYS_ON );把电源给hold住,保持他不进入睡眠。
直到串口把数据发送出去后,再调用osal_pwrmgr_device( PWRMGR_BATTERY );让他可以自由睡眠。
wang,
POWER_SAVING 模式下, 系统会进入低功耗,32M晶振会关闭,UART就不能用啦。
请看 此帖 对你的回复:http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/t/62376.aspx
低功耗模式不是可以通过UART进行唤醒嘛?
CC2540内部有几种低功耗模式,不同的低功耗模式对时钟信号的管理不同。
其中低频32KHz的时钟信号只供给 看门狗、睡眠定时器,不能供给CPU及其他外设。
而高频32MHz的时钟信号则作为系统时钟供给CPU及外设。
参见下图:
CC2540内部不同的低功耗模式,对时钟的管理不同。
在PM3模式下,所有时钟信号关闭,只能靠外部中断及复位信号唤醒。
在PM2模式下,保留低频的32KHz时钟信号。而关闭高频的32MHz时钟信号。可以靠睡眠定时器及外部中断唤醒。
一旦32MHz时钟信号被关闭,也就意味着UART没有时钟信号支持,没有时钟信号支持就意味着UART不能工作。
既然这个UART不能工作,那么就不能接收数据,同样也无法唤醒CPU了。
Hi, Shaokai Lin,我也刚好遇到这个问题啊。
你这里说到,用osal_pwrmgr_device( PWRMGR_ALWAYS_ON ) hold住电源,应该需要将POWER_SAVING打开的吧。但这样,似乎会影响串口接收数据。
尝试将hal_drivers.c中的ALLOW_SLEEP_MODE()注释掉,
void Hal_ProcessPoll ()
{
#if defined( POWER_SAVING )
/* Allow sleep before the next OSAL event loop */
//ALLOW_SLEEP_MODE();
#endif
...
}
这样打开了POWER_SAVING,osal_pwrmgr_device的参数为PWRMGR_ALWAYS_ON ,就不会影响串口的数据接收。
但是,最后当串口数据发送完毕后,停止各种事件,再调用osal_pwrmgr_device( PWRMGR_BATTERY ),不会进入PM3。
请问下,怎样可以做到打开POWER_SAVING,不影响串口数据收发,且最后可以进入PM3模式?
谢谢了!
PS:
前面关于串口接收数据的问题,后来我采用了你的建议,使用环形队列进行接收,
因为这个通用更强,不必考虑每个数据包的大小,双缓冲就不同了。Thank you!
Hi key dongle
正如前面说的,PM3、PM2模式下串口是没有时钟信号的,自然不能工作,无法接收数据。
所以你要接收数据只能保证数据来的时候CPU处于活跃状态。
我有个建议你可以参考:
CPU空闲时进入PM2睡眠,外部串口发送数据给cc2540前,先通过IO中断唤醒CPU,然后cc2540使用osal_pwrmgr_device(PWRMGR_ALWAYS_ON)hold住电源,保证接收数据过程中串口有时钟信号支持。
这时候外部串口再发送数据,cc2540在接收完毕后再次调用osal_pwrmgr_device(PWRMGR_BATTERY)进入睡眠。
Hi, shaokai, 按照你的方法解决了问题,谢谢了!
其中,发现一定需要IO唤醒cpu,就算开始设置PWRMGR_ALWAYS_ON,cpu还是会睡眠的。
Hi key dongle
你说就算开始设置PWRMGR_ALWAYS_ON,cpu还是会睡眠的。
有个办法可以解决,在顶层初始化时启动一个周期事件的任务(即使是空任务也不怕,建议周期设长一点,如5s),这样就可以避免CPU进入PM3模式,CPU空闲时可以进入PM2模式——功耗其实差不多了多少的。
另外,有个提醒:PM2、PM3模式下IO唤醒CPU后晶振要重新起振,从产生外部中断到晶振信号稳定是需要一定时间的,在晶振未稳定前接收数据是不稳定的。
——这个你可以自己尝试,时间长度也可以自己测量。
Hi shaokai Lin
这个外部I/O中断应该加在哪里呢,学生新手学习,多多指教。
这个无所谓拉,目的只是起到唤醒的作用,能实现的都可以。
很详细!学习了!
Hi ,shaokai
在测蓝牙2541功耗时发现一个问题。我的2541与外围单片机通过串口进行数据传输,蓝牙开启了POWER_SAVING,HAL_UART,通过单片机外部中断唤醒2541。当我蓝牙的UART引脚悬空不接时,我蓝牙的电流大概在0.5mA,但是当我把蓝牙2541 UART的引脚接在单片机的UART引脚上(或者任意的一个引脚,手触摸也可以),这时电流就升到了8mA多了。这大概是哪里出问题了呢?希望能够得到你的回复,谢谢。急急急!