关于TM4C123串口中断发送问题

[复制链接]
 楼主| 自民 发表于 2014-10-29 16:39 | 显示全部楼层 |阅读模式
想把一个缓冲数组里面的数用发送中断连续发送出去,用查询可以实现,但是改成中断后,发现只有第一个字节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);
 楼主| 自民 发表于 2014-10-29 16:42 | 显示全部楼层
查询程序可以实现
/**********************************************************
               串口初始化设置
**********************************************************/
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  接收
 楼主| 自民 发表于 2014-10-30 15:33 | 显示全部楼层
为什么加了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);
 楼主| 自民 发表于 2014-10-30 15:53 | 显示全部楼层
我今天已经打开发送完成中断
dirtwillfly 发表于 2014-10-30 20:23 | 显示全部楼层
自民 发表于 2014-10-30 15:53
我今天已经打开发送完成中断

赞啊
 楼主| 自民 发表于 2014-10-30 21:13 | 显示全部楼层
但是FIFO 深度还是为 2 个字节,我要1个字节
 楼主| 自民 发表于 2014-10-31 14:13 | 显示全部楼层
本帖最后由 自民 于 2014-10-31 14:20 编辑

不是设置问题,是我程序问题!
现在有个新问题
因为程序收发有个控制脚,但发送结束后,要拉低控制脚,然后接收。但是在最后一个发送中断响应时,硬件实际还在发送(用这个语句while(ROM_UARTBusy(UART1_BASE));可以知道),
/**********************************************************
               串口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((ui32Status == UART_INT_RX) || (ui32Status == UART_INT_RT))
    {
           while(ROM_UARTCharsAvail(UART1_BASE))
           {   
                                        bt=ROM_UARTCharGetNonBlocking(UART1_BASE);//接收数据
                                        //ROM_UARTCharPutNonBlocking(UART0_BASE, bt);
                                        RCV_Hart(bt,5); //接收处理
           }
    }else if(ui32Status == UART_INT_TX)
                {
                                if(SndFrmCnt[5]>uSndFrmCnt[5]) //发送数据
                                             {
                                                     
                                                                              send_init(5);
                                                                              ROM_GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_2,GPIO_PIN_2); //TXEN-1=1  接收
                                       }else{
                                                   
                                                                              
                                                                              if(ROM_UARTSpaceAvail(UART1_BASE))
                                                                       {
                                                                       //bt=HartSndFrm[5][SndFrmCnt[5]++];        
                                                                             ROM_UARTCharPutNonBlocking(UART1_BASE, HartSndFrm[5][SndFrmCnt[5]++]);
                                                                             //ROM_UARTCharPutNonBlocking(UART0_BASE, bt);
                                                                 }
                                                  }
                                      
                                      
               
                }
   
}
 楼主| 自民 发表于 2014-10-31 14:30 | 显示全部楼层
也就是中断中,如何判断当前数据是否已经发完成。
xiewenhui12327 发表于 2015-7-9 16:45 | 显示全部楼层
你好,我想问下后来你的TM4C123串口中断接受发送的程序调通了吗?
xiewenhui12327 发表于 2015-7-9 16:46 | 显示全部楼层
可以把你的代码发我下咩!我的邮箱53561911@qq.com  十分感谢!
lfldalong 发表于 2017-5-3 21:32 | 显示全部楼层
大神,能拿你的代码发我一下吗,正在学习,TM123G串口,我的邮箱1527090149@qq.com  十分感谢!
mmbs 发表于 2017-5-5 20:59 | 显示全部楼层
发送的数据太快了?
1988020566 发表于 2017-5-5 21:01 | 显示全部楼层
必须使用中断发送字符吗?
lzbf 发表于 2017-5-5 21:02 | 显示全部楼层
缓冲数组可以使用for循环发送。
houjiakai 发表于 2017-5-5 21:02 | 显示全部楼层
好像TM4C123可以使用DMA发送数据
youtome 发表于 2017-5-5 21:03 | 显示全部楼层
自民 发表于 2014-10-30 15:53
我今天已经打开发送完成中断

配置哪里的发送中断
mmbs 发表于 2017-5-5 21:03 | 显示全部楼层
TM4C123发送中断在哪里?
1988020566 发表于 2017-5-5 21:03 | 显示全部楼层
TM4C123的fifo不是8个字节吗?
lzbf 发表于 2017-5-5 21:03 | 显示全部楼层
中断发送最近没有怎么使用过。
houjiakai 发表于 2017-5-5 21:03 | 显示全部楼层
TM4C123的DMA比串口中断快多了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

47

主题

195

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部