51uwb.cn

 找回密码
 立即注册
查看: 5408|回复: 3
打印 上一主题 下一主题

关于DW1000,休眠与唤醒

[复制链接]

2

主题

12

帖子

87

积分

注册会员

Rank: 2

积分
87
跳转到指定楼层
楼主
发表于 2021-12-2 16:57:30 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
代码流程:
休眠--->  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发送数据失败。

官方文档看,DW1000从休眠到PLL起来只需要5ms。
小弟困惑,反了好多DW1000的资料,都没找到有关内容,有没有哪位大侠对这方面有研究的哇,望能帮忙解答.
回复

使用道具 举报

2

主题

12

帖子

87

积分

注册会员

Rank: 2

积分
87
沙发
 楼主| 发表于 2021-12-9 09:58:46 | 只看该作者
问题原因已找到:是单片机与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要这样配置,我还在分析中。
回复

使用道具 举报

3

主题

7

帖子

43

积分

新手上路

Rank: 1

积分
43
板凳
发表于 2023-4-19 10:48:36 | 只看该作者
13764295318 发表于 2021-12-9 09:58
问题原因已找到:是单片机与DWM1000模块之间的问题

电路硬件连接完全按照官方电路图来实现的,具体原因 ...

楼主这个问题解决了吗,我也遇到的问题是进入睡眠之后无法唤醒,您遇到过这样的问题吗
回复

使用道具 举报

3

主题

7

帖子

43

积分

新手上路

Rank: 1

积分
43
地板
发表于 2023-4-19 10:50:58 | 只看该作者
我也用和你一样的方式进入睡眠,不过我没有让MCU进入休眠模式,而是唤醒后直接开始发数据,发现一致发送不成功,读了一下系统寄存器,发现读出来的值都不正确
uint32_t sys_ctrl = dwt_read32bitoffsetreg(SYS_CTRL_ID, SYS_CTRL_OFFSET);
DEBUG_TRACE("Tick  %u:%08X\r\n", now, sys_ctrl);
读出来的值是80FFFFFF,看样子是没有唤醒或者芯片逻辑乱了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

bphero Inc.  

GMT+8, 2024-11-1 08:04 , Processed in 0.031530 second(s), 6 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表