搜索
bottom↓
回复: 18

7X256,请问各位串口以中断方式通讯的问题,调试了几天了,抓狂中

[复制链接]

出0入0汤圆

发表于 2008-7-6 16:41:20 | 显示全部楼层 |阅读模式
void dbgu_c_irq_handler(void)//中断函数
{
  if ((AT91F_US_RxReady((AT91PS_USART)AT91C_BASE_DBGU)) != 0)
  {
    iTimeOut=0;
    byRec[byRecCount]= AT91F_US_GetChar((AT91PS_USART)AT91C_BASE_DBGU) & 0xff;
    byRecCount++;
  }  
}


void AT91F_DBGU_Init(void)
{
    // 配制DBGU的PIO
        AT91F_DBGU_CfgPIO();
        
        //* 复位发送功能,允许发送
       AT91F_US_ResetTx ((AT91PS_USART)AT91C_BASE_DBGU);//调用库函数
      //* 复位接收功能,允许接受
       AT91F_US_ResetRx ((AT91PS_USART)AT91C_BASE_DBGU);//调用库函数

    // 配置DBGU的特性
AT91F_US_Configure (
    (AT91PS_USART) AT91C_BASE_DBGU,            // DBGU 基地址
  AT91B_MCK,
  AT91C_US_ASYNC_MODE ,                    // 编程模式寄存器
  115200 ,                                 // 编程波特率
  0);                                     // 触发时间编程

    //允许DBGU口发送和接受
       ((AT91PS_USART)AT91C_BASE_DBGU)->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;
      
       AT91F_DBGU_InterruptEnable(AT91C_BASE_DBGU, 1<<0);//接受中断使能
     //禁止其他的所有中断
      AT91F_DBGU_InterruptDisable(AT91C_BASE_DBGU, !(1<<0));   

    //配制DBGU中断
      AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC,
                          AT91C_ID_SYS,
                          DBGU_INTERRUPT_LEVEL,
                          AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,
                          dbgu_c_irq_handler);
}


请朋友帮我看看,这段代码是否可以?

AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_SYS);

已经在其他地方执行。


程序执行是:当PC发送数据到板子上时,系统就不运行了,重新复位才恢复正常。

不知道DBGU的中断设置哪里有问题了,请有经验的朋友指点!

出0入54汤圆

发表于 2008-7-6 17:20:18 | 显示全部楼层
点击此处下载 ourdev_340903.txt(文件大小:4K) (原文件名:debug.txt)

我只玩过一段时间,现在学ARM9,这个就扔下了。
好象发送中断好使,给你个参考吧。

出0入0汤圆

 楼主| 发表于 2008-7-6 19:23:00 | 显示全部楼层
感谢,下载先看

出0入0汤圆

 楼主| 发表于 2008-7-6 19:28:03 | 显示全部楼层
明天试下,这几天简直要咬人了,NND
希望可以

出0入0汤圆

 楼主| 发表于 2008-7-6 19:31:48 | 显示全部楼层
借这个机会问下几个DBGU_IER中断中的位的区别:
RXRDY、ENDRX、RXBUFF,这3个位有什么区别呢?

请给菜鸟解释下呵

出0入0汤圆

 楼主| 发表于 2008-7-7 18:02:26 | 显示全部楼层
找到原因了,2个都要用到系统中断,不能同时用:(
据说必须要用汇编才能解决,痛苦啊

出0入0汤圆

发表于 2008-7-8 22:15:22 | 显示全部楼层
回5楼,我今天下午也研究了一下午,好像没解决,我把中断号换了。
回4楼,RXRDY,收到了数据,ENDRX接收缓冲满,RXBUFF,两个接收缓冲满
后两个用于DMA方式传输的。

1楼用的是DMA方式,跟普通方式不一样

出0入0汤圆

发表于 2008-7-8 23:30:14 | 显示全部楼层
我仔细看了一下别人的代码,在中断服务程序里面区分处理了,比如PIT中断和debug UART中断使能的情况下。
两个中断用同一个向量源,使用同一个中断服务程序。
有不同的状态值来区分
   volatile static INT32U  status;
    AT91C_BASE_AIC->AIC_IVR   = 0;            /* Debug variant of vector read (protect mode is used)   */
    AT91C_BASE_AIC->AIC_ICCR  = 1 << AT91C_ID_SYS; /* Clear  timer #0 interrupt                             */
           AT91C_BASE_AIC->AIC_EOICR = 0;            /* Signal end of interrupt                               */
   
   
        //OSTimeTick();

   
        if((AT91PS_PITC)AT91C_BASE_PITC->PITC_PISR)
    {
            status                    = AT91C_BASE_PITC->PITC_PIVR;
            OSTimeTick();                             // Tell uC/OS-II about clock tick                        
        }
        else
        {
                if((int)((AT91PS_DBGU)AT91C_BASE_DBGU->DBGU_CSR) & (int)0x01)
                {
                        if(pRxdt==&RXDT[19])
                        {
                                pRxdt=RXDT;
                        }
                        *(++pRxdt)=(int)(AT91PS_DBGU)AT91C_BASE_DBGU->DBGU_RHR;
                        OSSemPost (pE_Key);
                }
        }

出0入0汤圆

发表于 2008-7-9 09:44:00 | 显示全部楼层
今天我测了一下,PIT时钟和DEBUG串口中断,
pit设置了中断级别和中断源,如果debug串口初始化再设置一次的话,会产生别的bug
你这个问题只需要把这段屏蔽掉就行了
然后在AT91C_ID_SYS这个中断编号的中断服务程序里面写相应的服务程序
参考楼上的响应
  //配制DBGU中断
/*     AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC,
                          AT91C_ID_SYS,
                          DBGU_INTERRUPT_LEVEL,
                          AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,
                          dbgu_c_irq_handler);
}
*/

出0入0汤圆

 楼主| 发表于 2008-7-12 13:09:57 | 显示全部楼层
非常感谢楼上朋友讲解,我好象有点懂了呵
回去马上验证下

出0入0汤圆

 楼主| 发表于 2008-7-13 03:18:10 | 显示全部楼层
我用了RTT,用下面的语句代替了10楼朋友的
if((AT91PS_PITC)AT91C_BASE_PITC->PITC_PISR);

我用下面这句,也是判断中断状态的:
status=AT91F_RTTGetStatus(AT91C_BASE_RTTC);
if (status & 0x2)//判断如果是RTT状态
{
。。。。。。
}
else
{   status=AT91C_BASE_DBGU->DBGU_CSR;
    if ( status & AT91C_US_RXRDY)//判断如果是DBGU中断
......
}
问题还是老样子,DBGU没东西收到,有点想放弃了,郁闷

出0入0汤圆

发表于 2008-7-13 22:52:15 | 显示全部楼层
你单独跟我msn沟通一下吧,我确信没问题
llm_ralfak@hotmail.com

出0入0汤圆

发表于 2008-7-14 17:28:16 | 显示全部楼层
回13楼,你应该看一下我12楼的,
这段话一定要屏蔽掉,
如果你PTT中断有相关中断服务程序的话
   //配制DBGU中断
      AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC,
                          AT91C_ID_SYS,
                          DBGU_INTERRUPT_LEVEL,
                          AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,
                          dbgu_c_irq_handler);
}
同一个中断源AT91C_ID_SYS不能有多个中断服务程序
否则初始化的时候就可能覆盖掉了

出0入0汤圆

发表于 2010-5-23 22:50:08 | 显示全部楼层
回复【15楼】ralfak
-----------------------------------------------------------------------

还是不知道哦。怎么解决的呀。

11楼的

“然后在AT91C_ID_SYS这个中断编号的中断服务程序里面写相应的服务程序“

在哪里呀,敬请指教啊,谢谢

出0入0汤圆

发表于 2010-8-6 14:03:20 | 显示全部楼层
楼上挖的很及时,赞~!

出0入0汤圆

发表于 2010-8-12 14:53:16 | 显示全部楼层
回复【15楼】ralfak  
-----------------------------------------------------------------------

今天看到外国一个人是这么写的,在一个isr中,同时启动pit和dbgu检查
Please, make your homework; as John told you the right interrupt ID is
"AT91C_ID_SYS"

Code is simply something like:
AT91F_AIC_ConfigureIt( AT91C_BASE_AIC, AT91C_ID_SYS, AT91C_AIC_PRIOR_HIGHEST,
AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, _tmrIrqHandler);
With a check in the Handler for correct irq (assuming you configured
everything ok, in this case I ahave both DBGU and PIT enabled):

volatile unsigned int StatusDBGU;
volatile unsigned int StatusPITS;

// System Interrupt Handler
volatile AT91S_DBGU *pDBGU= AT91C_BASE_DBGU;
volatile AT91S_PITC *pPIT = AT91C_BASE_PITC;

StatusDBGU = pDBGU->DBGU_CSR;
StatusPITS = pPIT->PITC_PISR;
if (StatusPITS & AT91C_PITC_PITS) {
// Check PIT Interrupt
data = pPIT->PITC_PIVR; //-- clear PIT int source
// Handle PIT IRQ
}

if (StatusDBGU & AT91C_US_RXRDY) {
// Handle DBGU RX
}

if (StatusDBGU & AT91C_US_ENDTX) {
// Handle DBGU Tx
}
}
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-10 20:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表