定时器初始化: void Init_Timer1(void) { TIM1_CR1=0x00; //不使能计数器 TIM1_ARRH=0x2F; //自动重装的值 TIM1_PSCRL=0xFF; //分频值,根据初值和分频值,定时在2秒多; TIM1_IER=0x01; //更新中断使能 TIM1_CR1=0x01; //使能计数器 } ------------------------ 中断服务程序: #pragma vector=TIM1_OVR_UIF_vector __interrupt void TIM1_OVR_UIF_IRQHandler(void) { asm("sim"); //关中断; PB_ODR^=0x20; //改变LED状态; TIM1_SR1=0x00; //清除状态寄存器; TIM1_CR1=0x00; //不使能计数器; asm("rim"); //开中断,然后中断返回; } ------------------------- B5端口初始化: void Init_GPIO(void) { PB_DDR|=0x20; PB_CR1|=0x20; PB_CR2&=0xDF; } ------------------------------------ 利用B5端口的推挽输出LED,通过LED亮灭判断状态。 现在问题是,一开机就会进中断,可以观察到LED迅速闪一下。按照预想的情况,开机应该是亮定时的时间后灭,实际不然。 在下开发环境是IAR,Debugger设备是ST-Link。在编译调试环境里单步运行的时候是正常的,能正常进入计数的进程,计数溢出后才进中断。 以上问题困扰在下2天了,望各位前辈不吝赐教,感激不尽。 |
cubeIDE在运行时显示Failed to execute MI command是什么问题呢?
SPC5Studio如何配置不生成ram数据到mot文件中?
3971b移植3916代码报错
【STM32C0评测】1.开箱点亮小灯
请教 stm8s 复位电路 和VCAP电容问题
workbench不生成keil文件怎么调试?
修改stm32f407 tim14的ccr1,但是占空比不变?
修改stm32f407 tim14的ccr1,但是占空比不变
L9663驱动开发
Stm32G071 i2c slave配置问题
感谢回复,定时不短,可以算得出,就是2秒左右。可以确定是一启动就进中断,没计时的过程。那两个寄存器赋值不赋值我都试过,没有差异。
感谢回复!!单步执行的过程完全正常,跟预想的没有差别,状态寄存器在第一次溢出时才会置位,而且由0x00变成0x1F,具体为啥这样我也不清楚。
主贴里已经提到了:
在编译调试环境里单步运行的时候是正常的,能正常进入计数的进程,计数溢出后才进中断。
--------------------------------------
您说的加断点调试意思是不是看有没有开机直接进中断?调试时我在调试器里按F11单步运行的,显示的结果是正常的。开机做完初始化,使能计数器后下一步能看到主程序指针停留在死循环上,计数器在每运行一步时增加2-3个值,直到溢出才进中断。而如果把断点设在中断服务程序里,那么运行的时候,根本不会有停留,没有相应的计数步骤,直接就进中断了。
按程序里的初值和分频值,向上计数的情况下,每次溢出需要1.5秒左右。用LED显示应该能观察到有没有计时操作。
十分感谢您的回复和指点。马上先改一下。
我看到很多帖子说是清Timx_SR1的UIF位,我试过,没效果。也试过在Timx_PSCR赋值前置位Timx_CR1的ugs位置,也没有效果。。。
改过了,似乎对主帖提到的问题来说没什么改变