历史上的今天
返回首页

历史上的今天

今天是:2024年11月15日(星期五)

正在发生

2019年11月15日 | STM32待机模式唤醒测试以及独立看门狗测试

2019-11-15 来源:eefocus

环境:


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

推荐阅读

史海拾趣

CTS [CTS Corporation]公司的发展小趣事

随着电子技术的不断进步和广泛应用,CTS敏锐地捕捉到了电子元器件和传感器市场的巨大潜力。于是,公司开始逐步转型,将业务重心转向这些领域。通过不断的研发和创新,CTS成功设计并生产出一系列高性能的电子元器件和传感器产品,赢得了市场的广泛认可。

启臣微(Chip)公司的发展小趣事

在成都启臣微电子股份有限公司成立之初,公司就致力于集成电路及系统产品的设计、生产与销售。面对激烈的市场竞争,启臣微坚持创新,投入大量研发资源,终于在高性能功率管理集成电路领域取得了重大技术突破。这一突破不仅提升了公司的市场竞争力,也为公司赢得了业界的广泛认可。

Compact公司的发展小趣事

在快速发展的过程中,Compact公司始终注重品牌建设和文化传承。公司通过不断提升产品质量和服务水平,树立了良好的品牌形象。同时,公司还注重培养员工的归属感和忠诚度,形成了独特的企业文化。这种文化传承不仅为公司的发展提供了强大的精神动力,还使公司在激烈的市场竞争中保持了独特的竞争力。

ENSIGN公司的发展小趣事

ENSIGN不仅局限于照明领域,还积极向能源服务领域拓展。近年来,ENSIGN通过技术创新和战略合作,为客户提供定制化的电源解决方案。例如,在2009年,ENSIGN建成了新的工厂,并与多家本地供应、装配和测试组织建立了合作关系,以提供更高质量、更可靠的产品和服务。

Cypress Industries公司的发展小趣事

为了更好地服务全球客户,Cypress积极实施海外扩张和本土化战略。公司在菲律宾、印尼等地设立了组装和检测工厂,同时在美国、欧洲和亚洲等多个国家和地区设立了设计中心。这种本土化战略使Cypress能够更好地了解当地市场需求,提供定制化的产品和解决方案。

Bivar公司的发展小趣事

随着技术的不断发展和市场的日益扩大,Bivar公司意识到国内市场的局限性,开始积极拓展国际市场。公司派遣专业团队前往海外进行市场调研,了解当地需求和竞争态势。通过定制化的产品和灵活的销售策略,Bivar成功打入多个海外市场,并获得了可观的收益。

问答坊 | AI 解惑

跪求 基于LCD液晶显示的多功能密码锁

哪位能提供 一个基于LCD液晶显示的多功能密码锁 的毕业论文啊 希望能够有 原理图  和程序 C语言或者 汇编的都可以  谢谢了  急!!!!!!!!! 我的邮箱 :249857121@qq.com…

查看全部问答>

很奇怪的一个问题?

想知道:电容在什么情况下具有隔交通直的作用?…

查看全部问答>

移植网卡驱动 读DM9000 ID的问题 有做过的进来帮忙看看

读出的ID总不对       平台2440  DM9000  接片选4 #define BSP_BASE_REG_PA_DM9000_IOBASE           0x20000300 DNW输出如下:      ...…

查看全部问答>

wince 5.0 bsp 移植

谁移植过smdk2440 for wince 5.0啊,麻烦发给移植过程过来,不知道该如何下手啊。 pingchang3645@sina.com 不胜感激啊。…

查看全部问答>

ROM 隐藏文件问题

有个exe在系统中是隐藏属性的,无法通过ActiveSync复制出来,有人有办法吗。最近在研究这个,大家来讨论下。…

查看全部问答>

巴山工作室,为您解决技术难题和提供技术服务.

   巴山工作室有非常强大软硬件技术力量,能为您或您的企业解决一些复杂技术难题,    同时也您企业减少一些不必要的人力成本.        巴山工作室有非常强大软硬件技术力量,能为您或您的企业解决一些复 ...…

查看全部问答>

protel99se 覆铜

大家好:      小弟画了一块板子,现在PCB布线已经搞好,就差覆铜了,不规则覆铜,就是在顶层需要覆铜的地方才覆,不需覆铜的地方不覆,这样板子上覆铜的边缘就不是直线了,请问怎样实现不规则的覆铜,怎样设置,如何操作才能 ...…

查看全部问答>

一个开发板的样本驱动程序 用下面的编译参数直接编译,出现以下错误

[root@localhost turner]# arm-linux-gcc -D__KERNEL__ -I/opt/FriendlyARM/SBC2410/kernel/include -Wall -Wstrict-prototypes -Wno-trigraphs -Os -mapcs -fno-strict-aliasing -fno-common -fno-common -pipe -mapcs-32 -march=armv4 -mtu ...…

查看全部问答>

flash的使用问题

我想用flash存放一些有用的数据,可是flash的信息段只有256B的大小。太小了,而主信息段也不知道那一部分是放程序的,那一部分可以写数据。还是一般iar download程序都下到那一段地址。请高人指点????…

查看全部问答>

求助pic18f97j60 TCP/IP协议栈v4.51

大家好,请问各位两个问题 我用18f97j60的网络,采用TCP/IP协议栈的v4.51版本 1.在GenericTCPServe这个demo的基础上修改,因为接收不是中断的,所以每次检测到接收FIFO的大小大于我定义的包头大小时,开始解析包头,然后 根据包头定义的数据长度 ...…

查看全部问答>