51uwb.cn
标题:
关于DW1000,休眠与唤醒
[打印本页]
作者:
13764295318
时间:
2021-12-2 16:57
标题:
关于DW1000,休眠与唤醒
代码流程:
休眠---> User_UWB_Init();
---> dwt_configuresleep(DWT_PRESRV_SLEEP | DWT_CONFIG, DWT_WAKE_WK | DWT_SLP_EN);
---> DW1000_WakeUp_Pin_Set(0);
---> dwt_entersleep();
唤醒---> DW1000_WakeUp_Pin_Set(1);
---> HAL_Delay(1);
---> DW1000_WakeUp_Pin_Set(0);
---> while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_SLP2INIT)){ };
---> reset_DW1000();
---> 发送数据
大致流程是这样,休眠,唤醒,从实际实验来看,应该是成功的。
目前疑惑,DW1000的唤醒需要300ms时间,删除while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_SLP2INIT)){ };可能导致后面DW1000发送数据失败。
(, 下载次数: 1713)
上传
点击文件名下载附件
官方文档看,DW1000从休眠到PLL起来只需要5ms。
小弟困惑,反了好多DW1000的资料,都没找到有关内容,有没有哪位大侠对这方面有研究的哇,望能帮忙解答.
作者:
13764295318
时间:
2021-12-9 09:58
问题原因已找到:是单片机与DWM1000模块之间的问题
电路硬件连接完全按照官方电路图来实现的,具体原因,为什么要这样操作,我还没彻底分析清楚。
解决步骤:下面贴出设备休眠,唤醒操作
/************* Enter Stop Mode 进入低功耗模式*************************/
/*1,Stop2 Mode --- 1.02uA at 2V4
* 1.06uA at 3V
* 1.23uA at 3V6
*/
void Enter_StopMode(void){
// printf("\r\n4 --- Now Enter <Stop2 Mode> \r\n");
HAL_SuspendTick();
HAL_SPI_DeInit(&hspi1);
HAL_UART_DeInit(&huart1);
HAL_ADC_DeInit(&hadc1);
HAL_GPIO_DeInit(GPIOA, DW_IRQn_Pin); //0xF76D GPIO_PIN_10 | DW_IRQn_Pin
HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
}
void WakeUp_From_StopMode(void){
HAL_ResumeTick();
SystemClock_Config();
MX_GPIO_Init();
MX_SPI1_Init();
MX_USART1_UART_Init();
MX_ADC1_Init();
// printf("\r\n\r\n1 --- Now WakeUp... \r\n");
}
其中问题出在这里HAL_SPI_DeInit(&hspi1);这里完全关闭spi配置,可能会造成和设备之间spi通讯引脚电平问题。
需要修改代码:
void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi)
{
if(hspi->Instance==SPI1)
{
/* USER CODE BEGIN SPI1_MspDeInit 0 */
/* USER CODE END SPI1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_SPI1_CLK_DISABLE();
/**SPI1 GPIO Configuration
PA1 ------> SPI1_SCK
PA7 ------> SPI1_MOSI
PA11 ------> SPI1_MISO
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1|GPIO_PIN_7|GPIO_PIN_11);
/* USER CODE BEGIN SPI1_MspDeInit 1 */
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;//GPIO_MODE_AF_PP GPIO_MODE_OUTPUT_OD
GPIO_InitStruct.Pull = GPIO_PULLUP; //GPIO_PULLDOWN GPIO_PULLUP
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USER CODE END SPI1_MspDeInit 1 */
}
}
至此,设备的从唤醒起来,进行UWB发送,再进行一次AD采样的 持续时间,示波器抓了下,在28ms左右,比较符合预期。
同时需要注意:需要配置IRQ引脚
HAL_GPIO_DeInit(GPIOA, DW_IRQn_Pin); //0xF76D GPIO_PIN_10 | DW_IRQn_Pin
不然休眠电流会增大200uA左右。
最终我的设备休眠功耗在4.5uA ,1s lptimer唤醒一次,每次唤醒后工作时间在28ms。单片机STM32L431
具体为什么spi要这样配置,我还在分析中。
作者:
Fox
时间:
2023-4-19 10:48
13764295318 发表于 2021-12-9 09:58
问题原因已找到:是单片机与DWM1000模块之间的问题
电路硬件连接完全按照官方电路图来实现的,具体原因 ...
楼主这个问题解决了吗,我也遇到的问题是进入睡眠之后无法唤醒,您遇到过这样的问题吗
作者:
Fox
时间:
2023-4-19 10:50
我也用和你一样的方式进入睡眠,不过我没有让MCU进入休眠模式,而是唤醒后直接开始发数据,发现一致发送不成功,读了一下系统寄存器,发现读出来的值都不正确
uint32_t sys_ctrl = dwt_read32bitoffsetreg(SYS_CTRL_ID, SYS_CTRL_OFFSET);
DEBUG_TRACE("Tick %u:%08X\r\n", now, sys_ctrl);
读出来的值是80FFFFFF,看样子是没有唤醒或者芯片逻辑乱了。
欢迎光临 51uwb.cn (http://51uwb.cn/)
Powered by Discuz! X3.3