在开发过程中遇到了以下问题,记录一下
1.在与ios手机连接后,手机app使能notify,设备与手机通过write和notify进行数据交换,但是在连接传输数据一端时间后,设备收到write命令后不能发出notify命令,打印错误码180 = 0xB4,GATT_ERR_DATA_PENDING_DUE_TO_SERVICE_DISCOVERY_BUSY,设备发送notify失败的原因是ios蓝牙master主机正在发现蓝牙服务,此时不允许发送notify数据。
解决办法:出现这个错误后,将发送notify失败的数据保存到一个全局数组中,并保存数据长度,设置一个标记位为1,记录当前的系统时间,将此在主循环中轮询,如果检测到这个标记位为1且时间过了500ms,之后再重发一次之前notify失败的数据,就可以成功发送了。
2.配置蓝牙串口唤醒口,cpu_set_gpio_wakeup (GPIO_WAKEUP_MODULE, Level_Low, 1);
GPIO_WAKEUP_MODULE_HIGH;设置成低电平唤醒,上拉,每次进入睡眠都会IO抖动,造成毛刺,用逻辑分析仪抓TX、RX、CTS和RTS四根线,如下图:
而如果配置成cpu_set_gpio_wakeup (GPIO_WAKEUP_MODULE, Level_High, 1);
GPIO_WAKEUP_MODULE_LOW;,则不会出现这个问题
但是我们的串口发送数据的时序已经确定是低电平唤醒,所以会遇到图一的问题,原因是上拉10K的控制中不要使用PC0~PC7,在deepsleep retention wakeup时会有短时间的抖动,产生毛刺,而我们用的串口IO和唤醒IO恰好是这几个。
解决办法:如果在条件允许的情况下,更改硬件连线,需要将唤醒蓝牙的IO换成PA或者PB的IO口,不要用PC的IO口,如果不能修改硬件,那么就直接不用PM_DEEPSLEEP_RETENTION_ENABLE深度睡眠模式,将其定义改成0,从而使用suspend去做低功耗,功耗在50uA左右,深度睡眠模式功耗在5uA左右