中断和使用UART

时间:2015-07-15 14:41:11

标签: interrupt pic uart microchip pic32

我在一个项目上苦苦挣扎,所以,我在这里。

我的问题是通过UART发送数据。事实上,这不是问题,因为我成功发送数据,这要归功于:

 int x=1;
#define var 00000001
        void InitUART()
        {
        mPORTFClearBits(BIT_8);
        TRISFbits.TRISF8=0;        // RF8 output==>TX1
        TRISFbits.TRISF1=1;        // RF1 input==>RX1
        U1STA = 0x1400; // Enable Tx(inv) and Rx
        //U1BRG = 8332; // value = (80000000 / BAUD) - 1 = 9600
        U1MODE = 0x8008; // Enable UART with 1 stop bit, no parity and BRGH
        OpenUART1(UART_EN | UART_BRGH_FOUR, UART_RX_ENABLE | UART_TX_ENABLE,U1BRG(UART1_BAUD) );
        }

int main(void) {

    InitUART;
 while (1)
      {
 x|=var;

              x=x<<1; //=> 0000 0010

               x=x<<1; //=> 0000 0101
               x|=var;

               x=x<<1; //=> 0000 1011
               x|=var;



              x=x<<1; //=> 0001 0110

              x=x<<1; //=> 0010 1101
              x|=var;

              x=x<<1; //=> 0101 1010

              x=x<<1; //=> 1011 0100

                //uart_send_data((BYTE*)x,8);

            U1TXREG=x;
}

我收到的很好。

但是,我想使用ChangeNotice中断。这是代码谎言,它起作用:

void InitISR()
{
        SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
        PORTSetPinsDigitalIn(IOPORT_B, BIT_2);          //RB2 as input for CN4 operation
        mPORTBClearBits(BIT_2);
        mCNOpen(CONFIG, PINS, PULLUPS);
       // mCNClearIntFlag();                            // clear interrupt flag
        temp=mPORTBRead();                              // clear port mismatch
        ConfigIntCN(INTERRUPT);                         // enable CN interrupt
        INTEnableSystemMultiVectoredInt();
        TRISEbits.TRISE0= 1;                //E0 input   // SCL EST BRANCHE EN E0/D0
        TRISEbits.TRISE1= 1;                //E1 input   // SDA EST BRANCHE EN E1/D1
        TRISEbits.TRISE2= 0;                //D2 output
        TRISEbits.TRISE3=0;
        LATEbits.LATE2=0;
        LATEbits.LATE3=0;

}

void __ISR(_CHANGE_NOTICE_VECTOR,ipl6) ChangeNotification_Handler(void)
{   
            LATEbits.LATE2=0; //To know
            LATEbits.LATE2=1; // that interrupt
            LATEbits.LATE2=0; // is working

        if ((mPORTEReadBits(BIT_0))!=0) //Check if clock is high==> sending data
        {
            nbr++;
            SDA=mPORTEReadBits(BIT_1);

                           if (SDA==0)       // data =0?
                          {
                                i=i<<1;
                          }
                    else                // data !=0 ==> 1
                          {
                                i=i<<1;
                                i|=var;
                          }              }
     else
    {
             if (nbr==8) // 8bits=>1byte
            {

                 U1TXREG = i;
                    nbr=0;

            }
             else
             {
             }

    }

    temp=mPORTBReadBits(BIT_2);
    mCNClearIntFlag();

}

但是,当我正在做两件事时,它正在发送一些东西,但根本不是我正在寻找的东西,它正在发送(以六进制)000 224 224 000 224 224 00 224 224 000.而不是每个接收字节字节,我每14个字节收到14个字节。

所以,我认为UART带来了中断,我尝试使用asm("di");IEC0bits.U1TXIE=0;IEC0bits.U1TXIE=0;禁用它,但没有任何影响...... 所以,如果有人知道为什么我有这个问题,我会很高兴= D

干杯。

1 个答案:

答案 0 :(得分:0)

所以,有一天,我会把它发布给可能遇到同样问题的人。 问题只是时钟。即使你有一个特殊的石英,你需要定义你的系统时钟。并且,当您的系统时钟设置好后,您必须定义外设时钟,是另一个时钟。但要小心,我认为不是所有的外设引脚都工作在外设时钟上。

所以,我有一个48Mhz石英,我的代码在这里:

  //48Mhz
//I want SYS_CLOKC=40Mhz
    #pragma config UPLLEN   = OFF   // USB PLL Enabled, OFF si quartz 48 MHz
    #pragma config FPLLIDIV = DIV_12 // PLL Input Divider, il faut obtenir 
                                     //      entre 4 et 5 MHz
    #pragma config FPLLMUL  = MUL_20        // PLL Multiplier
    #pragma config FPLLODIV = DIV_2         // PLL Output Divider


    // périphérique clock 5Mhz = SYSCLK/FPBDIV
    #pragma config FPBDIV   = DIV_8         // Peripheral Clock divisor


    // oscillateur : Primary Osc w/PLL (XT+,HS+,EC+PLL)
    #pragma config POSCMOD  = HS            // Primary Oscillator
    #pragma config FNOSC    = PRIPLL        // Oscillator Selection
    #pragma config FWDTEN   = OFF           // Watchdog Timer
    #pragma config CP       = OFF           // Code Protect

48/12 = 4MHz的

4 * 20 = 80MHZ

80/2 = 40Mhz System_CLOCK = 40Mhz

40/8 = 5Mz外设时钟= 5Mhz

对于其余的代码,我无法向你解释,我找到了整个块,它就像这样......