`
ydbc
  • 浏览: 737919 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

STM32待机模式唤醒测试以及独立看门狗测试

 
阅读更多

STM32待机模式唤醒测试以及独立看门狗测试

本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.

环境:

主机:WIN7

开发环境:MDK4.23

MCU:STM32F103CBT6


说明:

在上篇文章中http://blog.csdn.net/jdh99/article/details/7369844,进行了一些STM32待机模式的测试.其中关于如何在再次启动时判断是否是待机模式没有进行测试.另外上篇文章有个问题,闹钟中断在待机模式下是进入不了的.

本文进行了独立看门狗IWDG测试,以及待机模式更详细的测试.

STM32中,复位分为3种:

1.系统复位:外部复位,WWDG,IWDG,SW复位,低功耗管理复位.除复位标志寄存器RCC_CSR不被复位,全部都被复位

2.电源复位:上电/掉电复位,从待机模式复位.上电/掉电复位除备份域外寄存器全部复位.待机复位不会复位备份域寄存器以及PWR_CSR寄存器.

3.备份域复位.

寄存器说明:

由图可以看出,可以通过WUF位来判断是否由待机模式唤醒.

RCC_CSR寄存器:

由图可以看出,RCC_CSR寄存器的IWDGRSTF位可以指示是否发生独立看门狗复位.

因为在看门狗复位时如果系统不处在待机模式,PWR_CSR寄存器也会被复位,所以WUF位也可以指示是否发生独立看门狗复位.

源代码:

独立看门狗复位测试:

//检查唤醒标志是否设置
if (PWR_GetFlagStatus(PWR_FLAG_WU) == RESET)
{
	//首次启动,或者独立看门狗复位 
	//初始化备份寄存器
	//BKP_DeInit();

	//RTC功能开启
	//使能外部晶振
	RCC_LSEConfig(RCC_LSE_ON);
	//等待外部晶振准备好
	while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);

	//设置RTC时钟为外部晶振
	RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

	//使能RTC时钟
	RCC_RTCCLKCmd(ENABLE);
	//等待RTC_CTL寄存器中的RSF位(寄存器同步标志)被硬件置1
	RTC_WaitForSynchro();
	RTC_WaitForLastTask();  

	//使能闹钟中断   
	RTC_ITConfig(RTC_IT_ALR, ENABLE);  
	RTC_WaitForLastTask();  

	//分频系数为1,即最小时间单位1/2^15 = 30.5us
	RTC_SetPrescaler(RTC_PRESCALE);  
	RTC_WaitForLastTask();

	//启动独立看门狗
	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); 					//访问之前要首先使能寄存器写
	IWDG_SetPrescaler(IWDG_Prescaler_64);							//64分频 一个周期1.6ms
	IWDG_SetReload(1250);											//最长12位 [0,4096] 1250*1.6 = 2s
	IWDG_ReloadCounter();											//喂狗
	//使能开门狗
	IWDG_Enable();	
	
	if (BKP_ReadBackupRegister(BKP_DR6) == 0xabcd)
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_11) ;
		BKP_WriteBackupRegister(BKP_DR6,0);
	}
	else
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_11) ;
		BKP_WriteBackupRegister(BKP_DR6,0xabcd);
	}											
}
else
{	
	//从待机模式中退出	
	//清除唤醒标志
	RCC_ClearFlag(); 

	if (BKP_ReadBackupRegister(BKP_DR7) == 0xabcd)
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_8) ;
		BKP_WriteBackupRegister(BKP_DR7,0);
	}
	else
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_8) ;
		BKP_WriteBackupRegister(BKP_DR7,0xabcd);
	}
}
while (1);


测试结果PA11引脚所连的LED不断闪烁,PA8所连的LED常亮,这说明不断进入看门狗复位.

待机模式RTC闹钟唤醒测试:

//检查唤醒标志是否设置
if (PWR_GetFlagStatus(PWR_FLAG_WU) == RESET)
{
	//首次启动,或者独立看门狗复位 
	//初始化备份寄存器
	//BKP_DeInit();

	//RTC功能开启
	//使能外部晶振
	RCC_LSEConfig(RCC_LSE_ON);
	//等待外部晶振准备好
	while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);

	//设置RTC时钟为外部晶振
	RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

	//使能RTC时钟
	RCC_RTCCLKCmd(ENABLE);
	//等待RTC_CTL寄存器中的RSF位(寄存器同步标志)被硬件置1
	RTC_WaitForSynchro();
	RTC_WaitForLastTask();  

	//使能闹钟中断   
	RTC_ITConfig(RTC_IT_ALR, ENABLE);  
	RTC_WaitForLastTask();  

	//分频系数为1,即最小时间单位1/2^15 = 30.5us
	RTC_SetPrescaler(RTC_PRESCALE);  
	RTC_WaitForLastTask();

	//启动独立看门狗
	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); 					//访问之前要首先使能寄存器写
	IWDG_SetPrescaler(IWDG_Prescaler_64);							//64分频 一个周期1.6ms
	IWDG_SetReload(1250);											//最长12位 [0,4096] 1250*1.6 = 2s
	IWDG_ReloadCounter();											//喂狗
	//使能开门狗
	//IWDG_Enable();	
	
	if (BKP_ReadBackupRegister(BKP_DR6) == 0xabcd)
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_11) ;
		BKP_WriteBackupRegister(BKP_DR6,0);
	}
	else
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_11) ;
		BKP_WriteBackupRegister(BKP_DR6,0xabcd);
	}											
}
else
{	
	//从待机模式中退出	
	//清除唤醒标志
	RCC_ClearFlag(); 

	if (BKP_ReadBackupRegister(BKP_DR7) == 0xabcd)
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_8) ;
		BKP_WriteBackupRegister(BKP_DR7,0);
	}
	else
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_8) ;
		BKP_WriteBackupRegister(BKP_DR7,0xabcd);
	}
}
//延时1s
for (i = 0;i < 100;i++)
{
 	_delay_ms(10);
}
//打开待机模式,1s后唤醒
open_standy_mode(30000);

每次刚上电所有LED会亮,进入待机模式则全部灭.测试结果PA8引脚所连的LED会亮1s进入灭进入待机模式,下次则常灭进入待机模式.PA11所连的LED随着低功耗进入正常亮灭,这说明不断发生闹钟唤醒(看门狗已关).

待机模式IWDG唤醒测试:

//检查唤醒标志是否设置
if (PWR_GetFlagStatus(PWR_FLAG_WU) == RESET)
{
	//首次启动,或者独立看门狗复位 
	//初始化备份寄存器
	//BKP_DeInit();

	//RTC功能开启
	//使能外部晶振
	RCC_LSEConfig(RCC_LSE_ON);
	//等待外部晶振准备好
	while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);

	//设置RTC时钟为外部晶振
	RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

	//使能RTC时钟
	RCC_RTCCLKCmd(ENABLE);
	//等待RTC_CTL寄存器中的RSF位(寄存器同步标志)被硬件置1
	RTC_WaitForSynchro();
	RTC_WaitForLastTask();  

	//使能闹钟中断   
	RTC_ITConfig(RTC_IT_ALR, ENABLE);  
	RTC_WaitForLastTask();  

	//分频系数为1,即最小时间单位1/2^15 = 30.5us
	RTC_SetPrescaler(RTC_PRESCALE);  
	RTC_WaitForLastTask();

	//启动独立看门狗
	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); 					//访问之前要首先使能寄存器写
	IWDG_SetPrescaler(IWDG_Prescaler_64);							//64分频 一个周期1.6ms
	IWDG_SetReload(1250);											//最长12位 [0,4096] 1250*1.6 = 2s
	IWDG_ReloadCounter();											//喂狗
	//使能开门狗
	IWDG_Enable();	
	
	if (BKP_ReadBackupRegister(BKP_DR6) == 0xabcd)
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_11) ;
		BKP_WriteBackupRegister(BKP_DR6,0);
	}
	else
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_11) ;
		BKP_WriteBackupRegister(BKP_DR6,0xabcd);
	}											
}
else
{	
	//从待机模式中退出	
	//清除唤醒标志
	RCC_ClearFlag(); 

	if (BKP_ReadBackupRegister(BKP_DR7) == 0xabcd)
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_8) ;
		BKP_WriteBackupRegister(BKP_DR7,0);
	}
	else
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_8) ;
		BKP_WriteBackupRegister(BKP_DR7,0xabcd);
	}
}

//延时1s
for (i = 0;i < 100;i++)
{
	_delay_ms(10);
}
	
//打开待机模式,2s后唤醒
open_standy_mode(60000);

每次刚上电所有LED会亮,进入待机模式则全部灭.测试结果PA11引脚所连的LED会亮1s进入灭进入待机模式,下次则常灭进入待机模式.PA8所连的LED随着低功耗进入正常亮灭,而且待机模式是待机2s加延时1s应该是3s唤醒,LED闪烁频率2s左右说明被提前唤醒.这说明不断发生看门狗唤醒.

完整的测试程序:判断出首次启动程序,单片机处于正常状态时看门狗复位,单片机处于待机模式下被闹钟唤醒/看门狗唤醒.

注意:每次看门狗复位都要被重新配置启动

//检查是否正常状态发生看门狗复位
if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET)
{
	//清楚标志位
	RCC_ClearFlag();

	//RTC功能开启
	//使能外部晶振
	RCC_LSEConfig(RCC_LSE_ON);
	//等待外部晶振准备好
	while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);

	//设置RTC时钟为外部晶振
	RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

	//使能RTC时钟
	RCC_RTCCLKCmd(ENABLE);
	//等待RTC_CTL寄存器中的RSF位(寄存器同步标志)被硬件置1
	RTC_WaitForSynchro();
	RTC_WaitForLastTask();  

	//使能闹钟中断   
	RTC_ITConfig(RTC_IT_ALR, ENABLE);  
	RTC_WaitForLastTask();  

	//分频系数为1,即最小时间单位1/2^15 = 30.5us
	RTC_SetPrescaler(RTC_PRESCALE);  
	RTC_WaitForLastTask();

	//启动独立看门狗
	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); 					//访问之前要首先使能寄存器写
	IWDG_SetPrescaler(IWDG_Prescaler_64);							//64分频 一个周期1.6ms
	IWDG_SetReload(1250);											//最长12位 [0,4096] 1250*1.6 = 2s
	IWDG_ReloadCounter();											//喂狗
	//使能开门狗
	IWDG_Enable();

	if (BKP_ReadBackupRegister(BKP_DR5) == 0xabcd)
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_12) ;
		BKP_WriteBackupRegister(BKP_DR5,0);
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_12) ;
		BKP_WriteBackupRegister(BKP_DR5,0xabcd);
	}	
}
else
{
	//检查唤醒标志是否设置,判断是否首次启动
	if (PWR_GetFlagStatus(PWR_FLAG_WU) == RESET)
	{
		//首次启动
		//初始化备份寄存器
		//BKP_DeInit();

		//RTC功能开启
		//使能外部晶振
		RCC_LSEConfig(RCC_LSE_ON);
		//等待外部晶振准备好
		while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
	
		//设置RTC时钟为外部晶振
		RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
	
		//使能RTC时钟
		RCC_RTCCLKCmd(ENABLE);
		//等待RTC_CTL寄存器中的RSF位(寄存器同步标志)被硬件置1
		RTC_WaitForSynchro();
		RTC_WaitForLastTask();  

		//使能闹钟中断   
		RTC_ITConfig(RTC_IT_ALR, ENABLE);  
		RTC_WaitForLastTask();  

		//分频系数为1,即最小时间单位1/2^15 = 30.5us
		RTC_SetPrescaler(RTC_PRESCALE);  
		RTC_WaitForLastTask();

		//启动独立看门狗
		IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); 					//访问之前要首先使能寄存器写
		IWDG_SetPrescaler(IWDG_Prescaler_64);							//64分频 一个周期1.6ms
		IWDG_SetReload(1250);											//最长12位 [0,4096] 1250*1.6 = 2s
		IWDG_ReloadCounter();											//喂狗
		//使能开门狗
		IWDG_Enable();	
		
		if (BKP_ReadBackupRegister(BKP_DR6) == 0xabcd)
		{
			GPIO_ResetBits(GPIOA, GPIO_Pin_11) ;
			BKP_WriteBackupRegister(BKP_DR6,0);
		}
		else
		{
			GPIO_SetBits(GPIOA,GPIO_Pin_11) ;
			BKP_WriteBackupRegister(BKP_DR6,0xabcd);
		}											
	}
	else
	{	
		//从待机模式中退出,有闹钟唤醒或者看门狗唤醒	
		//清除唤醒标志
		RCC_ClearFlag(); 

		if (BKP_ReadBackupRegister(BKP_DR7) == 0xabcd)
		{
			GPIO_ResetBits(GPIOA, GPIO_Pin_8) ;
			BKP_WriteBackupRegister(BKP_DR7,0);
		}
		else
		{
			GPIO_SetBits(GPIOA,GPIO_Pin_8) ;
			BKP_WriteBackupRegister(BKP_DR7,0xabcd);
		}
	}
}

//延时1s
for (i = 0;i < 100;i++)
{
	_delay_ms(10);
}

//打开待机模式,2s后唤醒
open_standy_mode(60000);
分享到:
评论

相关推荐

    STM32的待机唤醒程序,亲测可用

    待机唤醒则是指在待机模式下,通过特定的外部或内部事件将STM32从低功耗状态恢复到正常工作状态的过程。 待机模式下,STM32的CPU、系统时钟以及大部分外设都会被关闭,只有SRAM的状态会被保持。当有中断或事件发生...

    电子-STM32L15x05独立看门狗IWDG和窗口看门狗WWDG.pdf

    特别是STM32L15x系列,它包含了独立看门狗(IWDG)和窗口看门狗(WWDG)两种机制,用以提高系统的稳定性和可靠性。 独立看门狗(IWDG)是STM32L15x系列单片机中的一个硬件模块,其主要目的是提供一种在软件运行异常...

    STM32L0STOP模式唤醒

    在“STM32L053C8_RTC_看门狗_最终版_UART唤醒”这个项目中,开发者已经整合了这些功能,并经过两周的测试验证了代码的可用性。STM32L053C8是STM32L0系列的一款具体型号,拥有低功耗特性和丰富的外设接口,包括RTC、...

    STM32F407单片机(HAL库版本)软件例程源码- 待机唤醒实验.rar

    在这个"STM32F407单片机(HAL库版本)软件例程源码-待机唤醒实验"中,我们将会学习到如何利用HAL库在STM32F407上实现待机模式及从待机模式下唤醒的功能。 1. 待机模式:这是STM32的一种低功耗模式,系统时钟停止,...

    STM32F10X系列 看门狗及寄存器记录.docx

    STM32F10X系列微控制器内含两种类型的看门狗:独立看门狗(IWDG)和窗口看门狗(WWDG),它们是系统安全的重要组成部分,能够检测并处理软件错误导致的故障。 一、独立看门狗(IWDG) IWDG由一个独立的低速时钟LSI...

    STM32独立看门狗和低功耗模式_RTC定时唤醒来喂狗.docx

    STM32微控制器在设计时考虑了系统的稳定性和节能性,这体现在其独立看门狗(IWDG)和低功耗模式的特性上。独立看门狗主要用于监控程序运行,确保在软件错误导致异常时能够复位MCU,以保持系统的可靠性。它的时钟来源于...

    STM32L051低功耗STOP模式下RTC唤醒

    STOP模式下RTC唤醒是STM32L051的一种关键特性,它可以使得系统在不中断计时任务的同时进入低功耗状态。当特定的RTC事件发生,如定时器溢出或外部事件触发,MCU可以从STOP模式中被唤醒,从而执行相应的处理程序。 ...

    STM32 的待机唤醒功能

    退出待机模式有四种方式:外部复位、内部看门狗复位、WK_UP引脚上的上升沿以及RTC闹钟事件。当这些事件发生时,微控制器会从待机状态中退出。从待机模式唤醒后,除了电源控制/状态寄存器(PWR_CSR)外,所有寄存器都会...

    STM32低功耗工作原理实验程序.rar_STM32 低功耗_STM32 唤醒_STM32低功耗原理实验_STM32唤醒_电源

    在STM32中,低功耗模式主要包括停止(Stop)、待机(Standby)和休眠(Sleep)模式,每种模式都有其独特的功耗特性和唤醒机制。 **停止模式(Stop)** 停止模式下,STM32会关闭所有外设时钟,除了RTC(实时计数器)...

    STM32F1_IWDG唤醒STANDBY

    在标题"STM32F1_IWDG唤醒STANDBY"中,关键词是"IWDG"(独立看门狗)和"STANDBY"(待机模式),这涉及到STM32F1在低功耗运行时的唤醒机制。本文将详细介绍STM32F1如何通过IWDG在待机模式下实现系统唤醒,并讨论相关...

    基于STM32F103C8单片机设计-待机模式测试程序KEIL工程源码.zip

    本项目提供了一个待机模式测试程序的KEIL工程源码,旨在帮助学习者理解和掌握STM32的低功耗设计技术。STM32的待机模式是其低功耗模式之一,它将整个处理器关闭,只保留SRAM的状态,以达到最小的电流消耗。 在KEIL...

    STM32F070CB/STM32F070RB/STM32F070C6/STM32F070F6数据手册

    - 独立和系统看门狗定时器。 - SysTick定时器。 **通信接口**:丰富的通信接口选项,包括: - 最多两个I2C接口,支持高速模式Plus(1Mbit/s)。 - 最多四个USART,支持主同步SPI模式和调制解调器控制;其中一个...

    STM32MP157 FreeRTOS实现低功耗Tickless模式实验【支持STM32MP1系列单片机_FreeRTOS系统】

    4. **唤醒机制**:为了在预定时间唤醒CPU,可以利用STM32MP157的硬件定时器,如RTC(实时时钟)或WDT(看门狗定时器)来设置唤醒事件。 5. **电源管理**:在STM32MP157上,需要利用其电源管理单元(PMU)来控制不同...

    stm32标准例程库函数

    - **唤醒功能**:利用EXTI(外部中断)实现待机模式下的唤醒,了解中断处理和低功耗模式。 - **按键处理**:通过GPIO读取按键状态,学习中断服务例程编写。 - **看门狗**:设置和管理独立看门狗(IWDT)或窗口...

    STM32F072x8/STM32F072xB数据手册

    - **看门狗定时器**: 包括独立看门狗和系统看门狗。 - **SysTick定时器**: 一个24位递减计数器,用于提供系统滴答。 - **通信接口**: - **I2C接口**: 两个I2C接口,其中一个支持SMBus/PMBus协议,支持Fast Mode ...

    正点原子 stm32不完全手册

    初学者可以逐步学会编写程序来控制STM32的各种外设,包括串口通信、外部中断、看门狗、PWM输出、OLED和TFTLCD显示、实时时钟(RTC)、待机唤醒、ADC模数转换、内部温度传感器、DMA、IIC和SPI接口、触摸屏、无线通信...

    STM32L431RCT6.rar

    压缩包中的"晋阳湖公园"可能是一个示例工程文件或者相关的项目文件名,具体用途可能是在模拟或测试特定环境下的STM32L431RCT6功能。 综上所述,STM32L431RCT6工程模板提供了对基础硬件功能的配置示例,开发者可以...

    STM32F103xC STM32F103xD数据手册中文

    9. **安全特性**:具备独立看门狗、系统时钟监控和安全启动功能,确保系统稳定运行并提供保护。 10. **应用领域**:STM32F103系列广泛应用于工业控制、智能家居、汽车电子、消费电子、医疗设备、物联网节点等多种...

    STM32L151cb 数据手册

    - **定时器**: STM32L151cb具有10个定时器,包括6个16位定时器,具备最多4个输入捕获/输出比较/PWM通道,2个基本定时器,以及2个看门狗定时器(独立和窗口类型)。 - **触摸感应通道**: 设备支持最多20个电容式感应...

Global site tag (gtag.js) - Google Analytics