求助PIC32MX795F512H的UART5接收中断

2019-03-25 18:54发布

请教UART5的接收进不了中断,可以发送数据,UART1、2、3、4都调试完毕,只有UART5进不了接收中断,调试PIC32MX795F512L的时候UART5是可以进入接收中断的,直接移植到到512H上面就进不了接收中断了,原理图和程序如下:
恳请各位指点一二,谢谢!




#include <plib.h>
#include "uart5.h"
#include "coretime.h"

unsigned int actualDataRate;    //波特率
unsigned char U5RXData[10];     //存放接收到的数据
unsigned char U5RXFlag=0;       //接收数据完成标志
unsigned char U5_i=0;           //接收数据计数用

void UART5_Init(void)
{
    U5MODEbits.ON = 1;
    //U4MODEbits.UEN0 = 0;
    //U4MODEbits.UEN1 = 0;
    U5MODEbits.PDSEL0 = 0;
    U5MODEbits.PDSEL1 = 0;
    U5MODEbits.STSEL = 0;
    U5MODEbits.BRGH = 1;

    U5STAbits.UTXISEL0 = 1;
    U5STAbits.UTXISEL1 = 1;

    U5STAbits.UTXEN = 1;
    U5STAbits.URXEN = 1;
    U5STAbits.URXISEL0 = 0;
    U5STAbits.URXISEL1 = 0;


    U5BRG = 64;        //115200



    IFS2bits.U5TXIF = 0;
    IFS2bits.U5RXIF = 0;
    IFS2bits.U5EIF = 0;

    IEC2bits.U5EIE = 1;   
    IEC2bits.U5RXIE = 1;

    IPC12bits.U5IP = 2;
    IPC12bits.U5IS = 2;

//    UARTConfigure(UART5, UART_ENABLE_PINS_TX_RX_ONLY);
//    UARTEnable(UART5, UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_RX | UART_TX));  //
//    UARTSetFifoMode(UART5, UART_INTERRUPT_ON_TX_DONE|UART_INTERRUPT_ON_RX_NOT_EMPTY);   //控制UART模块TX和RX FIFO操作。
//    actualDataRate = UARTSetDataRate(UART5, 30000000, 9600);
//    UARTSetLineControl(UART5, UART_DATA_SIZE_8_BITS|UART_PARITY_NONE|UART_STOP_BITS_1); //8 bit ,不校验, 1个停止位
//   
//    INTSetVectorPriority(INT_UART_5_VECTOR, INT_PRIORITY_LEVEL_3);          //设置 UART5 中断优先级 3
//    INTSetVectorSubPriority(INT_UART_5_VECTOR, INT_SUB_PRIORITY_LEVEL_0);   //中断子优先级 0
//   
//    INTClearFlag(INT_U5E|INT_U5RX|INT_U5|INT_U5TX);
//    INTEnable(INT_U5RX, INT_ENABLED);   //使能发送中断
}

//
//发送一个字节
void U5SendAByte(unsigned char data)
{
    UARTSendDataByte(UART5, data);
    while(!UARTTransmissionHasCompleted(UART5));
}

//
//发送n个字节
//
void U5SendSomeByte(unsigned char *Buffer, unsigned char Num)
{
    unsigned char j;
    for(j=0;j<Num;j++)
    {
        U5SendAByte(Buffer[j]);
    }
}

void __ISR(_UART_5_VECTOR, IPL2SOFT) Uart5_Handler(void)
//void __ISR(_UART_5_VECTOR, IPL3) UART5_Handler(void)
{
   // if(IFS0bits.U1RXIF)
    if(INTGetFlag(INT_U5RX))
    {
        do
        {
            U5RXData[U5_i++] = U5RXREG;
        }while(U5STAbits.URXDA);
        if(U5_i>=10)
        {
            U5_i=0;
            D4_Open();
            U5RXFlag=1;  
        }
        INTClearFlag(INT_U5RX);
    }
}



此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
mzb2012
1楼-- · 2019-03-26 03:52
帮顶,没用过这个片子
dingzy_2002
2楼-- · 2019-03-26 05:17
如果调试是通过官方的调试器完成的,那么实际移植到产品上要注意:
1.看原理图,UART5是不是与CAN模块复用的?是否存在相互的干扰?(UART5RX与CAN2TX;UART5TX与CAN2RX一个是发送,另一个是接收,而接在一个管脚上?)
2.接收中断是在完成数据接收动作才会出现,那么UART5RX的IO配置为输入否?硬件部分是否正常连接?此IO是否有其它模块使用?
lzgztm521
3楼-- · 2019-03-26 06:39
dingzy_2002 发表于 2017-2-9 10:22
如果调试是通过官方的调试器完成的,那么实际移植到产品上要注意:
1.看原理图,UART5是不是与CAN模块复用的? ...

多谢,确实把RX引脚配置为输入,问题解决了,搞不明白其他的UART口不用设置IO的方向,手册也没讲到,这点有点郁闷
dingzy_2002
4楼-- · 2019-03-26 11:36
lzgztm521 发表于 2017-2-9 17:04
多谢,确实把RX引脚配置为输入,问题解决了,搞不明白其他的UART口不用设置IO的方向,手册也没讲到,这点 ...

可能是UART5与其它串口模块设计的功能有区别吧.
这在PIC芯片上较为常见,
比如我用的PIC8位单片机,同样的模块功能,其配置可能就不一样.

一周热门 更多>