CC2540-关于osal_getClock()和osal_setClock()函数相关问题
在系统启动初始化我利用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()设置系统时间却没有生效是怎么回事?