打印

关于 PIC24FJ 串口3 接收中断问题

[复制链接]
805|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lihaizhao|  楼主 | 2016-7-4 12:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教 大哥们“:
使用PIC24FJ256GA106  做USART3串口 端口映射问题,
RPINR17bits.U3RXR =  8;               
RPOR4bits.RP9R    = 28;
这样配置,  串口3发送数据正常,  但接收不到数据,出现了一上电就会进入一次接收中断,之后就没发进到接收中断里面。用示波器查看输入引脚 RB8 已有信号到了这个脚上。
void PIC24_Uart3Init(unsigned long Baud, uchar mode)
{
       
       
      uchar BDiv;

  
      U3MODE = 0;



    // 波特率设置

    U3BRG = 103; //波特率.  FCY = FOSC /2   9600

    //$$$.  校验,停止位
    //---------------------------------------------------------------

    U3MODEbits.PDSEL = 0;//00 = 8 位数据,无奇偶校验
    U3MODEbits.STSEL = 0;   // Bit0  停止位选择位

    //$$$. 状态和控制寄存器
    //---------------------------------------------------------------
    U3STA = 0;



    //$$$. 中断标志状态寄存器
    //---------------------------------------------------------------
    IFS5bits.U3TXIF = 0;        //清除UARTn 发送器中断标志状态位
    IFS5bits.U3RXIF = 0;        //清除UARTn 接收器中断标志状态位
   
    //中断标志状态寄存器
    //---------------------------------------------------------------
    //IPC20bits.U3RXIP   = 6;         //UART3接收中断优先级为7
    IFS5bits.U3TXIF    = 0;        //清除UARTn 发送器中断标志状态位
    IEC5bits.U3TXIE    = 1 ;         
    IFS5bits.U3RXIF    = 0;        //清除UARTn 接收器中断标志状态位
    IEC5bits.U3RXIE    = 1 ;        //允许接收中断

    //
    U3MODEbits.UARTEN = 1;      //UARTn 使能
    U3STAbits.UTXEN = 1;        //发送使能
       
        IFS5bits.U3TXIF    = 0;  //清除中断标志
        IFS5bits.U3TXIF    = 0; //清除中断标志
        IFS5bits.U3RXIF    = 0;//清除中断标志
        IFS5bits.U3RXIF    = 0;//清除中断标志
    U3_EN_485_INIT();  //485初始 处于接收状态
  
}       


沙发
JY-DX-JY| | 2016-7-4 13:27 | 只看该作者
接收中断程序呢?

使用特权

评论回复
板凳
lihaizhao|  楼主 | 2016-7-4 13:40 | 只看该作者
/**********************************************
功  能:串口3接收中断
参  数:
说明:  中断名称写法,可参考<<dspic_c30使用手册>>,P96,P97
**********************************************/
void  __attribute__((__interrupt__, auto_psv)) _U3RXInterrupt(void)
{
    IFS5bits.U3RXIF=0;             //清除UARTn 接收器中断标志状态位
    IEC5bits.U3RXIE = 0;   // 中断关闭
   
   
   // 一上电进来一次就再没进来过,收不到数据


    //发生溢出或帧错误
    while (U3STAbits.OERR)
    {
        //(清零先前置 1 的 OERR 位(1 → 0 的跳变) ,将使接收缓冲区和 RSR 复位为空状态)
        U3STAbits.OERR = 1;
        asm("nop");
        U3STAbits.OERR = 0;
        return;
    }
   
    LED1_OUT=!LED1_OUT;

   IEC5bits.U3RXIE = 1;//接收器中断允许  
}

使用特权

评论回复
地板
lihaizhao|  楼主 | 2016-7-4 13:44 | 只看该作者
端口映射我这样写,,   死活不进中断,只有一上电进入一次,   

  //通过寄存器解锁IO口
asm volatile ("MOV #OSCCON, w1 \n"      
                  "MOV #0x46, w2   \n"      
                  "MOV #0x57, w3   \n"      
                  "MOV.b w2, [w1]  \n"      
                  "MOV.b w3, [w1]  \n"      
                  "BCLR OSCCON,#6");

    RPINR17bits.U3RXR =  8;                 //Assign U3RX   to pin RP8;
    RPOR4bits.RP9R    = 28;                 //Assign U3TX   to pin RP9;

  //通过寄存器锁定IO口
asm volatile ("MOV #OSCCON, w1  \n"      
                  "MOV #0x46, w2    \n"      
                  "MOV #0x57, w3    \n"      
                  "MOV.b w2, [w1]   \n"      
                  "MOV.b w3, [w1]   \n"      
                  "BSET  OSCCON, #6");

使用特权

评论回复
5
lihaizhao|  楼主 | 2016-7-4 15:21 | 只看该作者
在别的论坛发现出现这中问题的贴, AD1PCFG   需要配置与ad复用的引脚做模拟输入还是数字输入   配置了AD1PCFG,  上电不会出现第一次进入中断,但此时 U3STAbits.OERR报错了
我用LED灯测试U3STAbits.OERR,结果运行就报错。

使用特权

评论回复
6
lihaizhao|  楼主 | 2016-7-5 14:56 | 只看该作者
果然是AD1PCFG的问题  ,因为 RB8,RB9  是AD转换接口复用  ,需要配置 AD1PCFG=0xffff;   问题解决。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

15

帖子

1

粉丝