共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电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
分享汽车通信和多媒体总线结构被打赏20分 | |
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
NUCLEO-U083RC学习历程38+串口通过队列的方式输出两个字符串被打赏20分 | |
【我踩过的那些坑】分享一下调试一款AD芯片的遇到的“坑”被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
分享电控悬架的结构与工作原理(一)被打赏20分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 |