刚学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网上资源较少,更多还需要自己动手,这才体现出查看寄存器值的优势。从发现问题到解决问题一共用时三小时左右。
上一篇:STM8S中断系统
下一篇:STM8S103之tim2捕获周期
设计资源 培训 开发板 精华推荐
- LTC3789EGN 演示板,高效同步 4 开关升压/降压 DC/DC 转换器
- MIKROE-3308,基于 ACS70331 高灵敏度 GMR 电流传感器的霍尔电流 4 Click 板
- Mini_TTL
- esp12s兼容PCB
- LTC3727EG 高效双路 12V/5V 降压转换器的典型应用电路
- 使用 AD7713、LC2MOS 环路供电信号调理 ADC 的典型应用,用于 3 线 RTD 应用和 AD7713
- 使用 Analog Devices 的 ADP3309 的参考设计
- 用于医疗的 8/10/12 位、1CH DAC
- 使用 Semtech 的 SC2642 的参考设计
- tuya温湿度检测