共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 跳转至页
回复
我要赚赏金打赏帖 |
|
|---|---|
| 基于MCP23S17的输入输出功能模块控制被打赏¥20元 | |
| 【S32K3XX】SPD 软件包使用Link文件修改被打赏¥22元 | |
| Switch-Case局部变量定义问题被打赏¥23元 | |
| 基于米尔TIAM62L开发板的串口通信及应用被打赏¥20元 | |
| PCF8574功能模块及其使用被打赏¥20元 | |
| 传感器LSM6DSO及LIS3MDL的功能检测被打赏¥18元 | |
| LPS25HB气压传感器及其检测被打赏¥18元 | |
| HTS221温湿度传感器及其检测被打赏¥18元 | |
| 【S32K3XX】HSE FW 版本更新被打赏¥21元 | |
| 基于ArduinoUNO开发板的AT24C02读写测试被打赏¥16元 | |
我要赚赏金
