Interrupt iexternal中断函数dspic33f的意外行为

Interrupt iexternal中断函数dspic33f的意外行为,interrupt,microchip,mplab,dspic,Interrupt,Microchip,Mplab,Dspic,就微控制器编程而言,我正在拼命完成的项目相当简单。我使用的dspic33fj128mc802基本上要做3件事: 通过UART接收数据并将其转换为伺服电机的PWM信号 定期唤醒其ADC以检查电池电量 当输入外部中断时,更改其波特率工作值 这是引起问题的最后一点。在我的电路中我有一个开关。一个位置对应波特率值,另一个位置对应第二个值。我没有找到任何关于如何在任何电压电平变化时触发中断的文档,所以我使用上升沿和下降沿触发器,并检查我为中断选择的引脚的当前状态 此外,我的代码中还有另外两个中断

就微控制器编程而言,我正在拼命完成的项目相当简单。我使用的dspic33fj128mc802基本上要做3件事:

  • 通过UART接收数据并将其转换为伺服电机的PWM信号

  • 定期唤醒其ADC以检查电池电量

  • 当输入外部中断时,更改其波特率工作值

这是引起问题的最后一点。在我的电路中我有一个开关。一个位置对应波特率值,另一个位置对应第二个值。我没有找到任何关于如何在任何电压电平变化时触发中断的文档,所以我使用上升沿和下降沿触发器,并检查我为中断选择的引脚的当前状态

此外,我的代码中还有另外两个中断函数,一个用于UART接收,第二个是定时中断,用于定期唤醒ADC。中断优先级如下:UART->1,定时器->2,外部中断->6(任何超过2的数字)

这是我的中断代码:

void __attribute__((interrupt, auto_psv)) _INT0Interrupt( void ) 
{   
IEC0bits.INT0IE = 0; // disable INT0 interrupt

if(IFS0bits.INT0IF){ 
    if (PORTBbits.RB7 == 1){ //if pin at high logic level
        INTCON2bits.INT0EP = 1; //falling edge trigger
        LATAbits.LATA0 = 1;
        U1BRG = 23;
    }
    else{ //if pin at low logic level
        INTCON2bits.INT0EP = 0; //rising edge trigger
        LATAbits.LATA0 = 0;
        U1BRG = 1;
    }
}
IFS0bits.INT0IF = 0; //clear INT0 flag
IEC0bits.INT0IE = 1; // enable INT0 interrupt

}
奇怪的行为现在->当引脚拉低时,波特率被设置在正确的值,UART通信工作正常。当拉高时,先前的通信不再工作,证明波特率已更改,但将新通信设置为新波特率也不起作用。LED状态更改也可以正常工作


需要注意的是,这个项目的所有不同部分都经过多次测试,每个部分都工作得很好,只是添加了这个外部中断,整个项目就崩溃了。微控制器工作正常,波特率值良好,电路经过测试,没有问题。。。。我不认为我不知道如何正确使用外部中断。

我想你不能动态地改变波特率。因此,关闭UART模块,更改波特率,然后再次打开。这并没有改变任何事情,但感谢您的帮助!最后我在dspic上使用了两个不同的uart模块,效果很好。我想你不能动态更改波特率。因此,关闭UART模块,更改波特率,然后再次打开。这并没有改变任何事情,但感谢您的帮助!最后,我在dspic上使用了两个不同的uart模块,效果很好。