打印

关于TM4C123串口中断发送问题

[复制链接]
4509|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
自民|  楼主 | 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 | 只看该作者
我今天已经打开发送完成中断

使用特权

评论回复
5
dirtwillfly| | 2014-10-30 20:23 | 只看该作者
自民 发表于 2014-10-30 15:53
我今天已经打开发送完成中断

赞啊

使用特权

评论回复
6
自民|  楼主 | 2014-10-30 21:13 | 只看该作者
但是FIFO 深度还是为 2 个字节,我要1个字节

使用特权

评论回复
7
自民|  楼主 | 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);
                                                                 }
                                                  }
                                      
                                      
               
                }
   
}

使用特权

评论回复
8
自民|  楼主 | 2014-10-31 14:30 | 只看该作者
也就是中断中,如何判断当前数据是否已经发完成。

使用特权

评论回复
9
xiewenhui12327| | 2015-7-9 16:45 | 只看该作者
你好,我想问下后来你的TM4C123串口中断接受发送的程序调通了吗?

使用特权

评论回复
10
xiewenhui12327| | 2015-7-9 16:46 | 只看该作者
可以把你的代码发我下咩!我的邮箱53561911@qq.com  十分感谢!

使用特权

评论回复
11
lfldalong| | 2017-5-3 21:32 | 只看该作者
大神,能拿你的代码发我一下吗,正在学习,TM123G串口,我的邮箱1527090149@qq.com  十分感谢!

使用特权

评论回复
12
mmbs| | 2017-5-5 20:59 | 只看该作者
发送的数据太快了?

使用特权

评论回复
13
1988020566| | 2017-5-5 21:01 | 只看该作者
必须使用中断发送字符吗?

使用特权

评论回复
14
lzbf| | 2017-5-5 21:02 | 只看该作者
缓冲数组可以使用for循环发送。

使用特权

评论回复
15
houjiakai| | 2017-5-5 21:02 | 只看该作者
好像TM4C123可以使用DMA发送数据

使用特权

评论回复
16
youtome| | 2017-5-5 21:03 | 只看该作者
自民 发表于 2014-10-30 15:53
我今天已经打开发送完成中断

配置哪里的发送中断

使用特权

评论回复
17
mmbs| | 2017-5-5 21:03 | 只看该作者
TM4C123发送中断在哪里?

使用特权

评论回复
18
1988020566| | 2017-5-5 21:03 | 只看该作者
TM4C123的fifo不是8个字节吗?

使用特权

评论回复
19
lzbf| | 2017-5-5 21:03 | 只看该作者
中断发送最近没有怎么使用过。

使用特权

评论回复
20
houjiakai| | 2017-5-5 21:03 | 只看该作者
TM4C123的DMA比串口中断快多了。

使用特权

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

本版积分规则

47

主题

195

帖子

2

粉丝