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

2023-11-17

低功耗操作实验

文章非原创,从其他网站上摘录,如果侵犯到到,麻烦联系删除。

【实验目的】

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

【实验要求】

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

在这里插入图片描述
图 1 测试电路连接图

【实验原理】

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

进入睡眠模式

通过执行 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 中断通道挂起位。 该模式唤醒所需的时间最短,因为没有时间损失在中断的进入或退出上。

停止模式

停止模式是在 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 停机模式的进入退出条件

待机模式

待机模式可实现系统的最低功耗。该模式是在 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 待机模式的进入退出条件

【实验步骤】

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();
}
}

【实验总结】

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F1各个工作状态下的工作电流 的相关文章

  • 134-基于stm32单片机矿井瓦斯天然气浓度温湿度检测自动通风系统Proteus仿真+源程序...

    资料编号 134 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 ds1302时钟 DHT11温湿度 电机 蜂鸣器 制作一个基于stm32单片机矿井瓦斯天然气浓度温湿度检测自动通风系统Proteus仿真 2 通过DH
  • 133-基于stm32单片机停车场车位管理系统Proteus仿真+源程序

    资料编号 133 一 功能介绍 1 采用stm32单片机 4位数码管 独立按键 制作一个基于stm32单片机停车场车位管理系统Proteus仿真 2 通过按键进行模拟车辆进出 并且通过程序计算出当前的剩余车位数量 3 将剩余的车位数量显示到
  • java——网络编程

    1 网络编程 理解 1 网络编程 用Java语言实现计算机间数据的信息传递和资源共享 2 网络编程模型 3 网络编程的三要素 A IP地址 a 点分十进制 b IP地址的组成 c IP地址的分类 d dos命令 e InetAddress
  • 548、基于51单片机的比赛计分仿真设计(简易,LCD1602,独立按键)

    毕设帮助 开题指导 技术解答 有偿 见文末 目录 一 设计功能 二 proteus仿真 三 原理图 四 程序源码 五 资料包括 一 设计功能 二 proteus仿真 三 原理图 四 程序源码 五 资料包括
  • STM32用一个定时器执行多任务写法

    文章目录 main c include stm32f4xx h uint32 t Power check times 电量检测周期 uint32 t RFID Init Check times RFID检测周期 int main Timer
  • 计算机基础:一颗芯片是怎样诞生的?

    一颗芯片是怎样诞生的 芯片属于半导体 半导体是介于导体和绝缘体之间的一类物质 元素周期表中硅 锗 硒 硼的单质都属于半导体 这些单质通过掺杂其他元素生成的一些化合物 也属于半导体的范畴 这些化合物在常温下可激发载流子的能力大增 导电能力大大
  • linux应用程序直接return与exit的区别

    在Linux应用程序中 可以使用 return 语句直接从 main 函数返回 这将导致程序终止并返回给操作系统 然而 有时候使用 exit 函数比直接使用 return 语句更有优势 以下是一些原因 清理资源 exit 函数可以确保在程序
  • 关于DC电源模块有哪些常见的输入和输出参数?

    关于DC电源模块有哪些常见的输入和输出参数 BOSHIDA DC电源模块是一种用于将交流电转换为直流电的设备 广泛应用于电子设备 通信设备 工业控制 仪器仪表等各个领域 在选择和使用DC电源模块时 了解其常见的输入和输出参数是很重要的 输入
  • STM32F103概要

    The STM32F103x4 STM32F103x6 STM32F103xC STM32F103xD and STM32F103xE are a drop in replacement for STM32F103x8 B medium d
  • [APM32F4]基于APM32F411控制的一个软开关电路设计分享

    1 前言 说明 本文介绍的软开关电路 并不是 开关电源 里面的软开关概念 而是系统供电的开关 结合MCU等控制芯片 控制系统供电的开启或关断 在某些电子产品的场合 我们经常会需要用到按键长按进行开机 然后按键长按进行关机 或者按键长按之后有
  • MCU平台下确定栈空间大小的方法

    本文介绍MCU平台下确定栈空间大小的方法 通常使用IDE开发MCU程序在生成Image文件时 Image文件被划分为代码区 数据区 BSS区 堆区 栈区 其中 代码区 数据区 BSS区空间大小由编译器最终决定 对于MCU 堆区一般设置为0
  • I.MX RT1170双核学习(4):FreeRTOS之消息缓冲区(Message Buffer)双核通信详解

    对于RT1170来说 它有两个内核 那两个内核如何通信呢 我们可以通过 MU消息单元详解 来实现这些功能 但它一次只能传输32位的数据 我们知道CM7和CM4有一些公共的内存可以访问 那我们可不可以借助这些公共的内存来实现数据的交互呢 答案
  • 纯国产DSP,QX320F28335,自研内核指令集,主频150MHz,自研工具链,硬件兼容TMS320F28335

    32位单核CPU 主频150MHz flash 1M SRAM 500KB 单精度浮点运算FPU 3个4M精度12位的ADC 12个ePWM 6个HRPWM 150ps
  • SH367309芯片

    博主 主要纪录自己常用的几种模式 以及自己觉得需要注意的点 具体的请看数据手册 且大部分都是从数据手册中截取 1 烧写模式 VPRO管脚外接EEPROM烧写电压V PRO 且延时10mS SH367309进入烧写模式 关闭充放电MOSFET
  • 串口流控(CTS/RTS)使用详解

    1 流控概念 在两个设备正常通信时 由于处理速度不同 就存在这样一个问题 有的快 有的慢 在某些情况下 就可能导致丢失数据的情况 如台式机与单片机之间的通讯 接收端数据缓冲区已满 则此时继续发送来的数据就会丢失 流控制能解决这个问题 当接收
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • Mockito3.x详解

    目录 Mockito 1 简单示例 2 打桩测试 3 参数匹配器 4 调用次数验证 5 通过打桩为无返回值函数抛出异常 6 验证调用顺序 7 验证从未发生过的交互
  • 太阳诱电 | 电容器为什么会发热?什么是纹波电流

    电容器中存在寄生于电极和电介质的电阻成分 当纹波电流等交流电流通过电容器时 电阻的成分会产生热量 为了抑制发热 选择ESR较低的电容器非常重要 陶瓷电容器在电容器中ESR较低 非常适合抑制发热 电容器中的纹波电流主要是指电源电路中由于IC的
  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型

随机推荐

  • 用SpringBoot开发工商银行平台公众号及小程序埋名聚合支付(微信小程序支付)

    因为项目需求的原因 需要开发小程序支付 采取的支付流程是用工商银行 以下简称工行 的埋名聚合支付 接口 进行小程序支付开发 工行 开发指南业务申请 https open icbc com cn icbc apip docs intro ht
  • 阿里云配置MINIO图床

    阿里云 ECS服务器 CENTOS7系统部署MINIO图床 1 下载MINIO的二进制文件 注 阿里云ECS网速过慢 但可以接受 wget https dl minio io server minio release linux amd64
  • AES加密,128-192-256,方案一

    AES加密 直接粘贴代码 异常什么的自己要处理 做个总结记录 package com xiao aes util import java io UnsupportedEncodingException import java securit
  • jmeter压测报错socket closed解决方法

    socket closed 问题原因 在JMeter下 发送http 请求时 一般都是默认选择了use keepAlive 这个是连接协议 JMeter坑就在这里 默认勾选了这个 如果不勾选的话 也不会保存 但其配置JMeter prope
  • 6个Python代码简化方法

    ython开发代码简化除了采用规范化的编程规则之外 代码编写的逻辑性和对内置规则的掌握也对其有一定的影响 以下是Python3支持的用法 合理的利用可以极大的简化代码的书写复杂度 列表推导式 对于一组列表 如果想让其所有元素翻倍 很多人都会
  • A notion of time

    1 simulation kernel用sc time数据类型来跟踪仿真时间 指定delay和timeouts sc time是用一个64bit的无符号整型数来表示 SC SEC seconds 10 0 秒 SC MS milliseco
  • 接口测试:postman发送POST请求

    Postman发送POST请求 postman发送POST请求 示例 微信公众平台创建用户标签接口 业务操作如下 1 打开微信公众平台 微信扫码登录 2 打开微信开放文档 找到用户管理 用户标签管理的接口信息 3 打开postman 新建一
  • 谷歌Chrome浏览器安装插件Hackerbar

    谷歌Chrome浏览器安装插件Hackerbar 因为google浏览器的应用市场 https chrome google com webstore category extensions 在国内无法访问 所以无法在线安装插件 这里提供开发
  • 刷脸和无感支付是社会科学发展的产物和动力

    手机支付不应该多过 而且有自动与支付余额联机 刷手机才是赚钱的出路 对比来看 手机支付操作简单但基础好 有相当多用户加入的话 就没有任何风险了 自动与支付余额联机有效 而对于支付余额联机更有效 但比安全性较低 不利于用户操作 而对于与银行合
  • python打包whl文件

    应用场景 在python的使用过程中 当遇到通过pip无法安装包 可以通过去Python安装包大全中 whl包下载 下载 whl 包来安装解决问题 也可以在别处打包成 whl 文件 拷贝过来运行 介绍 whl 文件是以 wheel 格式保存
  • PySerial:Python串口通信库的详细介绍、安装及使用方法攻略

    PySerial Python串口通信库的详细介绍 安装及使用方法攻略 一 PySerial 简介 PySerial 是 Python 的一个串口通信库 支持不同平台下的串口操作 在 Python 应用中 使用 PySerial 可以非常方
  • 《Programming in Lua 3》读书笔记(七)

    Compilation Executioin and Errors Lua的assert函数 assert v mess 相当于C的断言 当v为nil或者false将触发错误 mess为发生错误时返回的信息 dofile函数不仅会加载chu
  • 蓝桥杯中的阶乘(求1000的阶乘)

    首先这个题 它是求1000的阶乘 他最后的值太大了 以至于不能用int long long int 来求 那要怎求呢 那肯定是用最简单的数组来求鸭 用数组来代表它的每一个位 include
  • 如何判断链表有环

    如何判断单链表是否存在环 有一个单向链表 链表当中有可能出现 环 就像题图这样 如何用程序判断出这个链表是有环链表 不允许修改链表结构 时间复杂度O n 空间复杂度O 1 方法一 穷举遍历 方法一 首先从头节点开始 依次遍历单链表的每一个节
  • 网关模式/网桥模式/旁路模式的区别

    网关模式 网桥模式 旁路模式的区别如下 EG设备有三种工作模式 网关模式 网桥模式和旁路模式 比较常用的是网关模式和桥模 式 1 网关模式是把设备当作网络出口 支持NAT和路由选路下报文转发的部署方式 2 桥模式是把设备作为桥接 串接在内网
  • 【SqlServer】如何把本地SqlServer数据库部署到远程服务器上

    这里笔者使用的使用SqlServer2012 本机和远程环境均为Win7 1 选中需要部署的数据库 右击 任务 分离 选中删除连接 2 现在在左侧的表中就看不见刚才那个数据了 3 在本地找到分离出来的数据库的位置 该位置就是读者建立数据库的
  • 厌烦了Ctrl+CV ?试试用node自动生成重复代码文件

    前言 相信在我们日常遇到的项目中 无论是在前端网站还是后台管理系统中都会有功能类似的页面 我们在开发这些功能类似的页面的时候 为了提高效率 一般都会运用我们的CV大法 但是当我们CV久了之后 会不会觉得这样的开发方式有些许枯燥 我们能不能通
  • 孙子算经 之 物不知数(韩信点兵)

    孙子算经 作者不可考 成书于四 五世纪南北朝时期 传本分三卷 它是算经十书之一 中国古代最重要的数学著作之一 其下卷26题 物不知数 为其最重要的成就之一 今有物 不知其数 三三数之 剩二 五五数之 剩三 七七数之 剩二 问 物几 何 答曰
  • 解决下载文件时报:Could not find acceptable representation

    今天在写一个文件打包下载的接口的时候一直报错误 文件是可以下载的但是后台打印的日志信息出现 Could not find acceptable representation错误 我之前百度给我的结果是由于我的返回值是json字符串 而由于
  • STM32F1各个工作状态下的工作电流

    低功耗操作实验 文章非原创 从其他网站上摘录 如果侵犯到到 麻烦联系删除 实验目的 测量 STM32 在各种状态下的功耗 包括在不同时钟频率下 32M 8M 1M 100K 10K 不同振荡器 内部 外部 不同模式 活动 睡眠 停机 待机