微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > CC2540-关于osal_getClock()和osal_setClock()函数相关问题

CC2540-关于osal_getClock()和osal_setClock()函数相关问题

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

在系统启动初始化我利用osal_setClock()设置时间初始值为0,蓝牙和手机不连接,间隔半小时用LightBlue连接读取芯片上时间(利用osal_getClock()),读了四次,读到时间是正确的,和我手机计时器上的时间一致。

同样方法,区别是蓝牙始终和LightBlue保持连接状态,但是读取到时间明显比手机计时器的时间滞后,在两个小时30分钟后慢了75秒

请问为什么会这样?

请问在第一种状态下,蓝牙不和手机连接的时候保持在什么状态?广播状态?

没有,广播180s后不再广播,除非按钮触发它。

那也就是说广播之后就进入PM3模式了,最低功耗必须要外部中断才能唤醒。那么可以理解没有使用到慢时钟,或者快慢时钟的切换使用的不是那么频繁。如果是保持连接power saving打开的话在两个connection intervel之间就是PM2模式 会有快慢时钟的切换 可能导致不准

可以把Power saving关掉再试试看结果如何

很抱歉,这么晚回复!最近在忙其他事。

我做了测试,关闭了Power Saving ,但是时间还是出现偏差。

在代码里面加HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_DISABLE_CLK_divIDE_ON_HALT );试一下

 我在初始化地方加入HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_DISABLE_CLK_divIDE_ON_HALT );

时间还是有偏差,我用两个模块同时工作,一个我用LightBlue一直连接,一个没有连接做了对比。

测试两种情况:1,关闭POWER SAVING宏 和添加HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_DISABLE_CLK_divIDE_ON_HALT );----测试0.5H,连接的滞后13秒左右

2,开启POWER SAVING宏和添加HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_DISABLE_CLK_divIDE_ON_HALT );----测试0.5H,连接的滞后13秒左右

另外,请问这个HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_DISABLE_CLK_divIDE_ON_HALT );我添加地方是否正确?我就放在xxxBLEPeripheral_Init( uint8 task_id )函数开始的位置。HCI_EXT_ClkDivOnHaltCmd返回值为0.

Hi,WBJ。如果系统时间不准确是由于振荡器引起,我查了一下资料。有下面几个问题,麻烦您看一下。

问题1:协议栈使用那个振荡器为系统提供时间,32KHz XOSC(32.768KHz)??

问题2,:如果问题1的答案是32KHz XOSC,那么我的时间不准确可能是在蓝牙设备和手机一直保持连接时,蓝牙设备可能进入PM1或PM2,这时可能协议栈自动去选择使用32KHz XOSC还是32KHz RCOSC,如果选择了RCOSC,可能导致时间不正确。这种说法是否正确?

问题3,:如果问题2我的说法正确,那么我要保证我的系统时间正确,我就要保证我的系统要选择在32KHz XOSC。我的设备不会进入PM3模式,我能不能设置,我的蓝牙设备无论在哪个模式下(除PM3),我都要32KHz XOSC这个在工作。请问怎么设置?

协议栈选用的时钟源是根据不同的状态决定的 当active的时候应该是32M的时钟, 进入PM2应该是32K的时钟,但是是R还是X是代码里面可以设置的,R没有X准这是肯定的,所以我们不建议会采用PM2模式的BLE设备不使用外部32K时钟。PM3模式下,应该是所有的时钟都会停下来不工作。

Hi,WBJ.

协议栈是否有提供接口函数来设置32K振荡器是R还是X?

目前我没有条件去使用外部时钟,但是CC2540本身就有一个32.768的时钟。所以只要保证我的蓝牙设备一定不会进入PM3模式,而在其他模式中,我的32.768振荡器一直是工作的,这样我就可以保证系统时间的准确性。这个想法是否正确?有可行性吗?我要怎样去保证32.768的振荡器一直在工作?

看一下文件hal_board_cfg.h

CC2540的RCOSC不那么准,在有用到sleep mode的时候就会用到32K的clock,所以如果没有外部32K,进入PM2会导致timer不准。但是在BLE active工作的时候又会切到32M clock。不是说内部32K RC一直开着就不会偏,精度不高越跑兴许偏差越大。

HI,WBJ,非常抱歉!我说的不是很清楚,让你理解有了误差。

我不是要利用32K RC,而是利用32K XOSC(32.768)晶体振荡器用来计时。而且我的系统一直在跑任务,不会进入PM3模式(或者我设置不让它进入PM3)。

然后我要这个32K XOSC晶体震荡器一直运行(无论任何情况(除PM3)),并且选择这个晶体振荡器始终为系统时间的时钟源,这样是否就可以保证系统时间的稳定。

另外,协议栈是否有函数接口可以提供给我做上面说到这些设置?

谢谢!

你需要的设置协议栈没有接口来支持的,因为协议栈要active跑的时候就需要32M的时钟无法使用32K的时钟, 32K的时钟只在进入Power Mode模式(非PM3)之后才用到

我关闭了POWER SAVING,这时系统应该一直使用32M时钟,为什么也会有系统时间不正确呢?

请问您测试的板子是TI的评估板还是别的什么板子?能否在TI的评估板上验证一下?

不是TI的评估板,是购买的CC2540模块。目前没有TI评估板的条件。

Hi,WBJ.

今天我用CC2541的模块做了很多对比实验。发现用一样的程序,CC2541的系统时间是正确的。

请问这是为什么?

Hi,WBJ.

我这边做了实验,发现40的系统时间会不稳定,但是41相当稳定。

其中一个实验:我让我的模块供应商把41模块(已确定系统时间稳定)的CC2541芯片取了下来,直接更换成CC2540芯片(确保了其外部电路一致),然后运行一样的程序,发现40的系统时间还是不稳定。

问一下楼主,我在osal_run_system( )中,把osalTimeUpdate();的条件宏去掉了,但是调用osal_setClock()设置系统时间却没有生效是怎么回事?

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

网站地图

Top