关于 CC2541 UART 流控的问题

来源:互联网 发布:php 500 error_log 编辑:程序博客网 时间:2024/06/03 12:10

转自:

http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/t/62376.aspx  这是 TI 论坛上的问题,保留在这里,方便以后查看


关于CC2541 UART的问题


此问题尚无答案
  • 秀才521分

    我在设置UART的时候,发现要把POWER_SAVING关掉之后才能正常通过UART口把数据发出去,但是这样一来程序不是不能进入省电状态了吗

    请问TI的工程师为什么会这样,有没有什么方式可以UART正常工作,但是还会比较省电的情况。

    谢谢!

  • 进士3134分

    wang jhon.

    我不是TI的工程师,不过我刚解决这个问题。

    你可以尝试用osal_pwrmgr_device( PWRMGR_ALWAYS_ON );把电源给hold住,保持他不进入睡眠。

    直到串口把数据发送出去后,再调用osal_pwrmgr_device( PWRMGR_BATTERY );让他可以自由睡眠。

  • 榜眼33905分

    wang,

    POWER_SAVING 模式下, 系统会进入低功耗,32M晶振会关闭,UART就不能用啦。

    请看 此帖 对你的回复:http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/t/62376.aspx

  • 秀才71分

    低功耗模式不是可以通过UART进行唤醒嘛?

  • 进士3134分

    CC2540内部有几种低功耗模式,不同的低功耗模式对时钟信号的管理不同。

    其中低频32KHz的时钟信号只供给 看门狗、睡眠定时器,不能供给CPU及其他外设。

    而高频32MHz的时钟信号则作为系统时钟供给CPU及外设。

    参见下图:

    CC2540内部不同的低功耗模式,对时钟的管理不同。

    在PM3模式下,所有时钟信号关闭,只能靠外部中断及复位信号唤醒。

    在PM2模式下,保留低频的32KHz时钟信号。而关闭高频的32MHz时钟信号。可以靠睡眠定时器及外部中断唤醒。

    一旦32MHz时钟信号被关闭,也就意味着UART没有时钟信号支持,没有时钟信号支持就意味着UART不能工作。

    既然这个UART不能工作,那么就不能接收数据,同样也无法唤醒CPU了。

  • 秀才643分

     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!


  • 进士3134分

    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)进入睡眠。

  • 秀才643分

    Hi, shaokai, 按照你的方法解决了问题,谢谢了!

    其中,发现一定需要IO唤醒cpu,就算开始设置PWRMGR_ALWAYS_ON,cpu还是会睡眠的。

  • 进士3134分

    Hi key dongle

         你说就算开始设置PWRMGR_ALWAYS_ON,cpu还是会睡眠的。

    有个办法可以解决,在顶层初始化时启动一个周期事件的任务(即使是空任务也不怕,建议周期设长一点,如5s),这样就可以避免CPU进入PM3模式,CPU空闲时可以进入PM2模式——功耗其实差不多了多少的。

        另外,有个提醒:PM2、PM3模式下IO唤醒CPU后晶振要重新起振,从产生外部中断到晶振信号稳定是需要一定时间的,在晶振未稳定前接收数据是不稳定的。

    ——这个你可以自己尝试,时间长度也可以自己测量。

  • 秀才20分

    Hi  shaokai Lin

          这个外部I/O中断应该加在哪里呢,学生新手学习,多多指教。

  • 进士3134分

    这个无所谓拉,目的只是起到唤醒的作用,能实现的都可以。

0 0
原创粉丝点击