历史上的今天
今天是:2025年03月06日(星期四)
2020年03月06日 | STM8无法跳出TIM2更新中断
2020-03-06 来源:eefocus
刚学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网上资源较少,更多还需要自己动手,这才体现出查看寄存器值的优势。从发现问题到解决问题一共用时三小时左右。
史海拾趣
|
现在马上要做一个东西,就是以前的板子上是nor+nand flash的方式,现在只用nand flash做uboot、kernel 文件系统。 请问我要怎样做,才能把uboot、kernel、文件系统都烧到只有nand flash的板子上并让他运行,并没问题。 请问我要怎么入手做这 ...… 查看全部问答> |
|
我这有一个stm32f10xx的开发板,但是使用IAR5.40.7的开发软件,可是编译通过了,可无论如很都写不进flash,也无法 ...… 查看全部问答> |
|
请教一下大家,我想在沈阳开一个制作电路板的小店,主要是针对零散小批量的客户,利用雕刻机做,不知道有没有市场,需求量怎么样?有了解的朋友能不能给点建议。先谢谢大家了!… 查看全部问答> |




