This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430G2553,I2c接收中断,uart接收中断,共享一个中断向量,无法同时使用?

Other Parts Discussed in Thread: MSP430G2553, TMS320F2812

想用TI赠送的MSP430G2 launchpad做个微型四旋翼,iic单独能工作,uart单独也能工作,但同时使用的话,IIC的接收中断和UART的接收中断好像公用一个中断向量,结果只能响应UART的中断,IIC则歇菜了,搞不懂这颗MSP430G2553这么若吗?

还有感觉MSP430关于中断的文档很简单,参考资料只有芯片datasheet和user guide两个文档, 关于中断的内容一点也不详细,不想原来tms320f2812,有专门的文档,也很详尽,还是我没找到对的文档?

是逼我改用st的芯片吗?

  • 做四轴会设计到一些算法,这不是msp430的特长。msp430的最大特长是低功耗。

    如果必须用msp430做四轴的话,建议选用msp430f5xx/6xx

    看你用过tms320f2812,其实用c2000系列作四轴是个很好的选择

  • MSP430G2 launchpad方面的资料也非常多的。除了官网提供的430ware例有例程,第三方的教材和资料也很多

  • 主要是TI赠送了一批MSP430g2553 launchpad开发板,想用它来开发些有趣的应用,我看到别人用8位单片机也能用来控制四旋翼,只要做姿态解算和PID控制,我想430处理能力应该够了,这样这些开发板用于教学就更有吸引力。

    现在就卡在IIC和UART同时工作上,有高手指点下吗?

    如果实在不行,只能用软件模拟IIC工作了,但这样效率又要下降一些。

    另外这个20PIN的2553,是不是只能用到3个PWM,控制四旋翼要用4个PWM,缺一个我只能用定时器中断来模拟,还有什么好的办法吗?

    要是能提供4个PWM,IIC和UART也都能独立工作,这个launchpad就比较理想了!!!

  • 终于试成功可以同时uart RX 中断 + i2c RX/TX中断,这款芯片的中断感觉真别扭,稍微复杂的应用,外设使用间就相互掣肘。

    既然是推广口袋实验室,找个接口丰富,性能全面点的芯片啊,要不然真玩不出什么花样!

  • 請問樓上的前輩!  我目前也碰到中斷的問題! 

    可以貼 code 讓我學習學習嗎?

    感激了~~~~

  • 你好,

    你碰到的是什么中断有问题呢?

    我把口袋资料的代码贴出来供你参考:

  • 请问如何做的啊?如何区分这2个中断呢?

  • 标志位是不同的

  • #pragma vector = USCIAB0TX_VECTOR
    __interrupt void USCIAB0TX_ISR(void)
    {
    if(((IFG2&UCB0TXIFG)>0)||((IFG2&UCB0RXIFG)>0))
    {
    _disable_interrupts(); //等同_DINT
    if(I2C_State==TX_STATE) //判断是收状态还是发状态
    I2C_TxFrame_ISR(); // 事件:发送帧
    else
    I2C_RxFrame_ISR(); // 事件:接收帧
    //-------预留给主循环中唤醒CPU用途-------
    if(RxByteCnt == 0 || TxByteCnt == 0) //如果没有待发送或待接收数据
    __bic_SR_register_on_exit(CPUOFF); // Exit LPM0
    _enable_interrupts(); //等同_ENIT
    //等同_ENIT
    }
    else if((IFG2&UCA0TXIFG)==UCA0TXIFG)
    {
    IFG2&=~UCA0TXIFG; // 手动清除标志位
    UART_OnTx();
    }
    }

    您好,我遇到了相同的问题,我使用了中断标志位来判断是哪一个中断,但是这样我只能进入IIC中断,无法进入UART中断,能请教一下么?

  • #pragma vector = USCIAB0TX_VECTOR
    __interrupt void USCIAB0TX_ISR(void)
    {
    if(((IFG2&UCB0TXIFG)>0)||((IFG2&UCB0RXIFG)>0))
    {
    _disable_interrupts(); //等同_DINT
    if(I2C_State==TX_STATE) //判断是收状态还是发状态
    I2C_TxFrame_ISR(); // 事件:发送帧
    else
    I2C_RxFrame_ISR(); // 事件:接收帧
    //-------预留给主循环中唤醒CPU用途-------
    if(RxByteCnt == 0 || TxByteCnt == 0) //如果没有待发送或待接收数据
    __bic_SR_register_on_exit(CPUOFF); // Exit LPM0
    _enable_interrupts(); //等同_ENIT
    //等同_ENIT
    }
    else if((IFG2&UCA0TXIFG)==UCA0TXIFG)
    {
    IFG2&=~UCA0TXIFG; // 手动清除标志位
    UART_OnTx();
    }
    }

    您好,我遇到了相同的问题,我使用了中断标志位来判断是哪一个中断,但是这样我只能进入IIC中断,无法进入UART中断,能请教一下么?