解决办法,需要开启StmFreezeEnable,即开启调试暂停模式,此模式下,debug暂停后,计数器也会停止;
原因:如下图所示,STM实现周期原理为,每次进入匹配中断后,会重新更新CMP值,已实现周期中断,而这个CMP值得设定是基于上一次CMP值:
举个例子,STM的tick为1us,上次匹配值为1000,为了保持1ms的周期中断,CMP值需设置为1000 + 1000ticks,这样CNT=2000时,CMP匹配,这样就能触发中断;
而问题中,在没有设置StmFreezeEnable时debug暂停,会出现如下图情况,无法实现周期中断:
①调试暂停:在CMP=CNT=3000时打了断点,这时候CNT仍在继续增加,但CMP在此时只会更新为4000
②理论匹配点:因为调试暂停了,无法进入中断处理,把CMP更新为下一个匹配值5000
③此处调试继续,CNT早已大于5000,不会发生匹配
④此处会发生匹配,因为CNT已经溢出,重新回到5000,与CMP匹配,触发中断