共2条
1/1 1 跳转至页
5402 [初学者]程序进不了定时器中断怎么调试[5402]?

问
请高手指点下,可能是什么地方出了问题?
===========主程序如下:==========
interrupt void time_int(void){
timeflag=1;
}
void main(){
c54_init();
timeflag=0;
for (;;){
if (timeflag==1){
timeflag=0;
}
}
}
==========重新映射的中断向量表==========
.def Interrupt_Vectors
.ref _int0_int,_time_int
.sect ".vectors"
Interrupt_Vectors:
reset:
RETE ;BD _c_int00
NOP
NOP
NOP
nmi: RETE
NOP
NOP
NOP
sint17 .space 4*16
sint18 .space 4*16
sint19 .space 4*16
sint20 .space 4*16
sint21 .space 4*16
sint22 .space 4*16
sint23 .space 4*16
sint24 .space 4*16
sint25 .space 4*16
sint26 .space 4*16
sint27 .space 4*16
sint28 .space 4*16
sint29 .space 4*16
sint30 .space 4*16
int0:
BD _int0_int
NOP
NOP
int1: RETE
NOP
NOP
NOP
int2: RETE
NOP
NOP
NOP
tint:
BD _time_int
NOP
NOP
rint0: RETE
NOP
NOP
NOP
xint0: RETE
NOP
NOP
NOP
rint2: RETE
NOP
NOP
NOP
xint2: RETE
NOP
NOP
NOP
int3: RETE
NOP
NOP
NOP
hintp: RETE
NOP
NOP
NOP
rint1: RETE
NOP
NOP
NOP
xint1: RETE
NOP
NOP
NOP
.space 4*16
.end
答 1: 同问,我也是新手,需要include什么吗? 答 2: 我是省略了,只是想问问目前这个程序段中有错误不 答 3: 能不能给个具体的呢? 答 4: 大家共同进步啊~~~需要INCLUDE什么?? 答 5: 目前这个是不需要的。 答 6: 检查一下1、中断向量表正确吗?要保证中断向量表的起始地址的低七位为0
2、可以查看定时器0的相关寄存器是否按照所设定的变化。 答 7: 个人见解进入中断后应该清除中断标志位,否则会引起反复中断。
调试定时中断很简单,在定时中断服务程序中设置一个断点,run就可以了 如果停到了断点处说明中断正常发生,否则检查定时器设置和中断入口 答 8: 应该是定时器没有设置好,程序没有问题看看IMR有没有屏蔽定时器中断 答 9: 请教!!我也遇到定时器问题,它只跳进中断服务程序并执行一次,然后就不再进中断了
各位同行中人,我在调试程序中遇到这样一个问题,我设置了定时器1周期中断,每1ms发生一次,但是程序的结果是只跳进中断子服务程序中一次,就不再进去了,我百思不得其解,恳请各位拔刀相助,十万火急!!
QQ:30785678
#include "f2407c.h"
void initial(void);
void time1int(void);
int flag=0x0000;
int i=0;
main()
{
asm(" setc INTM");
initial();
time1int();
asm(" clrc INTM");
T1CON=0x164C; /*启动定时中断,开始中断*/
while(1)
{ /*等待中断*/
;
}
}
void initial(void)
{
asm(" setc SXM");
asm(" clrc OVM");
asm(" clrc CNF");
SCSR1=0x02FD; /***配置系统控制和状态寄存器,二倍频***/
WDCR=0xE8; /***禁止看门狗定时器计数***/
IMR=0x0002; /*允许INT2中断*/
IFR=0x0FFFF; /*清除中断标志位*/
WSGR=0x0000; /*不使能等待状态*/
}
void time1int(void)
{
EVAIMRA=0x0080; /*允许定时器1周期中断*/
EVAIFRA=0x0080; /*清定时器1周期中断标志*/
T1CON=0x160C; /*定时器1连续增计数,预分频64,内部时钟*/
T1PR=0x177; /*定时周期1ms*/
T1CNT=0x00;
}
void interrupt T1INT()
{
flag= EVAIFRA&0x0080; /*检验是否定时期1中断*/
if(flag!=0x0080) /*若不是,返回*/
{
asm(" clrc INTM");
return;
}
if (i<50) /*如果是1中断,当i<50时,I增加1,(加1的目的是为了检验进入中断的次数,执行一次中断I的值增加一次)
{i++;
T1CNT=0x00; /*计数器清零*/
EVAIFRA=0x0080; /*清中断标志位*/
asm(" clrc INTM"); /*开总中断*/
return;
}
else i=52;
}
void interrupt nothing()
{
asm(" clrc INTM");
return;
}
===========主程序如下:==========
interrupt void time_int(void){
timeflag=1;
}
void main(){
c54_init();
timeflag=0;
for (;;){
if (timeflag==1){
timeflag=0;
}
}
}
==========重新映射的中断向量表==========
.def Interrupt_Vectors
.ref _int0_int,_time_int
.sect ".vectors"
Interrupt_Vectors:
reset:
RETE ;BD _c_int00
NOP
NOP
NOP
nmi: RETE
NOP
NOP
NOP
sint17 .space 4*16
sint18 .space 4*16
sint19 .space 4*16
sint20 .space 4*16
sint21 .space 4*16
sint22 .space 4*16
sint23 .space 4*16
sint24 .space 4*16
sint25 .space 4*16
sint26 .space 4*16
sint27 .space 4*16
sint28 .space 4*16
sint29 .space 4*16
sint30 .space 4*16
int0:
BD _int0_int
NOP
NOP
int1: RETE
NOP
NOP
NOP
int2: RETE
NOP
NOP
NOP
tint:
BD _time_int
NOP
NOP
rint0: RETE
NOP
NOP
NOP
xint0: RETE
NOP
NOP
NOP
rint2: RETE
NOP
NOP
NOP
xint2: RETE
NOP
NOP
NOP
int3: RETE
NOP
NOP
NOP
hintp: RETE
NOP
NOP
NOP
rint1: RETE
NOP
NOP
NOP
xint1: RETE
NOP
NOP
NOP
.space 4*16
.end
答 1: 同问,我也是新手,需要include什么吗? 答 2: 我是省略了,只是想问问目前这个程序段中有错误不 答 3: 能不能给个具体的呢? 答 4: 大家共同进步啊~~~需要INCLUDE什么?? 答 5: 目前这个是不需要的。 答 6: 检查一下1、中断向量表正确吗?要保证中断向量表的起始地址的低七位为0
2、可以查看定时器0的相关寄存器是否按照所设定的变化。 答 7: 个人见解进入中断后应该清除中断标志位,否则会引起反复中断。
调试定时中断很简单,在定时中断服务程序中设置一个断点,run就可以了 如果停到了断点处说明中断正常发生,否则检查定时器设置和中断入口 答 8: 应该是定时器没有设置好,程序没有问题看看IMR有没有屏蔽定时器中断 答 9: 请教!!我也遇到定时器问题,它只跳进中断服务程序并执行一次,然后就不再进中断了
各位同行中人,我在调试程序中遇到这样一个问题,我设置了定时器1周期中断,每1ms发生一次,但是程序的结果是只跳进中断子服务程序中一次,就不再进去了,我百思不得其解,恳请各位拔刀相助,十万火急!!
QQ:30785678
#include "f2407c.h"
void initial(void);
void time1int(void);
int flag=0x0000;
int i=0;
main()
{
asm(" setc INTM");
initial();
time1int();
asm(" clrc INTM");
T1CON=0x164C; /*启动定时中断,开始中断*/
while(1)
{ /*等待中断*/
;
}
}
void initial(void)
{
asm(" setc SXM");
asm(" clrc OVM");
asm(" clrc CNF");
SCSR1=0x02FD; /***配置系统控制和状态寄存器,二倍频***/
WDCR=0xE8; /***禁止看门狗定时器计数***/
IMR=0x0002; /*允许INT2中断*/
IFR=0x0FFFF; /*清除中断标志位*/
WSGR=0x0000; /*不使能等待状态*/
}
void time1int(void)
{
EVAIMRA=0x0080; /*允许定时器1周期中断*/
EVAIFRA=0x0080; /*清定时器1周期中断标志*/
T1CON=0x160C; /*定时器1连续增计数,预分频64,内部时钟*/
T1PR=0x177; /*定时周期1ms*/
T1CNT=0x00;
}
void interrupt T1INT()
{
flag= EVAIFRA&0x0080; /*检验是否定时期1中断*/
if(flag!=0x0080) /*若不是,返回*/
{
asm(" clrc INTM");
return;
}
if (i<50) /*如果是1中断,当i<50时,I增加1,(加1的目的是为了检验进入中断的次数,执行一次中断I的值增加一次)
{i++;
T1CNT=0x00; /*计数器清零*/
EVAIFRA=0x0080; /*清中断标志位*/
asm(" clrc INTM"); /*开总中断*/
return;
}
else i=52;
}
void interrupt nothing()
{
asm(" clrc INTM");
return;
}
共2条
1/1 1 跳转至页
回复
打赏帖 | |
---|---|
【STM32F769】AI之与本地deepseek对接被打赏50分 | |
Buck电路工作在CCM模式下电感电流的计算公式是什么?被打赏5分 | |
buck电路工作原理被打赏5分 | |
基于MSPM0L1306的MODBUS-RTU协议通讯实验被打赏100分 | |
我想要一部加热台+多合一调试工具被打赏18分 | |
每周了解几个硬件知识+485硬件知识分享被打赏10分 | |
【换取手持数字示波器】树莓派PICO调试器官方固件本地化部署实践被打赏24分 | |
【换取手持数字示波器】分享一个KEIL无法识别CMSIS-DAP调试器的解决办法被打赏20分 | |
【换取手持数字示波器】分享一个自制的ArduinoNano扩展板底板被打赏23分 | |
【换取手持示波器】树莓派PICOW网页烟花被打赏18分 |