共2条
1/1 1 跳转至页
中断问题,想不通啊!!!是不是中断复位问题啊???
问
请教各位大侠,这个中断计数我明明是只让PWM2中断输出,为什么计数的确是PWM4,但是是PWM2输出。按道理说应该是PWM2计数(脉冲个数。)
void __irq PWM_Handler(void)
{
if(PWMIR&0x01 == 0x01)//判断中断0是否中断
{
d++;
PWMIR |= 0x01; //复位中断0
}
if(PWMIR&0x04 == 0x04)//判断中断2是否中断
{
d2++;
PWMIR |= 0x04; //复位中断2
}
if(PWMIR&0x100 == 0x100)//判断中断4是否中断
{
d4++;
PWMIR |= 0x100; //复位中断4
}
if(PWMIR&0x400 == 0x400)//判断中断6是否中断
{
d6++;
PWMIR |= 0x400; //复位中断6
}
VICVectAddr = 0x00; // 通知VIC中断处理结束
}
int main (void)
{
IRQEnable();
PWMPR=0;
PINSEL0 = 0x00008000; //连接到PWM2
PWMPCR |= 0x0400; //设置PWM2输出,并为单边沿控制模式
PWMMR0 = PwmSize;
PWMMR2 = PwmStartSize;
PWMLER = 0x05;
PWMMCR=(1<<0)|(1<<6); //PWMMR2与PWMTC匹配时产生中断
//PWMMR0与PWMTC匹配时产生中断
// PWMIR=0x03;
PWMTCR = 0x02;
PWMTCR = 0x09;
VICIntSelect =0x00; // 所有中断通道设置为IRQ中断
VICVectCntl0 = (0x20|8); //PWM优先级最高
VICVectAddr0 = (int)PWM_Handler; //VICDefVectAddr改为VICVectAddr0就可以进入中断
VICIntEnable = (1<<8); //使能PWM中断请求
while(1)
{
if(d2 == 20)
ClosePwm(0)
;
}
return 0;
}
答 1: 自已顶!!怎么没有人啊! 答 2: 老师,我按照你的方法调了一下。结果是这样的:
首先,我把中断
PWMMCR=(1<<0)|(1<<6); //PWMMR2与PWMTC匹配时产生中断
//PWMMR0与PWMTC匹配时产生中断
改为PWMMCR = (1《 6);
程序进入中断了一次,而且PWMIR的值为0x04,但是在程序走到
if(PWMIR&0x04 == 0x04)时,判断结果是假,直接跳过,直到函
中断函数结束,好像是跑飞了。
答 3: 中断函数中的条件判断上有语法错误。正确的程序如下:(注意if语句条件判断多了一对()号)
void __irq PWM_Handler(void)
{
if((PWMIR&0x01) == 0x01)//判断中断0是否中断
{
d++;
PWMIR = 0x01; //复位中断0
}
if((PWMIR&0x04) == 0x04)//判断中断2是否中断
{
d2++;
PWMIR = 0x04; //复位中断2
}
if((PWMIR&0x100) == 0x100)//判断中断4是否中断
{
d4++;
PWMIR = 0x100; //复位中断4
}
if((PWMIR&0x400) == 0x400)//判断中断6是否中断
{
d6++;
PWMIR = 0x400; //复位中断6
}
VICVectAddr = 0x00; // 通知VIC中断处理结束
}
int main (void)
{
IRQEnable();
PWMPR=0;
PINSEL0 = 0x00008000; //连接到PWM2
PWMPCR |= 0x0400; //设置PWM2输出,并为单边沿控制模式
PWMMR0 = 10000;
PWMMR2 = 1000;
PWMLER = 0x05;
PWMMCR=(1<<0)|(1<<6); //PWMMR2与PWMTC匹配时产生中断
//PWMMR0与PWMTC匹配时产生中断
// PWMIR=0x03;
PWMTCR = 0x02;
PWMTCR = 0x09;
VICIntSelect =0x00; // 所有中断通道设置为IRQ中断
VICVectCntl0 = (0x20|8); //PWM优先级最高
VICVectAddr0 = (int)PWM_Handler; //VICDefVectAddr改为VICVectAddr0就可以进入中断
VICIntEnable = (1<<8); //使能PWM中断请求
while(1)
{
if(d2 == 20)
ClosePwm(0);
}
return 0;
} 答 4: 这个东东会不会影响进入中断计数问题??uint32 PwmSize = Fpclk;
uint32 PwmStartSize = Fpclk/2;
uint32 d = 0, d2 = 0, d4 = 0, d6 = 0;
...........
PWMMR0 = PwmSize;
PWMMR2 = PwmStartSize;
..........
还有,老师,我用的精振是:11.0592M,那么它的Fpclk=11.0592啊???
我的主频是44.2368M
那么我的每一条指令为:1/44.2368M=22.6056ns
从此推出:11.0592M*22.6056ns = 24.9999ms
频率:1/25ms = 40HZ
我的计算是不是正确啊??????
答 5: re:zlgARM老师,谢谢你的帮助,现在可以正常工作了。老师,你看一下,这个周期与频率计算的正确吗????
因为我现在手上没有示波器,所以不能测量。
再次谢谢您,老师
void __irq PWM_Handler(void)
{
if(PWMIR&0x01 == 0x01)//判断中断0是否中断
{
d++;
PWMIR |= 0x01; //复位中断0
}
if(PWMIR&0x04 == 0x04)//判断中断2是否中断
{
d2++;
PWMIR |= 0x04; //复位中断2
}
if(PWMIR&0x100 == 0x100)//判断中断4是否中断
{
d4++;
PWMIR |= 0x100; //复位中断4
}
if(PWMIR&0x400 == 0x400)//判断中断6是否中断
{
d6++;
PWMIR |= 0x400; //复位中断6
}
VICVectAddr = 0x00; // 通知VIC中断处理结束
}
int main (void)
{
IRQEnable();
PWMPR=0;
PINSEL0 = 0x00008000; //连接到PWM2
PWMPCR |= 0x0400; //设置PWM2输出,并为单边沿控制模式
PWMMR0 = PwmSize;
PWMMR2 = PwmStartSize;
PWMLER = 0x05;
PWMMCR=(1<<0)|(1<<6); //PWMMR2与PWMTC匹配时产生中断
//PWMMR0与PWMTC匹配时产生中断
// PWMIR=0x03;
PWMTCR = 0x02;
PWMTCR = 0x09;
VICIntSelect =0x00; // 所有中断通道设置为IRQ中断
VICVectCntl0 = (0x20|8); //PWM优先级最高
VICVectAddr0 = (int)PWM_Handler; //VICDefVectAddr改为VICVectAddr0就可以进入中断
VICIntEnable = (1<<8); //使能PWM中断请求
while(1)
{
if(d2 == 20)
ClosePwm(0)
;
}
return 0;
}
答 1: 自已顶!!怎么没有人啊! 答 2: 老师,我按照你的方法调了一下。结果是这样的:
首先,我把中断
PWMMCR=(1<<0)|(1<<6); //PWMMR2与PWMTC匹配时产生中断
//PWMMR0与PWMTC匹配时产生中断
改为PWMMCR = (1《 6);
程序进入中断了一次,而且PWMIR的值为0x04,但是在程序走到
if(PWMIR&0x04 == 0x04)时,判断结果是假,直接跳过,直到函
中断函数结束,好像是跑飞了。
答 3: 中断函数中的条件判断上有语法错误。正确的程序如下:(注意if语句条件判断多了一对()号)
void __irq PWM_Handler(void)
{
if((PWMIR&0x01) == 0x01)//判断中断0是否中断
{
d++;
PWMIR = 0x01; //复位中断0
}
if((PWMIR&0x04) == 0x04)//判断中断2是否中断
{
d2++;
PWMIR = 0x04; //复位中断2
}
if((PWMIR&0x100) == 0x100)//判断中断4是否中断
{
d4++;
PWMIR = 0x100; //复位中断4
}
if((PWMIR&0x400) == 0x400)//判断中断6是否中断
{
d6++;
PWMIR = 0x400; //复位中断6
}
VICVectAddr = 0x00; // 通知VIC中断处理结束
}
int main (void)
{
IRQEnable();
PWMPR=0;
PINSEL0 = 0x00008000; //连接到PWM2
PWMPCR |= 0x0400; //设置PWM2输出,并为单边沿控制模式
PWMMR0 = 10000;
PWMMR2 = 1000;
PWMLER = 0x05;
PWMMCR=(1<<0)|(1<<6); //PWMMR2与PWMTC匹配时产生中断
//PWMMR0与PWMTC匹配时产生中断
// PWMIR=0x03;
PWMTCR = 0x02;
PWMTCR = 0x09;
VICIntSelect =0x00; // 所有中断通道设置为IRQ中断
VICVectCntl0 = (0x20|8); //PWM优先级最高
VICVectAddr0 = (int)PWM_Handler; //VICDefVectAddr改为VICVectAddr0就可以进入中断
VICIntEnable = (1<<8); //使能PWM中断请求
while(1)
{
if(d2 == 20)
ClosePwm(0);
}
return 0;
} 答 4: 这个东东会不会影响进入中断计数问题??uint32 PwmSize = Fpclk;
uint32 PwmStartSize = Fpclk/2;
uint32 d = 0, d2 = 0, d4 = 0, d6 = 0;
...........
PWMMR0 = PwmSize;
PWMMR2 = PwmStartSize;
..........
还有,老师,我用的精振是:11.0592M,那么它的Fpclk=11.0592啊???
我的主频是44.2368M
那么我的每一条指令为:1/44.2368M=22.6056ns
从此推出:11.0592M*22.6056ns = 24.9999ms
频率:1/25ms = 40HZ
我的计算是不是正确啊??????
答 5: re:zlgARM老师,谢谢你的帮助,现在可以正常工作了。老师,你看一下,这个周期与频率计算的正确吗????
因为我现在手上没有示波器,所以不能测量。
再次谢谢您,老师
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |