Topic

FAQ
Login Register
B85_moudule串口唤醒配置问题
Oct 09, 2023 17:17

/

A

/A

我们现在需要开发一款蓝牙透传模组,主要是串口透传APP数据给MCU和转发MCU的数据给手机APP的功能,目前是在B85m_BLE_Single_Connection_SDK_v3.4.2.1版本上的b85m_module例程上进行开发,目前在测试蓝牙功耗时发现一个问题,具体如下:
BLE的IO配置如下:

uart_gpio_set(UART_RTX_PC2, UART_RX_PC3);
#define GPIO_WAKEUP_MODULE GPIO_PC0 //mcu wakeup module
#define PC0_FUNC AS_GPIO
#define PC0_INPUT_ENABLE 1
#define PC0_OUTPUT_ENABLE 0
#define PC0_DATA_OUT 0
#define GPIO_WAKEUP_MODULE_HIGH gpio_setup_up_down_resistor(GPIO_WAKEUP_MODULE, PM_PIN_PULLUP_10K);
#define GPIO_WAKEUP_MODULE_LOW gpio_setup_up_down_resistor(GPIO_WAKEUP_MODULE, PM_PIN_PULLDOWN_100K);
#define GPIO_WAKEUP_MCU GPIO_PC4 //module wakeup mcu
#define PC4_FUNC AS_GPIO
#define PC4_INPUT_ENABLE 0
#define PC4_OUTPUT_ENABLE 1
#define PC4_DATA_OUT 1
#define GPIO_WAKEUP_MCU_HIGH do{gpio_set_output_en(GPIO_WAKEUP_MCU, 1); gpio_write(GPIO_WAKEUP_MCU, 1);}while(0)
#define GPIO_WAKEUP_MCU_LOW do{gpio_set_output_en(GPIO_WAKEUP_MCU, 1); gpio_write(GPIO_WAKEUP_MCU, 0);}while(0)
#define GPIO_WAKEUP_MCU_FLOAT do{gpio_set_output_en(GPIO_WAKEUP_MCU, 0); gpio_write(GPIO_WAKEUP_MCU, 0);}while(0)
在APP.c的文件中user_init_normal函数中:
1>第一种设置
cpu_set_gpio_wakeup (GPIO_WAKEUP_MODULE, Level_Low, 1);
GPIO_WAKEUP_MODULE_HIGH;
使用逻辑分析仪抓包(TX,RX,CTS,RTS)如下:

可以发现四根线都有明显的毛刺,每个毛刺放大都是一个拉低然后被拉高的过程,每个毛刺间隔为一个广播周期,这会导致MCU一直被唤醒,导致设备无法休眠,此时蓝牙模块是可以正常休眠的,电流在5.4uA和80uA间跳动
2>第二种设置
cpu_set_gpio_wakeup (GPIO_WAKEUP_MODULE, Level_High, 1);
GPIO_WAKEUP_MODULE_LOW;
使用逻辑分析仪抓包(TX,RX,CTS,RTS)如下:

可以发现没有毛刺,串口正常,MCU可以正常进入休眠,但是此时测得蓝牙的电流为3.6mA左右,导致设备功耗很大,但是在app.c的app_power_management函数的加入打印如下:
if (!app_module_busy() && !tick_wakeup)
{
printf("go to sleep");
...
}
发现蓝牙实际可以进入休眠:

请问要怎么配置才是正确的?


TL_Soyo Oct 10, 2023 13:41
0
/A

你好,

  休眠唤醒引脚需要配置为输入才行,我看你配置的输出,同时将拉电阻和你的外部引脚匹配,建议你下载driver SDK 参考下PM工程。

11 replies
TL_Soyo Oct 10, 2023 13:41
0
/A

你好,

  休眠唤醒引脚需要配置为输入才行,我看你配置的输出,同时将拉电阻和你的外部引脚匹配,建议你下载driver SDK 参考下PM工程。

TL_Soyo Oct 11, 2023 13:34
0
/A

用EVK板子测试电流正常吗?最好用最简单的sample验证下休眠,module加入了很多应用代码。



Tenix [Author] Oct 11, 2023 14:43
0
/A

你好,

    我们现在的串口是低电平唤醒的逻辑,因此需要配置成:

cpu_set_gpio_wakeup (GPIO_WAKEUP_MODULE, Level_Low, 1);
GPIO_WAKEUP_MODULE_HIGH;

这种配置是满足我们需求的,蓝牙也可以正常进入到深度睡眠模式下,电流只有5.4uA和80uA间跳动,但是这种情况会出现毛刺,导致MCU一直被唤醒,我想问下,出现这个毛刺的原因是什么,怎么能消除这个毛刺

TL_Soyo Oct 11, 2023 16:04
0
/A

建议在sample上开发你的应用,module的应用导致电流不是很干净的。



Tenix [Author] Oct 11, 2023 17:11
0
/A

“module的应用导致电流不是很干净的”具体是指的什么?我们想搞清楚导致广播唤醒后IO电平变化的具体原因,以免后续开发再遇到这个问题



Tenix [Author] Oct 11, 2023 17:44
0
/A

你好:

     这个问题我在CSDN论坛上找到了答案,上拉10K的控制中不要使用PC0~PC7,在deepsleep retention wakeup时会有短时间的抖动,产生毛刺,而我们目前使用的IO都是PC组的,所以导致了上面的问题,和用哪个例程是没有关系的