打印
[STM32F1]

STM32F1各个工作状态下的工作电流

[复制链接]
222|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
慢醇|  楼主 | 2024-2-27 17:39 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
低功耗操作实验
文章非原创,从其他网站上摘录,如果侵犯到到,麻烦联系删除。

【实验目的】
测量 STM32 在各种状态下的功耗,包括在不同时钟频率下(32M、8M、1M、100K、10K)、不同振荡器(内部、外部)、不同模式(活动、睡眠、停机、待机)的电流消耗,弄清楚在不同低功耗模式下的唤醒方式。

【实验要求】
1.编程要求:利用 C 语言,调用 STM32 的库函数,完成对各种工作模式的操作。
2.实现功能:测试不同状态下功耗。
3.实验现象:用万用表测试电流消耗。
【硬件电路】
测试时电路连接如图 3-1 所示。

图 1 测试电路连接图


使用特权

评论回复
沙发
慢醇|  楼主 | 2024-2-27 17:40 | 只看该作者
【实验原理】
在系统或电源复位以后,微控制器处于运行状态。当 CPU 不需继续运行时, 可以利用多种低功耗模式来节省功耗,例如等待某个外部事件时。用户需要根据最低电源消耗、最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。
STM32F10xxx 有三种低功耗模式,每种模式的进入退出条件如图 2 所示。
●睡眠模式(Cortex-M3 内核停止,所有外设包括 Cortex-M3 核心的外设,如NVIC、系统时钟(SysTick)等仍在运行)
●停止模式(所有的时钟都已停止)
●待机模式(1.8V 电源关闭)
此外,在运行模式下,可以通过以下方式中的一种降低功耗:
●降低系统时钟
●关闭 APB 和 AHB 总线上未被使用的外设时钟。


图 2 各种模式的进入退出条件

使用特权

评论回复
板凳
慢醇|  楼主 | 2024-2-27 17:40 | 只看该作者
进入睡眠模式
通过执行 WFI 或 WFE 指令进入睡眠状态。根据 Cortex-M3 系统控制寄存器中的SLEEPONEXIT 位的值,有两种选项可用于选择睡眠模式进入机制:
●SLEEP-NOW:如果 SLEEPONEXIT 位被清除,当 WRI 或 WFE 被执行时,微控制器立即进入睡眠模式。
●SLEEP-ON-EXIT:如果 SLEEPONEXIT 位被置位,系统从最低优先级的中断处理程序中退出时,微控制器就立即进入睡眠模式。 在睡眠模式下,所有的 I/O 引脚都保持它们在运行模式时的状态。
退出睡眠模式
如果执行 WFI 指令进入睡眠模式,任意一个被嵌套向量中断控制器响应的外设中断都能将系统从睡眠模式唤醒。如果执行 WFE 指令进入睡眠模式,则一旦发生唤醒事件时,微处理器都将从睡眠模式退出。唤醒事件可以通过下述方式产生:
●在外设控制寄存器中使能一个中断,而不是在 NVIC(嵌套向量中断控制器) 中使能,并且在 Cortex-M3 系统控制寄存器中使能 SEVONPEND 位。当 MCU 从 WFE 中唤醒后,外设的中断挂起位和外设的 NVIC 中断通道挂起位(在 NVIC 中断清除挂起寄存器中)必须被清除。
●配置一个外部或内部的 EXIT 线为事件模式。当 MCU 从 WFE 中唤醒后,因为与事件线对应的挂起位未被设置,不必清除外设的中断挂起位或外设的 NVIC 中断通道挂起位。 该模式唤醒所需的时间最短,因为没有时间损失在中断的进入或退出上。

使用特权

评论回复
地板
慢醇|  楼主 | 2024-2-27 17:41 | 只看该作者
停止模式
停止模式是在 Cortex-M3 的深睡眠模式基础上结合了外设的时钟控制机制,在停止模式下电压调节器可运行在正常或低功耗模式。此时在 1.8V 供电区域的的所有时钟都被停止,PLL、HSI 和 HSE RC 振荡器的功能被禁止,SRAM 和寄存器内容被保留下来。 在停止模式下,所有的 I/O 引脚都保持它们在运行模式时的状态。关于如何进入停止模式,详见图 3。
电源控制寄存器(PWR_CR) 在停止模式下,通过设置 的 LPDS 位使内部调节器进入低功耗模式,能够降低更多的功耗。 如果正在进行闪存编程,直到对内存访问完成,系统才进入停止模式。 如果正在进行对 APB 的访问,直到对 APB 访问

完成,系统才进入停止模式。 可以通过对独立的控制位进行编程,可选择以下功能:
●独立看门狗(IWDG):可通过写入看门狗的键寄存器或硬件选择来启动 IWDG。一旦启动了独立看门狗,除了系统复位,它不能再被停止。
●实时时钟(RTC):通过备份域控制寄存器 (RCC_BDCR)的 RTCEN 位来设置。
●内部 RC 振荡器(LSI RC):通过控制/状态寄存器 (RCC_CSR)的 LSION 位来设置。
●外部 32.768kHz 振荡器(LSE):通过备份域控制寄存器 (RCC_BDCR)的 LSEON 位设置。
在停止模式下,如果在进入该模式前 ADC 和 DAC 没有被关闭,那么这些外设仍然消耗电流。通过设置寄存器 ADC_CR2 的 ADON 位和寄存器 DAC_CR 的 ENx 位为 0 可关闭这 2 个外设。
当一个中断或唤醒事件导致退出停止模式时,HSI RC 振荡器被选为系统时钟。 当电压调节器处于低功耗模式下,当系统从停止模式退出时,将会有一段额外的启动延时。如果在停止模式期间保持内部调节器开启,则退出启动时间会缩短,但相应的功耗会增加。

图 3 停机模式的进入退出条件

使用特权

评论回复
5
慢醇|  楼主 | 2024-2-27 17:41 | 只看该作者
待机模式
待机模式可实现系统的最低功耗。该模式是在 Cortex-M3 深睡眠模式时关闭电压调节器。整个 1.8V 供电区域被断电。PLL、HSI 和 HSE 振荡器也被断电。SRAM 和寄存器内容丢失。只有备份的寄存器和待机电路维持供电。
关于如何进入待机模式,详见图 4。 可以通过设置独立的控制位,选择以下待机模式的功能:
●独立看门狗(IWDG):可通过写入看门狗的键寄存器或硬件选择来启动 IWDG。一旦启动了独立看门狗,除了系统复位,它不能再被停止。
●实时时钟(RTC):通过备用区域控制寄存器(RCC_BDCR)的 RTCEN 位来设置。
●内部 RC 振荡器(LSI RC):通过控制/状态寄存器(RCC_CSR)的 LSION 位来设置。
●外部 32.768kHz 振荡器(LSE):通过备用区域控制寄存器(RCC_BDCR)的 LSEON位设置。

当一个外部复位(NRST 引脚)、IWDG 复位、WKUP 引脚上的上升沿或 RTC 闹钟事件的上升沿发生时,微控制器从待机模式退出。从待机唤醒后,除了 : 电源控制/状态寄存器(PWR_CSR),所有寄存器被复位。
从待机模式唤醒后的代码执行等同于复位后的执行(采样启动模式引脚、读取复位向量等)。电源控制/状态寄存器(PWR_CSR)将会指示内核由待机状态退出。待机模式下的输入/输出端口状态 在待机模式下,所有的 I/O 引脚处于高阻态, 除了以下的引脚:
●复位引脚(始终有效)
●当被设置为防侵入或校准输出时的 TAMPER 引脚
●被使能的唤醒引脚

图 4 待机模式的进入退出条件

使用特权

评论回复
6
慢醇|  楼主 | 2024-2-27 17:41 | 只看该作者
【实验步骤】
1. 学习 STM32 电源控制相关知识,熟悉所调用的库函数。2.搭建测试电路。 3.编写程序,测试电流消耗,对照数据手册,对没有达到的指标进行分析。
【程序代码】
#include "stm32f10x.h" #include "stm32_eval.h"

GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure;

void EXTI_Config_owl(void);
void RCC_Config_HSI_32M_owl(void); void RCC_Config_HSE_32M_owl(void); void TIM2_Base_Config_owl(void);
void TIM2_PWM_Config_owl(void);
void USART1_Config_owl(void);//配置 USART1 口
void RTC_Config_owl(void);//RTC 配置

int main(void)
{
RCC_Config_HSI_32M_owl();//配置内部时钟到 32M
// RCC_Config_HSE_32M_owl();//选择 HSE 倍频做为时钟

EXTI_Config_owl();        //对接收中断的初始化USART1_Config_owl();//配置 USART1 口
TIM2_Base_Config_owl();
RTC_Config_owl();        //对 RTC 配置

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);//时钟使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE);//时钟使能

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All; GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_OD        ; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFE); //进入停机模式
// PWR_EnterSTANDBYMode(); //进入待机模式

while (1)
{
}
}


void EXTI_Config_owl(void)
{
NVIC_InitTypeDef NVIC_InitStructure;//NVIC 配置结构体

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//中断时钟使能

//中断向量控制 reg 初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//对优先级的配置,还需要简单了解

//使能 1 中断
NVIC_InitStructure.NVIC_IRQChannel =        EXTI1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);

// 选 择 做 中 断 的 引 脚 A1 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);

//外中断初始化设置
EXTI_InitStructure.EXTI_Line = EXTI_Line1;//第 1 线EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能EXTI_Init(&EXTI_InitStructure);//操作

EXTI_GenerateSWInterrupt(EXTI_Line1);//类似于允许中断EXTI_ClearITPendingBit(EXTI_Line1);//退出之前一定要记得清标志位
}
//配置时钟使用 HSI,32M
void RCC_Config_HSI_32M_owl(void)
{
RCC_DeInit();//复位到初始值RCC_HSICmd(ENABLE);//使能 HSI
RCC_AdjustHSICalibrationValue(0x10);//校正值FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//使能预取指缓存区FLASH_SetLatency(FLASH_Latency_1);//设置 flash 操作等待RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择 PLL 作为系统时钟RCC_HCLKConfig(RCC_SYSCLK_Div1);//主时钟不分频RCC_PCLK1Config(RCC_HCLK_Div1);//APB1 由 AHB 不分频得到RCC_PCLK2Config(RCC_HCLK_Div1);//APB2 由 AHB 不分频得到RCC_ITConfig(RCC_IT_HSIRDY , ENABLE );//HSI 中断允许
//RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_Div1);//USB 时钟为系统不分频RCC_ADCCLKConfig(RCC_PCLK2_Div8);//AD 时钟为 AOB2 的 2 分频RCC_AHBPeriphClockCmd(RCC_AHBPeriph_SRAM        |        RCC_AHBPeriph_FLITF,
ENABLE);//使能 SRAM、FLITF 时钟
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_8);//PLL 时钟源及倍频因子设定
RCC_PLLCmd(ENABLE);//使能 PLL

while (RCC_GetSYSCLKSource() != 0x08)//检查时钟是否配置正确
{
}
}

//配置时钟使用 HSE,32M
void RCC_Config_HSE_32M_owl(void)
{
ErrorStatus HSEStartUpStatus;

RCC_DeInit();//复位到初始值RCC_HSEConfig(RCC_HSE_ON);;//使能 HSE
HSEStartUpStatus = RCC_WaitForHSEStartUp();//等待 HSE 准备好

if (HSEStartUpStatus == SUCCESS)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//使能预取指缓存区FLASH_SetLatency(FLASH_Latency_1);//设置 flash 操作等待RCC_HCLKConfig(RCC_SYSCLK_Div1);//主时钟不分频RCC_PCLK1Config(RCC_HCLK_Div2);//APB1 由 AHB2 分频得到RCC_PCLK2Config(RCC_HCLK_Div1);//APB2 由 AHB 不分频得到RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4);//PLL 时钟源及倍频因
子设定
RCC_PLLCmd(ENABLE);//使能 PLL

while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)//等待 PLL 启动
{
}

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择 PLL 作为系统时钟
//RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_Div1);//USB 时钟为系统不分频RCC_ADCCLKConfig(RCC_PCLK2_Div2);//AD 时钟为 AOB2 的 2 分频RCC_AHBPeriphClockCmd(RCC_AHBPeriph_SRAM        |        RCC_AHBPeriph_FLITF,
ENABLE);//使能 SRAM、FLITF 时钟
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
}

// 程序名 : void TIM2_Base_Config_owl(void)
//  作用 :        通用定时器 2 配置函数,配置定时器 2 工作在普通计时模式
// 输入参数:无
// 输出参数:无
//  说明:        配置定时器 2 工作在普通计时模式,定时器 UP 模式,使能 up 中断,
//
void TIM2_Base_Config_owl(void)
{

NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef        TIM_TimeBaseStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//中断时钟使能 为什么要使能这个时钟?

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);//中断向量在 flash 中

// 中 断 控 制 器 中 选 中 TIM2 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
//定时器基本配置
TIM_TimeBaseStructure.TIM_Period = 0x4000;//重载计数值TIM_TimeBaseStructure.TIM_Prescaler = TIM_PSCReloadMode_Update;//估计这个只是对
分频因子何时装载进行设置
//TIM_TimeBaseStructure.TIM_Prescaler = 0x0002; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;//还不清楚作用TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上模式

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//操作

TIM_PrescalerConfig(TIM2, 0x0000, TIM_PSCReloadMode_Immediate);//定时器使用的时钟的分频设置
TIM_ITConfig(TIM2,        TIM_IT_Update , ENABLE);//对定时器中哪个中断源进行设置。TIM_Cmd(TIM2, ENABLE);//定时器 2 允许工作
}

// 程序名 : void USART1_Config_owl(void)
//  作用 :        配置 USART1 口工作在普通异步传输模式
// 输入参数:无
// 输出参数:无
// 说明:
//
//


void USART1_Config_owl(void)
{
USART_InitTypeDef USART_InitStructure;//配置 USART 数据结构NVIC_InitTypeDef NVIC_InitStructure;//NVIC 配置结构体GPIO_InitTypeDef GPIO_InitStructure;//GPIO 配置结构体

//GPIO 配置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);//时钟使能
//TX  配置GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);
//RX 配置
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 ,ENABLE);//时钟使能

USART_InitStructure.USART_BaudRate=57600; //波特率USART_InitStructure.USART_WordLength=USART_WordLength_8b;//8 位数据USART_InitStructure.USART_StopBits=USART_StopBits_1;//1 个停止位USART_InitStructure.USART_Parity=USART_Parity_No;//无校验USART_InitStructure.USART_Mode=USART_Mode_Rx | USART_Mode_Tx; //模式

USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//
硬件流控制失能
USART_Init(USART1, &USART_InitStructure);//操作

//对 USART1 中断的配置,这是可选项,很多时候可以不使用中断
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//中断时钟使能 为什么要使能这个时钟?
//中断向量控制 reg 初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//对优先级的配置,还需要简单了解
//使能对 USART1 中断NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);

USART_ITConfig(USART1,        USART_IT_TC        | USART_IT_RXNE, ENABLE);//使能发

送完成中断和接收中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//使能接收中断
// USART_ITConfig(USART1, USART_IT_TC, ENABLE);//使能发送完成中断

USART_Cmd(USART1, ENABLE);
}


// 程序名 : void RTC_Config_owl(void)
//  作用 :        配置 RTC 和 BKP,RTC 开启秒中断。
// 输入参数:无
// 输出参数:无
// 说明:
//
//
void RTC_Config_owl(void)
{
NVIC_InitTypeDef NVIC_InitStructure;//NVIC 配置结构体
EXTI_InitTypeDef EXTI_InitStructure;

//对 RTC 中断的配置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//中断时钟使能
//中断向量控制 reg 初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//对优先级的配置,还需要简单了解
// NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;//RTC 中断NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;//闹钟中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);


//闹钟中断接到第 17 线,视为 17 线外引脚中断, EXTI_ClearITPendingBit(EXTI_Line17); EXTI_InitStructure.EXTI_Line = EXTI_Line17; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR , ENABLE);//电源管理部分时钟开启
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);//BKP 部分使能
PWR_BackupAccessCmd(ENABLE);//使能或者失能 RTC 和后备寄存器访问
//RCC_LSEConfig(RCC_LSE_ON);//使能 LSE RCC_LSICmd(ENABLE);//使能 LSI
//等待晶振启动(有内、外之分)
while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
{}
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);//设置时钟为内部低振RCC_RTCCLKCmd(ENABLE);
//若在读取 RTC 寄存器时,RTC 的 APB1 接口曾经处于禁止状态,
//则软件首先必须等待 RTC_CRL 寄存器中的 RSF 位(寄存器同步标志)被硬件置’1’。
RTC_WaitForSynchro();
RTC_WaitForLastTask();//等待最近一次对 RTC 寄存器的写操作完成
// RTC_ITConfig(RTC_IT_SEC);//使能秒中断RTC_ITConfig( RTC_IT_ALR, ENABLE);//使能闹钟中断RTC_WaitForLastTask();
RTC_SetPrescaler(32767); //分频系数RTC_WaitForLastTask(); RTC_SetCounter(0x0); //初始计数值RTC_WaitForLastTask(); RTC_SetAlarm(5);//闹钟变量RTC_WaitForLastTask();
}
闹钟中断服务函数

// 程序名 : void RTCAlarm_IRQHandler(void)
//  作用 :        本函数是闹钟中断处理函数
// 输入参数:无
// 输出参数:无
// 说明:
//
void RTCAlarm_IRQHandler(void)
{
//若在读取 RTC 寄存器时,RTC 的 APB1 接口曾经处于禁止状态,
//则软件首先必须等待 RTC_CRL 寄存器中的 RSF 位(寄存器同步标志)被硬件置’1’。
RTC_WaitForSynchro(); if(RTC_GetITStatus(RTC_IT_ALR) != RESET)
{

EXTI_ClearITPendingBit(EXTI_Line17);//清 17 线中断标志
//检查 Wake-Up 标志置位
if(PWR_GetFlagStatus(PWR_FLAG_WU) != RESET)
{

PWR_ClearFlag(PWR_FLAG_WU);//清标志
}
RTC_WaitForLastTask(); RTC_SetAlarm(RTC_GetCounter()+ 3);        //重设闹钟标志RTC_WaitForLastTask(); RTC_ClearITPendingBit(RTC_IT_ALR);//清闹钟标志位RTC_WaitForLastTask();
}
}

使用特权

评论回复
7
慢醇|  楼主 | 2024-2-27 17:42 | 只看该作者
【实验总结】
各种模式下,理论数据和实测数据如下表所示,对于理论值的详细描述见图5-图 9,其中图 5 是停机和待机模式下电流消耗,图 6 是活动模式下各个外设电
流消耗,图 7 是睡眠模式下不同时钟频率下电流消耗,图 8 是运行模式下不同时
钟频率下电流消耗,图 9 是从停机和待机模式下唤醒所需的时间。
由于从待机模式下唤醒时,系统唤醒后的代码执行等同于复位后的执行(采样启动模式引脚、读取复位向量等)。因为所有的寄存器都没有保存数据,所以需要重新初始化外设(中断、定时器、SPI 等等),所以实际从唤醒到系统实际开始正常工作的时间,从几百微秒到几十毫秒不等,取决于使用的外设数目和外部器件,本次试验用的代码初始化时间约 200uS。

使用特权

评论回复
8
慢醇|  楼主 | 2024-2-27 17:42 | 只看该作者



使用特权

评论回复
9
Henryko| | 2024-2-29 23:09 | 只看该作者
主频越低越省电是吧

使用特权

评论回复
10
问天少年| | 2024-3-11 13:39 | 只看该作者
低功耗一定要注意外围电路漏电

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

115

主题

1183

帖子

4

粉丝