STM32
直播中

juju宇哥

9年用户 1474经验值
擅长:479809
私信 关注
[问答]

求助,关于stm32l151低功耗设置的问题求解

各位高手:
    现在在使用STM32l151的stop模式,进入休眠后测量电流有1.8mA,比参考值大很多,进入休眠已将所有所有IO口配置成模拟,并且关闭了IO口时钟,串口时钟,定时器时钟,不知道还有什么地方设置的不对,请各位高手指点!!!

回帖(1)

张芳

2024-4-26 15:56:21
只要相对应的引脚设为下降沿中断,没用到的引脚设为模拟输入。
void MX_GPIO_Anialog_All(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();

  GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|
                        GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|
                        GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_15;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA,  GPIO_InitStruct);

  GPIO_InitStruct.Pin  = GPIO_PIN_All;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOB,  GPIO_InitStruct);

  GPIO_InitStruct.Pin  =  GPIO_PIN_0 | GPIO_PIN_1  | GPIO_PIN_2  | GPIO_PIN_3  | GPIO_PIN_4|
                          GPIO_PIN_5 | GPIO_PIN_6  | GPIO_PIN_7  | GPIO_PIN_8  | GPIO_PIN_9|
                         GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOC,  GPIO_InitStruct);

  GPIO_InitStruct.Pin  = GPIO_PIN_2;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOD,  GPIO_InitStruct);
  
  /*Configure GPIO pins : PH0 PH1 */
  GPIO_InitStruct.Pin  = GPIO_PIN_0|GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOH,  GPIO_InitStruct);
    __HAL_RCC_GPIOH_CLK_DISABLE();
   
  /*Configure GPIO pin : PC13 */
  GPIO_InitStruct.Pin = GPIO_PIN_13;  // 接 唤醒1
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOC,  GPIO_InitStruct);
  
  /*Configure GPIO pin : PA0 */
  GPIO_InitStruct.Pin  = GPIO_PIN_0;  // 接 唤醒2
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA,  GPIO_InitStruct);
}
其他引脚的初始化在这个函数的后面完成

中断优先级设置函数
static void MX_NVIC_Init(void)
{
  /* RTC_WKUP_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(RTC_WKUP_IRQn, 5, 0);
  HAL_NVIC_EnableIRQ(RTC_WKUP_IRQn);
  /* EXTI0_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(EXTI0_IRQn, 7, 0);
  HAL_NVIC_EnableIRQ(EXTI0_IRQn);
  /* USART1_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(USART1_IRQn, 1, 0);
  HAL_NVIC_EnableIRQ(USART1_IRQn);
  /* USART2_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(USART2_IRQn, 3, 0);
  HAL_NVIC_EnableIRQ(USART2_IRQn);
  /* USART3_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(USART3_IRQn, 3, 0);
  HAL_NVIC_EnableIRQ(USART3_IRQn);
  /* EXTI15_10_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(EXTI15_10_IRQn, 7, 0);
  HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
  /* TIM6_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(TIM6_IRQn, 6, 0);
  HAL_NVIC_EnableIRQ(TIM6_IRQn);
}

// 外部引脚中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if(GPIO_Pin == GPIO_PIN_13)   // 中断由GPIO_PIN_13触发 PC13引脚
  {
      Wkup_Flag1 = TRUE;           // 谁唤醒的标志位1
  }
  else if(GPIO_Pin == GPIO_PIN_0)  // 中断由GPIO_PIN_0触发,PA0引脚
  {
      Wkup_Flag2 = TRUE;           // 谁唤醒的标志位2
  }
}

在main.c的while(1)循环中加入这2个中断判断标识就可以恢复正常运行了
举报

更多回帖

发帖
×
20
完善资料,
赚取积分