4943|12

125

帖子

3708

TA的资源

一粒金砂(高级)

楼主
 

关于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);

最新回复

你可以把发送放在主程序while中发送,接收使用中断接收,这样会好点  详情 回复 发表于 2015-4-1 09:18
 
点赞 关注

回复
举报

125

帖子

3708

TA的资源

一粒金砂(高级)

沙发
 
查询程序可以实现
/**********************************************************         串口初始化设置 **********************************************************/
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  接收

 
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

板凳
 
ROM_UARTIntEnable(UART1_BASE, UART_INT_RX | UART_INT_RT); 我看你好像并没有打开发送完成中断,试试看。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(中级)

4
 
谢谢!已经转过来了

//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);

/**********************************************************
               串口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)
                {
                        while(ROM_UARTSpaceAvail(UART1_BASE))
                        {
                        if(SndFrmCnt[5]                         {
                                ROM_UARTCharPutNonBlocking(UART1_BASE, HartSndFrm[5][SndFrmCnt[5]++]);
                                //ROM_UARTCharPutNonBlocking(UART0_BASE, HartSndFrm[5][SndFrmCnt[5]++]);
                           if(SndFrmCnt[5]>=uSndFrmCnt[5])
                           {
                                   SndFrmCnt[5]=0;
                                   ROM_UARTIntDisable(UART1_BASE, UART_INT_TX);
                                   send_init(5);
                              ROM_GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_2,GPIO_PIN_2); //TXEN-1=1  接收
                           }
                    }
                   }
                }
   
}
主程序发送命令
        SndFrmCnt[5]=0;
                        ROM_UARTIntEnable(UART1_BASE, UART_INT_TX);
                        ROM_UARTCharPutNonBlocking(UART1_BASE, 0xFF);

现在问题是为什么加了ROM_UARTFIFODisable(UART1_BASE);
FIFO 深度还是为 2 个字节
我今天已经打开发送完成中断
 
 
 

回复

1944

帖子

32

TA的资源

纯净的硅(高级)

5
 
FIFO的深度是可以设置的。你可以根据需要设置FIFO
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(中级)

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

点评

那就禁用FIFO就可以了  详情 回复 发表于 2014-10-30 22:45
 
 
 

回复

1944

帖子

32

TA的资源

纯净的硅(高级)

7
 
QIHAO74 发表于 2014-10-30 21:18
我只要和51一样,一个字节就行了,我接收要边收边处理

那就禁用FIFO就可以了
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(中级)

8
 
我已经设了ROM_UARTFIFODisable(UART1_BASE);

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

点评

用下面两个 API 读一下看看 FIFO 深度是多少 UARTFIFOLevelGet UARTFIFOLevelSet  详情 回复 发表于 2014-10-31 09:07
 
 
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

9
 
本帖最后由 Study_Stellaris 于 2014-10-31 09:19 编辑
QIHAO74 发表于 2014-10-31 07:52
我已经设了ROM_UARTFIFODisable(UART1_BASE);

现在问题是为什么加了ROM_UARTFIFODisable(UART1_BASE);

很奇怪,一般只要不用理 FIFO ,它就是和普通的 UART 一样的,FIFO 默认就是禁止的。还有你说的 2 个字节是发送的还是接收的 FIFO 呢?
这里 FIFO 主要是用来决定中断在响应时机的,主要是避免在大数据量时,频繁地产生中断,提高 CPU 的效率。
可以试试用下面 API 读一下看看 FIFO 深度是多少
UARTFIFOLevelGet
然后再设置一下试试。将发送 FIFO 深度设置为 7 ,接收 FIFO 设置为 1 。
UARTFIFOLevelSetUART_FIFO_TX7_8  UART_FIFO_RX1_8
如果还是不行,就不好说了。




 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(中级)

10
 
不是设置问题,是我程序问题!
现在有个新问题
因为程序收发有个控制脚,但发送结束后,要拉低控制脚,然后接收。但是在最后一个发送中断响应时,硬件实际还在发送(用这个语句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 15:29
 
 
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

11
 
QIHAO74 发表于 2014-10-31 14:11
不是设置问题,是我程序问题!
现在有个新问题
因为程序收发有个控制脚,但发送结束后,要拉低控制脚,然 ...

这个问题应该是正常的吧。外设的速度有可能会比中断还要慢。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(中级)

12
 
这样怎么处理,发送接收都在中断里
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

13
 
你可以把发送放在主程序while中发送,接收使用中断接收,这样会好点
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表