STM32开发笔记46:STM32F0低功耗设计

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qingwufeiyang12346/article/details/84494313

单片机型号:STM32F070F6P6


项目中需要使单片机STM32F070F6P6进入低功耗模式,本文记录整个过程。

1、STM32F070的低功耗模式:

2、低功耗模式描述,在项目中希望外部中断予以唤醒,所以三种低功耗模式,都可以使用。

3、进入Stop模式的代码如下,实际测得进入Stop模式后,8.0uA。在这里需要注意的是,我选用的单片机STM32F070F6P6,仅有端口A、端口B和端口F。我使用参考例程,没有注意里面的具体写法,增加了端口C和端口D,则一直进入不了Stop模式,网上说需要停止SysTick,这些都是不正确的。只有进入Sleep模式,才需停止SysTick,在Stop模式中,不需事先关闭SysTick。程序开始将所有的引脚都设置为GPIO_MODE_ANALOG模式,以节省功耗;后续关闭GPIO时钟,进一步节省功耗;然后调用SetStopModeAwakenPinCallback回调函数,设置外部中断引脚,由于在设置外部中断引脚时,需打开相应的GPIO时钟,在这里为了程序的书写方便,没有关闭GPIO时钟,测试只差0.1uA。

void CTarget::EnterStopMode(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
	
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_GPIOF_CLK_ENABLE();

    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Pin = GPIO_PIN_All;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

//  __HAL_RCC_GPIOA_CLK_DISABLE();
//  __HAL_RCC_GPIOB_CLK_DISABLE();
//  __HAL_RCC_GPIOF_CLK_DISABLE();
	
    SetStopModeAwakenPinCallback();

    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
}

4、SetStopModeAwakenPinCallback的定义如下,可以看到只是一个空函数,实际结果在main.cpp完成。

__weak void SetStopModeAwakenPinCallback(void)
{
	
}

5、下面是在main.cpp中的SetStopModeAwakenPinCallback函数,其功能是将相应的IO引脚设置为外部中断引脚,传递的具体参数,我们参看STM32CubeMX生成的例程就可以了。

void SetStopModeAwakenPinCallback(void)
{
	Target.HAL.LC.SetExternalInterrupt(EXTI0_1_IRQn);
}

6、为了使外部中断生效,还需设置相应的中断处理函数,在stm32f0xx_it.h中加入中断服务处理函数

#ifndef __STM32F0xx_IT_H
#define __STM32F0xx_IT_H

#ifdef __cplusplus
 extern "C" {
#endif 

/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx_hal.h"
#include "main.h"
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */

void NMI_Handler(void);
void HardFault_Handler(void);
void SVC_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);
void TIM16_IRQHandler(void);
void USART1_IRQHandler(void);
void USART2_IRQHandler(void);
void TIM1_BRK_UP_TRG_COM_IRQHandler(void);
void EXTI0_1_IRQHandler(void);

#ifdef __cplusplus
}
#endif

#endif /* __STM32F0xx_IT_H */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

7、在main.cpp中,完成中断服务处理函数的实现。

void EXTI0_1_IRQHandler(void)
{
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}

8、上述设置完成后,就可以在main函数中进行测试了,代码如下,程序很简单,上电后L2闪10次,然后L1闪10次,接着进入Stop模式,当外部唤醒后,程序复位。

for (i = 0; i < 10; i++)
{
    Target.HAL.L2.Turn();
    Target.Delayms(500, FALSE);
}
		
for (i = 0; i < 10; i++)
{
    Target.HAL.L1.Turn();
    Target.Delayms(500, FALSE);
}
		
Target.EnterStopMode();

Target.Restart();

原创性文章,转载请注明出处      

CSDN:http://blog.csdn.net/qingwufeiyang12346

猜你喜欢

转载自blog.csdn.net/qingwufeiyang12346/article/details/84494313