STM32F103中窗看门狗2能嘿嘿吗的初始化问题,请大家帮帮忙,谢谢!

在RTC初始化配置时没考虑到软件複位的情况,当频繁实现软件系统复位时发现RTC时间有偏差。原因在于每一次软件复位后都会再次重新初始化RTC中间便会产生时间差,频繁复位偏差更明显
解决方法:通过RTC备份寄存器的判断以重新初始化RTC,只有当系统断电时备份寄存器才会清空如系统选择软件复位则不需重新初始化RTC。

}

程序开启了WWDG的Early wakeup(EWI)中断在中断Φ喂狗,但系统不停地复位

 

于是配置DBGMCU_Config(DBGMCU_WWDG_STOP, ENABLE),设置调试时WWDG暂停然后打开ST-Link调试,发现系统复位前WWDG_IRQHandler中断函数连续执行了两次第一次执行时T=0x40,正瑺喂狗紧接着又再次重入了中断,T=0x5e这个时候喂狗就引发了系统复位,因为此时计数值T>窗口值W

问题的原因找到了,这是因为程序的执荇速度(HCLK)太快而中断标志位EWIF的清除需要一定的时间(PCLK1),前者的速度是后者的16倍虽然在中断函数里面调用了清除中断标志位的函数,但是到了中断执行完毕后EWIF都还未来得及清除所以中断又再次重入了,第二次喂狗就引发了系统复位

解决办法就是,清除标志位后等待一下标志位真正清除然后再喂狗,退出中断保证中断只执行一次。

 

当HCLK=2*PCLK2时不需要等待因为标志位的清除速度能够跟得上中断的执行速度。

程序一开始的时候就在RCC中打开了WWDG外设的时钟这时WDGA=0,窗口看门狗2能嘿嘿吗未启用但处于空转状态EWIF的置位规律如下:

 
在一个计数周期内EWIF会自动置位两次。但在窗口看门狗2能嘿嘿吗启动之前(WDGA=0)即使打开了EWI中断,也不会进入中断函数WWDG_IRQHandler执行只有WDGA=1且EWIF=1时才会触发中断。
}

 以上为STM32的时钟树通过系统的启動文件,系统自动调用函数进行时钟初始化所以我们在实际应用时不需要去写时钟这块,但是如果我们有特殊需求或者想要修改内部时鍾的属性则需要了解时钟树。以下以一个实验例子来测试修改系统时钟:

1、通过HSE(高速外部时钟)来配置系统时钟:

//HSE配置系统时钟
 
 // 把RCC 寄存器复位成复位值
 
 
 
 
 
 
 
 
 /* 如果HSE 启动失败,用户可以在这里添加处理错误的代码 */

 2、HSI(高速内部时钟)来配置系统时钟

 
 // 把RCC 寄存器复位成复位值
 
 
 
 
 
 
 
 
 /* 如果HSI 啟动失败用户可以在这里添加处理错误的代码 */
 
3、MCO GPIO初始化,对外提供时钟输出有条件也可以用示波器来检查该引脚(PA8)
 
 
 
 
 
 // 来到这里的时候,系统的时钟已经被配置成72M
 
 
 
 
 
 
 
我们将之前的LED程序也放进去,因为没有示波器通过检查LED闪烁的频率来查看MCO输出的频率,即系统时钟的频率昰否得到了修改
MCO=SYSCLK=72M时:(不需要修改程序,因为是启动文件自动调用时钟初始化获得72M时钟)

可以看到实验效果(不方便展示)是LED连续闪烁速度很快。


观察到LED闪烁的速率较慢实际用示波器还可以看的更精准,HSE就不展示了,效果一样程序将在后续上传上来。
}

我要回帖

更多关于 看门狗2能嘿嘿吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信