你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32l151 低功耗设置的问题

[复制链接]
伤花怒放2003 提问时间:2017-7-8 13:17 /
阅读主题, 点击返回1楼
收藏 3 评论67 发布时间:2017-7-8 13:17
67个回答
zhao.zhao 回答时间:2017-7-19 10:46:14
///////////////////////////////////
// 恢复设置 USART1 的引脚功能
void  USART1_GPIO_Func_Set(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
   
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_USART1_CLK_ENABLE();
  
    /**USART1 GPIO Configuration   
    PA9     ------> USART1_TX
    PA10     ------> USART1_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

// 恢复设置 USART2 的引脚功能
void  USART2_GPIO_Func_Set(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
   
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_USART2_CLK_ENABLE();
  
//    PA2     ------> USART2_TX
//    PA3     ------> USART2_RX
    GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

// 恢复设置 USART3 的引脚功能
void  USART3_GPIO_Func_Set(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
   
    __HAL_RCC_GPIOB_CLK_ENABLE();
  /* USER CODE END USART3_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_USART3_CLK_ENABLE();
  
    /**USART3 GPIO Configuration   
    PB10     ------> USART3_TX
    PB11     ------> USART3_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
伤花怒放2003 回答时间:2017-7-20 14:42:51
zhao.zhao 发表于 2017-7-19 10:46
///////////////////////////////////
// 恢复设置 USART1 的引脚功能
void  USART1_GPIO_Func_Set(void)

我做了个测试,芯片不休眠,然后还是按之前一样先把所有引脚配为模拟输入,然后重新配置UART1程序就跑飞了,感觉UART1不能重复配置,这会是什么原因?
zhao.zhao 回答时间:2017-7-20 19:51:41
只要引脚改改,其他的不要重新配置,我一直强调这个,要不是会出错的,我也不知道原因,试错试出来的。
回答时间:2017-7-21 10:29:23
我测试的用输入下拉,然后根据外部电路修改对应的引脚输入上啦还是下拉。我测试裸板在6ua左右,楼主还是要和硬件设计的一块去解决引脚的配置。唤醒后最好重新初始化一下系统时钟。
回答时间:2017-7-21 10:35:14
开启下面几个功能也会降低功耗
FLASH_SLEEPPowerDownCmd(ENABLE);
PWR_UltraLowPowerCmd(ENABLE);
伤花怒放2003 回答时间:2017-7-24 08:42:30
zhao.zhao 发表于 2017-7-20 19:51
只要引脚改改,其他的不要重新配置,我一直强调这个,要不是会出错的,我也不知道原因,试错试出来的。 ...

你好,我现在又碰到一个奇怪的事。我先除了使用RTC定是唤醒外,还需要外部中断来唤醒,现在碰到的问题是:进入STOP模式前除了外部中断的几个脚其他IO脚全配成模拟输入(中断的那几个脚是下降沿触发),这种情况下休眠后,外部中断触发也无法唤醒;如果如果IO状态休眠前不改动维持原状,外部中断可以唤醒。比较诡异的是,我现在外部中断几个引脚是在PB口上,如果休眠前只是把PA口设为模拟输入,PB口不改的话,还是无法唤醒。
不知道你有没有使用外部中断来唤醒过,我现在碰到的这种情况又会是什么原因?
zhao.zhao 回答时间:2017-7-24 09:28:19
我使用过三种方法唤醒, 1.RTC定时唤醒  2.外部中断,下降沿唤醒  3.还是外部中断,下降沿唤醒,同时使用,也没什么问题,一次成功的。方式就是你失败的那种。我使用HAL库的,找到库里提供的例程就成了。没那么多的问题
伤花怒放2003 回答时间:2017-7-24 10:10:46
zhao.zhao 发表于 2017-7-24 09:28
我使用过三种方法唤醒, 1.RTC定时唤醒  2.外部中断,下降沿唤醒  3.还是外部中断,下降沿唤醒,同时使用, ...

我也觉得我这次调休眠和唤醒特别不顺。你用外部中断唤醒的时候,在进休眠前这几个与外部中断有关的IO口是维持原有的设置状态吗?方便的话可否把外部中断唤醒的程序参考代码发我看下.
zhao.zhao 回答时间:2017-7-24 20:32:01
只要相对应的引脚设为下降沿中断,没用到的引脚设为模拟输入。
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个中断判断标识就可以恢复正常运行了
DOUBLE222222 回答时间:2017-9-29 09:21:23
晶振有影响

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版