服务热线400-888-0024
新拓PIC单片机论坛 新拓PIC论坛携手高奇微电子,强势推出买PIC原装工具,送PIC国产工具活动 新拓PIC开发工具商城

Microchip PIC单片机论坛MICROCHIP 单片机应用专区MICROCHIP 16/32位单片机应用 → dsPIC33EP系列单片机串口中断异常,求解决


  共有1046人关注过本帖树形打印

主题:dsPIC33EP系列单片机串口中断异常,求解决

帅哥哟,离线,有人找我吗?
Flibird
  1楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 贴子:1 积分:15 威望:0 精华:0 注册:2017-6-27 20:19:00
dsPIC33EP系列单片机串口中断异常,求解决  发贴心情 Post By:2017-6-27 21:02:00

 刚接触PIC单片机,现在用dsPIC33系列单片机*一个串口*发测试:采用串口接*中断,大概每隔5ms接*20个字节的数据,并将接*到的数据通过另一个串口转发出去,波特率设的是115200;现在测试时发现串口正常接*发送一段时间后,停止发送,等过一段时间后,又*始接*发送.总是间断性工作,一直查不出是怎么回事;在线仿真一直提示:在当前PC 0x0处未找到任何源代码行,运行不了.代码如下,请大神帮忙看一下有没有问题,应该如何解决?


#include "P33ep512mc806.h"


// DSPIC33EP512MC806 Configuration Bit Settings

// 'C' source line config statements

/*******系统初始化**********************
将时钟配置为外部高速石英振荡器,其余均采用默认模式。
*************************************/
#define DELAY_76uS asm volatile ("REPEAT, #4201"); Nop();
#define DELAY_8uS asm volatile ("REPEAT, #467"); Nop();

// FGS
#pragma config GWRP = OFF               // General Segment Write-Protect bit (General Segment may be written)
#pragma config GSS = OFF                // General Segment Code-Protect bit (General Segment Code protect is disabled)
#pragma config GSSK = OFF               // General Segment Key bits (General Segment Write Protection and Code Protection is Disabled)

// FOSCSEL
#pragma config FNOSC = PRIPLL           // Initial Oscillator Source Selection bits (Primary Oscillator (XT, HS, EC) with PLL)
#pragma config IESO = OFF               // Two-speed Oscillator Start-up Enable bit (Start up with user-selected oscillator source)

// FOSC
#pragma config POSCMD = HS              // Primary Oscillator Mode Select bits (HS Crystal Oscillator Mode)
#pragma config OSCIOFNC = OFF           // OSC2 Pin Function bit (OSC2 is clock output)
#pragma config IOL1WAY = ON             // Peripheral pin select configuration (Allow only one reconfiguration)
#pragma config FCKSM = CSDCMD           // Clock Switching Mode bits (Both Clock switching and Fail-safe Clock Monitor are disabled)

// FWDT
#pragma config WDTPOST = PS32768        // Watchdog Timer Postscaler bits (1:32,768)
#pragma config WDTPRE = PR128           // Watchdog Timer Prescaler bit (1:128)
#pragma config PLLKEN = ON              // PLL Lock Wait Enable bit (Clock switch to PLL source will wait until the PLL lock signal is valid.)
#pragma config WINDIS = OFF             // Watchdog Timer Window Enable bit (Watchdog Timer in Non-Window mode)
#pragma config FWDTEN = ON              // Watchdog Timer Enable bit (Watchdog timer always enabled)

// FPOR
#pragma config FPWRT = PWR128           // Power-on Reset Timer Value Select bits (128ms)
#pragma config BOREN = ON               // Brown-out Reset (BOR) Detection Enable bit (BOR is enabled)
#pragma config ALTI2C1 = OFF            // Alternate I2C pins for I2C1 (SDA1/SCK1 pins are selected as the I/O pins for I2C1)

// FICD
#pragma config ICS = PGD1               // ICD Communication Channel Select bits (Communicate on PGEC1 and PGED1)
#pragma config RSTPRI = PF              // Reset Target Vector Select bit (Device will obtain reset instruction from Primary flash)
#pragma config JTAGEN = OFF             // JTAG Enable bit (JTAG is disabled)

// FAS
#pragma config AWRP = OFF               // Auxiliary Segment Write-protect bit (Aux Flash may be written)
#pragma config APL = OFF                // Auxiliary Segment Code-protect bit (Aux Flash Code protect is disabled)
#pragma config APLK = OFF               // Auxiliary Segment Key bits (Aux Flash Write Protection and Code Protection is Disabled)


 unsigned char flag=0,head=0,head1=0xa5;


//配置PLL,将系统时钟配置为60MHz,外部输入时钟为12MHz。
void System_Colck(void)
{
    CLKDIVbits.PLLPRE = 0;              //N1 = 2  24/2=12MHz
    PLLFBDbits.PLLDIV = 8;              //M = 10  12*10=120MHz
    CLKDIVbits.PLLPOST = 0;             //N2 = 2 120/2 = 60MHz
    while (OSCCONbits.COSC!= 0b011)
    while (OSCCONbits.LOCK!= 1) {};     //PLL 配置完成
}

/****************UART1_TX初始化***************/
void UART1_TX_Init(void)
{
    RPOR2bits.RP68R = 0b000001;               //将GPIORP68配置为UART1_TX
    U1MODEbits.STSEL = 0;                     //1个停止位
    U1MODEbits.PDSEL = 0;                     //8位数据,无奇偶校验位
    U1MODEbits.ABAUD = 0;                     //禁止自动调整波特率
    U1MODEbits.BRGH = 0;                      //UART标准模式,每个周期内产生16个时钟信号
    U1BRG = ((30000000/115200)/16)-1;         //设置波特率为115200
    U1STAbits.UTXISEL0 = 0;
    U1STAbits.URXISEL1 = 0;                   //发送中断模式选择,当一个字符被传输到发送移位寄存器时产生中断
    IEC0bits.U1TXIE = 1;                      //使能发送中断
    U1MODEbits.UARTEN = 1;                    //使能UART
    U1STAbits.UTXEN = 1;                      //发送使能
}

/****************UART1_RX初始化***************/
void UART1_RX_Init(void)
{
    RPINR18bits.U1RXR = 0b1000101;              //将GPIORP65配置为UART1_RX
    TRISDbits.TRISD3 = 1;                       //寄存器映射
    U1MODEbits.STSEL = 0;                       //1个停止位
    U1MODEbits.PDSEL = 0;                       // 8位数据,无奇偶校验位
    U1MODEbits.ABAUD = 0;                       //禁止自动调整波特率
    U1MODEbits.BRGH = 0;                        //UART标准模式,每个周期内产生16个时钟信号
    U1BRG = ((30000000/115200)/16)-1;           //设置波特率为115200
    IEC0bits.U1RXIE = 1;                        //使能接*中断
    IPC2bits.U1RXIP=1;
    U1STAbits.URXISEL = 0b00;                   //接*中断模式选择,接*到任意一个字符产生中断
    U1MODEbits.UARTEN = 1;                      //使能UART  
}

/****************UART3_TX初始化***************/
void UART3_TX_Init(void)
{
    RPOR7bits.RP97R = 0b011011;              //将GPIORP97配置为UART2_TX
    U3MODEbits.STSEL = 0;                    //1个停止位
    U3MODEbits.PDSEL = 0;                    //8位数据,无奇偶校验位
    U3MODEbits.ABAUD = 0;                    //禁止自动调整波特率
    U3MODEbits.BRGH = 0;                     //UART标准模式,每个周期内产生16个时钟信号
    U3BRG = ((30000000/115200)/16)-1;        //设置波特率为115200
    U3STAbits.UTXISEL0 = 0;
    U3STAbits.URXISEL1 = 0;                  //发送中断模式选择,当一个字符被传输到发送移位寄存器时产生中断
    IEC5bits.U3TXIE = 1;                     //使能发送中断
    U3MODEbits.UARTEN = 1;                   //使能UART
    U3STAbits.UTXEN = 1;                     //发送使能
}

/****************UART3_RX初始化***************/
void UART3_RX_Init(void)
{
    RPINR27bits.U3RXR = 0b1100000;         //将GPIORP96配置为UAR3_RX
    TRISFbits.TRISF0 = 1;                  //寄存器映射
    U3MODEbits.STSEL = 0;                  //1个停止位
    U3MODEbits.PDSEL = 0;                  // 8位数据,无奇偶校验位
    U3MODEbits.ABAUD = 0;                  // 禁止自动调整波特率
    U3MODEbits.BRGH = 0;                   //UART标准模式,每个周期内产生16个时钟信号
    U3BRG = ((30000000/115200)/16)-1;      //设置波特率为115200
    U3STAbits.URXISEL = 0b00;              //接*中断模式选择,接*到任意一个字符产生中断
    IEC5bits.U3RXIE = 1;                   //使能接*中断
    U3MODEbits.UARTEN = 1;                 //使能UART
}

int main()
{
    System_Colck();                             //时钟初始化
    System_Init();                              //系统初始化
    UART1_RX_Init();                            //UART1_RX初始化
    UART1_TX_Init();                            //UART1_TX初始化
    UART3_RX_Init();                            //UART3_RX初始化
    UART3_TX_Init();                            //ART3_TX初始化
    IFS0bits.U1RXIF = 0;
    while(1)
    {
       //UART1_TX_Init();
       //DELAY_76uS;
       //U1TXREG = head1;
    }

}

void __attribute__((__interrupt__, auto_psv)) _U1TXInterrupt(void)//UART1发送中断
{
    IFS0bits.U1TXIF = 0;
}

void __attribute__((__interrupt__, auto_psv)) _U1RXInterrupt(void)//UART1接*中断
{

  
        //UART1_RX_Init();
    if(U1STAbits.OERR == 1)
    {
        U1STAbits.OERR = 0;
    }


    while(U1STAbits.URXDA ==1)
    {
        head=U1RXREG;
        U3TXREG = head;
    }
        IFS0bits.U1RXIF = 0;
}

void __attribute__((__interrupt__, auto_psv)) _U3TXInterrupt(void)////UART3发送中断
{
    IFS5bits.U3TXIF = 0;
}
void __attribute__((__interrupt__, auto_psv)) _U3RXInterrupt(void)//UART3接*中断
{
   
    IFS5bits.U3RXIF = 0;
}









支持(0中立(0反对(0回到顶部