微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > 关于CC2541 UART的问题

关于CC2541 UART的问题

时间:10-02 整理:3721RD 点击:

我在设置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多了。这大概是哪里出问题了呢?希望能够得到你的回复,谢谢。急急急!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top