51uwb.cn

 找回密码
 立即注册

关于DW1000,休眠与唤醒

查看数: 5461 | 评论数: 3 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2021-12-2 16:57

正文摘要:

代码流程: 休眠--->  User_UWB_Init();       --->  dwt_configuresleep(DWT_PRESRV_SLEEP | DWT_CONFIG, DWT_WAKE_WK | DWT_SLP_EN);        ...

回复

Fox 发表于 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,看样子是没有唤醒或者芯片逻辑乱了。
Fox 发表于 2023-4-19 10:48:36
13764295318 发表于 2021-12-9 09:58
问题原因已找到:是单片机与DWM1000模块之间的问题

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

楼主这个问题解决了吗,我也遇到的问题是进入睡眠之后无法唤醒,您遇到过这样的问题吗
13764295318 发表于 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要这样配置,我还在分析中。

bphero Inc.  

GMT+8, 2024-11-22 23:16 , Processed in 0.016370 second(s), 8 queries , File On.

Powered by Discuz! X3.3

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

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