低功耗特性对用电池供电的产品: 更小电池体积(降低了大小和成本) 延长电池寿命 电磁干扰更小,提高无线通信质量 电源设计更简单,无需过多考虑散热问题
电源供电区分为:
分为VDD供电区和后备供电区和1.8v供电区
主供电区是外面3.3v直接进来的正极3.3v供电
1.8v供电区是电压调节器把3.3转成1.8v供电
后备供电区是若有主电源则主电源供电,若无主电源则有VBAT备用电源供电
F7 F4是1.2v供电区而不是1.8v
这跟工艺硬件有关,什么样的电压能让主频稳定且达到168M或其他时钟
低功耗模式特点:
相关hal库函数
注:低功耗模式下一定要把systick给关了防止systick把芯片唤醒
void pwr_enter_sleep(void)
{
HAL_SuspendTick(); /* 暂停滴答时钟,防止通过滴答时钟中断唤醒 */
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); /* 进入睡眠模式 */
}
void pwr_enter_stop(void)
{
sys_stm32_clock_init(200, 2, 2, 4); /* 设置时钟,400Mhz,降频 */
/* 当SVOS3进入停止模式时,设置稳压器为低功耗模式,等待中断唤醒 */
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
}
//系统进入待机模式
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);
}