嵌入式 > 技术百科 > 详情

STM8无法跳出TIM2更新中断

发布时间:2020-12-16 发布时间:
|

刚学STM8,把如何解决调试过程中出现的问题记录下来。


芯片采用的是STM8S103F3P6,准备做一个刷卡模块,其中delay函数是用tim2定时器实现的。在网上下的例程,delay函数的单位是1ms,我觉得间隔时间有点长了,准备改成10us,使用HSE外部晶振8MHz,8分频,计10个数产生更新中断。再做一个ms的延时函数,100个10us延时函数实现。


问题现象:

在运行的过程中,发现timer2初始化,打开中断函数enableinterrupts后,程序无法跳出。


问题分析步骤:

1.我先进行了调试,发现程序在tim2的中断服务函数里无法跳出,一开始我认为可能是清除中断标志位的代码没有执行,或是清除中断标志位应该放在进入中断服务函数之后就立即执行,把代码移到中断服务函数中第一句,再运行,还是不行;


2.打开寄存器显示窗口,对照着stm8s的中文手册,找到tim2的寄存器相关内容,单步调试,发现TIM2->SR1的清除中断位有被置0,但是隔几步就又会被置1,我先分析可能是某一处代码的问题,但是重新开始了四五次,发现置1的时机是不固定的。这时我才注意到CNTRL这个寄存器,好像是每次都是在这个寄存器的值变成0x09之后SR1置1的。这才反应过来,可能是tim2的中断服务函数在处理的过程中,又有一个更新中断进来,把SR1的更新中断位重新置1,也就是说我的tim2的定时时间过短。


问题解决:

在延长了定时器的更新时间(100us)后,问题解决了。


总结:

在调试的过程中,发现了查看寄存器的威力,这是一种能够更快解决问题的方法。之前使用stm32的时候由于网上资源丰富,基本上哪种问题都能搜索到,一开始上手也是学的库函数版本,所以对寄存器调试使用不多,多是用watch窗口看变量值的方法。但是stm8网上资源较少,更多还需要自己动手,这才体现出查看寄存器值的优势。从发现问题到解决问题一共用时三小时左右。

 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何解决PCB传输线之SI反射问题