HAL库源码移植与使用之低功耗模式

低功耗特性对用电池供电的产品: 更小电池体积(降低了大小和成本) 延长电池寿命 电磁干扰更小,提高无线通信质量 电源设计更简单,无需过多考虑散热问题

电源供电区分为:

分为VDD供电区和后备供电区和1.8v供电区

主供电区是外面3.3v直接进来的正极3.3v供电

1.8v供电区是电压调节器把3.3转成1.8v供电

后备供电区是若有主电源则主电源供电,若无主电源则有VBAT备用电源供电

F7 F4是1.2v供电区而不是1.8v

这跟工艺硬件有关,什么样的电压能让主频稳定且达到168M或其他时钟

低功耗模式特点:

相关hal库函数

注:低功耗模式下一定要把systick给关了防止systick把芯片唤醒

cpp 复制代码
void pwr_enter_sleep(void)
{
    HAL_SuspendTick();  /* 暂停滴答时钟,防止通过滴答时钟中断唤醒 */

    HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); /* 进入睡眠模式 */
}
cs 复制代码
void pwr_enter_stop(void)
{
    sys_stm32_clock_init(200, 2, 2, 4); /* 设置时钟,400Mhz,降频 */

    /* 当SVOS3进入停止模式时,设置稳压器为低功耗模式,等待中断唤醒 */
    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
}
cs 复制代码
//系统进入待机模式
void Sys_Enter_Standby(void)
{
    __HAL_RCC_APB2_FORCE_RESET();       //复位所有IO口 
   	__HAL_RCC_PWR_CLK_ENABLE();         //使能PWR时钟
			  	
    __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);                  //清除Wake_UP标志
    HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);           //设置WKUP用于唤醒
    HAL_PWR_EnterSTANDBYMode();                         //进入待机模式     
}
 
     
//检测WKUP脚的信号
//返回值1:连续按下3s以上
//      0:错误的触发	
u8 Check_WKUP(void) 
{
	u8 t=0;	//记录按下的时间
	LED0=0; //亮灯DS0 
	while(1)
	{
		if(WKUP_KD)
		{
			t++;			//已经按下了 
			delay_ms(30);
			if(t>=100)		//按下超过3秒钟
			{
				LED0=0;	 	//点亮DS0 
				return 1; 	//按下3s以上了
			}
		}else 
		{ 
			LED0=1;
			return 0; //按下不足3秒
		}
	}
}  

//外部中断线0中断服务函数
void EXTI0_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}

//中断线0中断处理过程
//此函数会被HAL_GPIO_EXTI_IRQHandler()调用
//GPIO_Pin:引脚
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin==GPIO_PIN_0)//PA0
    {
        if(Check_WKUP())//关机
        {
            Sys_Enter_Standby();//进入待机模式
        }
    }    
}

//PA0 WKUP唤醒初始化
void WKUP_Init(void)
{
    GPIO_InitTypeDef GPIO_Initure;
    __HAL_RCC_GPIOA_CLK_ENABLE();			//开启GPIOA时钟
	
    GPIO_Initure.Pin=GPIO_PIN_0;            //PA0
    GPIO_Initure.Mode=GPIO_MODE_IT_RISING;  //中断,上升沿
    GPIO_Initure.Pull=GPIO_PULLDOWN;        //下拉
    GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//快速
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);
    
    //检查是否是正常开机
    if(Check_WKUP()==0)
    {
        Sys_Enter_Standby();//不是开机,进入待机模式
    }

    HAL_NVIC_SetPriority(EXTI0_IRQn,0x02,0x02);//抢占优先级2,子优先级2
    HAL_NVIC_EnableIRQ(EXTI0_IRQn);
}
相关推荐
美好的事情总会发生1 小时前
高速PCB设计中圆弧布线是否必要
嵌入式硬件·硬件工程·智能硬件
君鼎4 小时前
stm32——UART和USART
stm32·单片机
htt7894 小时前
[mcu]系统频率
单片机·嵌入式硬件
赵谨言4 小时前
基于单片机的FFT的频谱分析仪设计
经验分享·单片机·毕业设计
计蒙不吃鱼6 小时前
星闪开发之Server-Client 指令交互控制OLED灯案例
嵌入式硬件·物联网·iot·oled·星闪·星闪开发
似是燕归来6 小时前
STM32 HAL库函数学习 CRC篇
stm32·嵌入式硬件·学习
LS_learner7 小时前
树莓派上遇到插入耳机后显示“无输入设备”问题
嵌入式硬件
电鱼智能的电小鱼7 小时前
无人机巡检智能边缘计算终端技术方案‌‌——基于EFISH-SCB-RK3588工控机/SAIL-RK3588核心板的国产化替代方案‌
网络·人工智能·嵌入式硬件·算法·机器人·无人机·边缘计算
m0_748250748 小时前
STM32上部署AI的两个实用软件——Nanoedge AI Studio和STM32Cube AI
人工智能·stm32·嵌入式硬件
SY师弟10 小时前
51单片机基础部分——数码管显示
单片机·嵌入式硬件·51单片机