单片机型号: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