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.

关于TM4C123串口中断发送问题

想把一个缓冲数组里面的数用发送中断连续发送出去,用查询可以实现,但是改成中断后,发现只有第一个字节0XFF发送出去后,并没有触发发送中断而继续发后面的数据 调试一天了,不知道怎么回事,有人知道吗?禁用 FIFO 就是相当于将 FIFO 深度设置为 1 个字节。 我也用ROM_UARTFIFODisable(INT_UART1);来禁止。

/**********************************************************         串口初始化设置 **********************************************************/

void UART_init(void)

 {

        //UART1  HART6    

ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);   

ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);      

 ROM_GPIOPinConfigure(GPIO_PB0_U1RX);    

 ROM_GPIOPinConfigure(GPIO_PB1_U1TX);    

ROM_GPIOPinTypeUART(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1);//设定PB0 PB1为串口        

ROM_UARTConfigSetExpClk(UART1_BASE, ROM_SysCtlClockGet(), 1200,                             (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |                              UART_CONFIG_PAR_ODD)); //设定  UART for 115,200, 8-ODD-1 operation    

 ROM_IntEnable(INT_UART1); //使能UART1中断    

ROM_UARTIntEnable(UART1_BASE, UART_INT_RX | UART_INT_RT);    

ROM_UARTFIFODisable(INT_UART1);//禁用 FIFO }

 /**********************************************************         串口1中断 HART6 **********************************************************/

 void UART1_Handler(void)

{    uint32_t ui32Status;  

 uint8_t  bt;       

 ui32Status = ROM_UARTIntStatus(UART1_BASE, true);     //获取中断状态  屏蔽中断状态       

 ROM_UARTIntClear(UART1_BASE, ui32Status);     //清除UART中断源

    if(ROM_UARTCharsAvail(UART1_BASE))    

 {       

 bt=ROM_UARTCharGetNonBlocking(UART1_BASE);//接收数据     

RCV_Hart(bt,5); //接收处理    

}else if(ROM_UARTSpaceAvail(UART1_BASE))         

 {           if(uSndFrmCnt[5]) //发送数据         

          {  

           ROM_UARTCharPutNonBlocking(UART1_BASE, HartSndFrm[5][SndFrmCnt[5]]);            

          SndFrmCnt[5]++;              

         uSndFrmCnt[5]--;             

         }else{                    

                  send_init(5);                    

                  ROM_GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_2,GPIO_PIN_2); //TXEN-1=1  接收                   

                 }         

 }

 }

主程序发送命令

ROM_IntEnable(INT_UART1); //使能UART1中断

SndFrmCnt[5]=0;

ROM_UARTCharPutNonBlocking(UART1_BASE, 0xFF);

  • 查询程序可以实现

    /**********************************************************         串口初始化设置 **********************************************************/

    void UART_init(void)

     {  //UART1  HART6    

     ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);   

    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);      

     ROM_GPIOPinConfigure(GPIO_PB0_U1RX);    

     ROM_GPIOPinConfigure(GPIO_PB1_U1TX);    

    ROM_GPIOPinTypeUART(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1);//设定PB0 PB1为串口        

    ROM_UARTConfigSetExpClk(UART1_BASE, ROM_SysCtlClockGet(), 1200,                             (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |                              UART_CONFIG_PAR_ODD)); //设定  UART for 115,200, 8-ODD-1 operation    

     ROM_IntEnable(INT_UART1); //使能UART1中断    

     ROM_UARTIntEnable(UART1_BASE, UART_INT_RX | UART_INT_RT);

     } /**********************************************************         串口1中断 HART6 **********************************************************/

     void UART1_Handler(void)

     {   

     uint32_t ui32Status;  

     uint8_t  bt;       

     ui32Status = ROM_UARTIntStatus(UART1_BASE, true);     //获取中断状态  屏蔽中断状态       

     ROM_UARTIntClear(UART1_BASE, ui32Status);     //清除UART中断源

        while(ROM_UARTCharsAvail(UART1_BASE))    

     {        

    bt=ROM_UARTCharGetNonBlocking(UART1_BASE);//接收数据    

     RCV_Hart(bt,5); //接收处理    

     }

     }

    主程序发送命令

     ROM_IntEnable(INT_UART1); //使能UART1中断        

     while(ui32Count)    

     {       if(ROM_UARTSpaceAvail(UART1_BASE))      

            {        

              ROM_UARTCharPutNonBlocking(UART1_BASE, *pui8Buffer++);        

              ui32Count--;        

              }    

     }    

     while(ROM_UARTBusy(UART1_BASE)); //等待发送完成          

     send_init(5);         

     ROM_GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_2,GPIO_PIN_2); //TXEN-1=1  接收

  • 使用UARTCharPutNonBlocking以非阻塞方式发送数据需要判断返回值,这个函数在缓冲满的时候是返回错误值的。

    你的程序不是使用中断方式发送数据,建议参考uartstdio.c。

  • 我今天已经打开发送完成中断

    为什么加了ROM_UARTFIFODisable(UART1_BASE); FIFO 深度还是为 2 个字节

    //UART1  HART6    

     ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);          

    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);                    

    ROM_GPIOPinConfigure(GPIO_PB0_U1RX);    

    ROM_GPIOPinConfigure(GPIO_PB1_U1TX);    

    ROM_GPIOPinTypeUART(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1);//设定PB0 PB1为串口        

    ROM_UARTConfigSetExpClk(UART1_BASE, ROM_SysCtlClockGet(), 1200,                             (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |                             

     UART_CONFIG_PAR_ODD)); //设定  UART for 115,200, 8-ODD-1 operation    

    ROM_UARTFIFODisable(UART1_BASE);    

    ROM_IntEnable(INT_UART1); //使能UART1中断    

    ROM_UARTIntEnable(UART1_BASE, UART_INT_RX | UART_INT_RT);

     

  • 我只要和51一样,一个字节就行了,我接收要边收边处理

  • 不是设置问题,是我程序问题!谢谢