qhtony 发表于 2006-6-9 14:14:00

arm使用dbgu发送中断出现的问题

以下为arm的dbgu初始化程序和中断程序:

void AT91F_DBGU_Init(void)

{

        AT91F_DBGU_CfgPIO();

        ( ( AT91PS_USART ) AT91C_BASE_DBGU )->US_CR = ( AT91C_US_RSTTX |AT91C_US_RSTRX );

        AT91F_US_Configure (

                ( AT91PS_USART ) AT91C_BASE_DBGU,      

                MCK,

                AT91C_US_ASYNC_MODE ,               

                AT91C_DBGU_BAUD ,                     

                0 );

        ( ( AT91PS_USART )AT91C_BASE_DBGU )->US_CR = ( AT91C_US_RXEN | AT91C_US_TXEN );

        AT91F_US_EnableIt((AT91PS_USART) AT91C_BASE_DBGU,AT91C_US_RXRDY | AT91C_US_ENDTX);

        AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_SYS,

                                                        USART_SYS_LEVEL,

                                                        AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE,

                                                        DBGU_irq_handler );

        AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_SYS);

}



void DBGU_irq_handler(void)

{

    unsigned char re_data_ud, re_status_dbgu = 0;

    re_status_dbgu = (*AT91C_DBGU_CSR & 0x11);

    if (re_status_dbgu) {

            re_data_ud = ( *AT91C_DBGU_RHR & 0x1FF );                                                /*接收中断处理*/

                  if ('X' == re_data_ud ) {                                                                                /*起始*/

                    re_local_index = 0;

                    re_head_ud = 1;

                    re_local_index++;

                    return;

            }

            if ( 'M' == re_data_ud ) {                                                                                /*结束*/

                    if( 15 < re_local_index ) {

                            re_head_ud = 0;

                            re_local_index = 0;

                            return;

                    }

                    re_local_is_ok = 1;                                                                                        /*一包数据传递完毕,设置标志位*/

                    re_head_ud = 0;

                    re_local_index = 0;

                    /*

                    AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, STATUS );

                    */

                    return;

            }

            if ( 15 < re_local_index ) {

                    re_head_ud = 0;

                    re_local_index = 0;

                    return;

            }

            else {

                    if ( 1 != re_head_ud ) {

                            re_local_index = 0;

                            re_head_ud = 0;

                            return;

                    }

                    strRxBuff = re_data_ud;                                                /*正文数据*/

                    re_local_index++;

                    if ( 16 < re_local_index ) {

                            re_head_ud = 0;

                            re_local_index = 0;

                    }

                   }

           }

           if((re_status_dbgu & 0x10) >> 4)

           {

                        if((local_tx_buff == '/0') || (tx_local_index > 15))

                        {

                                tx_local_index = 1;

                                return;       

                   }

                   *AT91C_DBGU_THR = local_tx_buff;

                }

}





在开始运行后不久就进入了中断,但是并未接受到或者需要发送人和数据。一开始re_status_dbgu数据为0,当运行完if((re_status_dbgu & 0x10) >> 4)判断之后,跳入了该if判断成功后的语句if((local_tx_buff == '/0') || (tx_local_index > 15)),并且此时re_status_dbgu值为0x000000CD。并且在其后的时间不断重复该循环,但是我们至今没有找到问题所在。我想请问一下是哪里有出错的地方。

kevin_zhao 发表于 2006-6-21 10:16:54

请问你用的什么仿真器?

zuoyou 发表于 2006-6-21 23:40:29

DBGU不建议使用中断,这个中断为系统中断,与其他共用;

qg_zhu 发表于 2007-8-5 20:03:31

请注意这里'/0'   

'\0' '/0'是不同的

ticat710 发表于 2008-12-3 14:03:19

近来在&nbsp;研究DBGU&nbsp;&nbsp;找不到什么&nbsp;资料,不过看了你这个例子,我&nbsp;明白你的&nbsp;问题出在哪里了

看这句AT91F_US_EnableIt((AT91PS_USART)&nbsp;AT91C_BASE_DBGU,AT91C_US_RXRDY&nbsp;|&nbsp;AT91C_US_ENDTX);



问题是&nbsp;&nbsp;&nbsp;AT91C_US_ENDTX&nbsp;&nbsp;这个不该加,因为这个表示发送缓冲器空中断,而你没有发送数据。

所以发送缓冲器为空,故一直会进入中断

ralfak 发表于 2008-12-3 17:06:49

楼上的发问前搜索一下论坛会有收获

这个问题以前就讨论过了

d0123b 发表于 2010-5-24 13:58:37

楼上的发问前搜索一下论坛会有收获
这个问题以前就讨论过了

有结果吗,没搜到啊,给个链接,兄弟,
谢谢了

reloaded 发表于 2010-8-12 14:49:05

回复【5楼】ralfak
楼上的发问前搜索一下论坛会有收获
这个问题以前就讨论过了
-----------------------------------------------------------------------

其实老兄应该把自己的回复合成一个集子,就像北大或者什么的学校bbs系统做的那样,的确老兄在dbgu方面发过很多帖子,但都零零碎碎的
,估计世界上只有google才找的到吧~这不google又把我飞这儿来了。但就想不起来前天看的是哪篇了,md

waitingconfirm 发表于 2010-8-12 14:52:36

回复【7楼】reloaded电子浪人
回复【5楼】ralfak
楼上的发问前搜索一下论坛会有收获
这个问题以前就讨论过了
-----------------------------------------------------------------------
其实老兄应该把自己的回复合成一个集子,就像北大或者什么的学校bbs系统做的那样,的确老兄在dbgu方面发过很多帖子,但都零零碎碎的
,估计世界上只有google才找的到吧~这不google又把我飞这儿来了。但就想不起来前天看的是哪篇了,md
-----------------------------------------------------------------------

这要求提得就过了

既然自己曾经看见过,那么自己找个地方分门别类存一下才是正解,怎么还要求作者出合集啊?给编辑费么?

reloaded 发表于 2010-8-12 15:20:00

回复【8楼】waitingconfirm
回复【7楼】reloaded电子浪人
回复【5楼】ralfak
楼上的发问前搜索一下论坛会有收获
这个问题以前就讨论过了
-----------------------------------------------------------------------
其实老兄应该把自己的回复合成一个集子,就像北大或者什么的学校bbs系统做的那样,的确老兄在dbgu方面发过很多帖子,但都零零碎碎的
,估计世界上只有google才找的到吧~这不google又把我飞这儿来了。但就想不起来前天看的是哪篇了,md
-----------------------------------------------------------------------
这要求提得就过了
既然自己曾经看见过,那么自己找个地方分门别类存一下才是正解,怎么还要求作者出合集啊?给编辑费么?

-----------------------------------------------------------------------
当然您要是觉得过那就过呗,,,
换句话说可以反过头来考量自己做这个小程序除错的心得嘛。。。
我敢说楼上肯定没留意过传统的大学内网bbs,类似于北大未名之类,它的bbs管理员会定期将有意义的讨论贴合成一个贴,然后大家
在它基础上继续发酵。
其实这个功能是可以通过改进论坛内部搜索系统来实现,就是 “关键字 +某人回帖记录”(@google)
其实我想说,论坛真应该把代码阅读器嵌入进来,从notepad里考出来的源代码看着真痛苦。

waitingconfirm 发表于 2010-8-12 15:27:41

回复【9楼】reloaded电子浪人
回复【8楼】waitingconfirm
当然您要是觉得过那就过呗,,,
换句话说可以反过头来考量自己做这个小程序除错的心得嘛。。。
我敢说楼上肯定没留意过传统的大学内网bbs,类似于北大未名之类,它的bbs管理员会定期将有意义的讨论贴合成一个贴,然后大家
在它基础上继续发酵。
其实这个功能是可以通过改进论坛内部搜索系统来实现,就是 “关键字 +某人回帖记录”(@google)
其实我想说,论坛真应该把代码阅读器嵌入进来,从notepad里考出来的源代码看着真痛苦。

-----------------------------------------------------------------------

多说不如多做

大学内网BBS的管理员十个里面有九个是闲人,还有一个是懒人,当然有工夫不断改进这改进那

但就以这个论坛而言,访问速度和安全性才是首要考虑的因素,代码阅读器什么的……你不会拷下去自己走 indent 啊?

当然,个人也比较支持在论坛后台程序上加个 code 标签一类的,然后标签内容直接后台走完 indent 再放出来……

reloaded 发表于 2010-8-12 15:43:57

回复【10楼】waitingconfirm
-----------------------------------------------------------------------

是的呢,话说indent原来是 缩进 的意思啊~~
他喵的以后我开个source insight 在旁边侯着,,
正在努力提高快速阅读代码的水平中,,,,
页: [1]
查看完整版本: arm使用dbgu发送中断出现的问题