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

发布者:光明2599最新更新时间:2019-11-15 来源: eefocus关键字:STM32  待机模式  唤醒测试  独立看门狗测试 手机看文章 扫描二维码
随时随地手机看文章

环境:


主机: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); }}


//延时1sfor (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); }}//延时1sfor (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);  } }}//延时1sfor (i = 0;i < 100;i++){ _delay_ms(10);}//打开待机模式,2s后唤醒open_standy_mode(60000);     

关键字:STM32  待机模式  唤醒测试  独立看门狗测试 引用地址:STM32待机模式唤醒测试以及独立看门狗测试

上一篇:stm32 低功耗下使用看门狗(不喂狗)
下一篇:STM32 休眠模式下,难道 看门狗和低功耗模式没法同时使用?

推荐阅读最新更新时间:2024-11-05 04:13

STM32定时器(TIM)之通用定时器
STM32的通用定时器有四个,分别是TIM2, TIM3,TIM4,TIM5,有以下功能: 通用定时器的框图如下: 从图中可以看出,通用定时器TIMx的触发源(计数器时钟的时钟源)有四个: 1、内部时钟(CLK_INT) 2、外部时钟模式1:外部输入引脚(TIx),分别经TIMx_CHx通道传入 3、外部时钟模式2:外部触发输入(ETR) 4、内部触发输入(ITRx):定时器主从模式下由ITRx定义从定时器和主定时器、 下面选取触发源为内部时钟时进行分析: 从上图我们可以看到,基本定时器主要由下面三个寄存器组成。 1、计数器寄存器 (TIMx_CNT) 2、预分频器寄存器 (TIMx_PSC) 3、自动重载寄存器 (TIM
[单片机]
STM32】1—零基础硬件软件配置 & 完成LED的闪烁
1 基础准备 1.1 硬件准备 首先,我们需要用四根杜邦线完成开发板与下载器的连接。 连接方式:DAPLINK上的3V3、SWD、SCK、GND,分别通过杜邦线与开发板上的VCC、SWDIO、SWCLK、GND相连。 对于驱动问题,若是使用Win10、Win11系统,则无需安装驱动,即插即用。在数据线插上电脑USB接口后,可从电脑设备管理器找到。 1.2 软件准备 打开STM32CubeMX,打开MCU SELECTOR,搜索并选中芯片STM32F407VET6: 时钟源配置(时钟树配置参看文章开头的两篇博客): GPIO引脚配置: ① 初始化输出电
[单片机]
【<font color='red'>STM32</font>】1—零基础硬件软件配置 & 完成LED的闪烁
STM32掌机教程8,背景音乐
再用一个定时器   在上一节,我们使用了一个定时器来计算频率。需要某个音符持续一定的时间的话,仍然使用的是延时函数delay_ms,这会导致CPU阻塞,程序运行到这里,CPU只会去数数字,你按下按键,他也检测不到——忙着数数字呢。接下来把这个延时也改成定时器,让定时器像个闹钟一样工作,让CPU该干什么干什么,时间到了以后,让定时器来提醒CPU。换句话说,播放的是背景音乐。 //改进此函数中的延时 void musicPlay(int length,unsigned char volume_level) { u8 i=0; while(i length) { buzzerSound(AllBGM .mName,volum
[单片机]
<font color='red'>STM32</font>掌机教程8,背景音乐
STM32:定时器中断与优先级
前言 利用HAL库开发实现功能:使用TIM2实现定时,每隔1秒实现双闪功能 一、基础知识 1、常见的定时器资源 1.系统滴答定时器 SysTick 集成在Cortex M3内核的定时器,主要目的是给RTOS提供时钟节拍做时间基准。比如HAL库函数中的HAL_Delay()就是基于这个定时器开发的。如果要做嵌入式Linux的相关项目,要和上位机进行通讯的话,这个函数就不能用了。 2.看门狗定时器 WatchDog 3.实时时钟 RTC 4.基本定时器 TIM6、TIM7 5.通用定时器 TIM2、TIM3、TIM4、TIM5 在基本定时器的基础上,实现输出比较、输入捕获、PWM生成、单脉冲模式输出等功能。这类定时
[单片机]
<font color='red'>STM32</font>:定时器中断与优先级
STM32外设结构体定义和时钟初始化语句顺序导致编译
1.编写外设初始化函数时候需要定义外设的结构体,以及初始化外设时钟等 但是今天偶然间把代码语句写反了,然后编译不通过,提示错误信息为:dac.c(41): error: #268: declaration may not appear after executable statement in block DAC_InitTypeDef DAC_InitStructure;这个错误提示之前一篇博文也出现过,但是原因好像不是这个,还是贴出来作为经验吧。 void DAC_Mode_Config(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); DAC_In
[单片机]
STM32如何生成lib以供二次开发
相关方法: 0 STM32最新固件库(3.5)封装lib加工程模版 1 stm32 教你如何编译出LIB文件 2 stm32如何生成lib 3 教你如何在stvd中生成lib文件,好处你懂的~ 4 谁知道在RVMDK下怎样生成 lib 文件? 5 STM32之如何封装自己的lib 库
[单片机]
STM32的中断理解笔记
1、基本理解 ARM Cortex_m3内核支持256个中断(16个内核和240个外部)和可编程256级中断优先级的设置。然而,STM32并没有全部使用M3内核东西,STM32目前支持的中断为84个,16个内核加上68个外部以及16级可编程中断优先级的设置。 由于STM32只能管理16级中断的优先级,所以只是使用到中断优先级寄存器的高四位。 有两种优先级: (1)抢占式优先级,库函数设置为NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=x(x为0~15,具体要看下面的优先级组别的选择); (2)响应优先级,库函数设置为NVIC_InitStructure
[单片机]
stm32中断解释
一,中断优先级: STM32(Cortex-M3)中的优先级概念 STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。 当 两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后 才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved