реклама на сайте
подробности

 
 
> прерывание от DBGU
piz2383
сообщение Jun 30 2009, 22:31
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 26-06-09
Пользователь №: 50 675



Использую DBGU как UART. AT91SAMS7. В общем настроил прерывание и PDC. Но проблема в том, что прерывание срабатывает постоянно и из-за этого программа просто зависает. Код использую такой же как для US0. Но здесь почему-то прерывания срабатывают непрерывным потоком.

Код
Иннициализаци

    AT91C_BASE_DBGU->DBGU_MR = DBGU_MODE;    
    AT91C_BASE_DBGU->DBGU_BRGR = (unsigned short)(FREQ / RATE / 16);
    AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_SYS);
    AT91C_BASE_PIOA->PIO_ASR = ((unsigned int) AT91C_PA10_DTXD)|((unsigned int) AT91C_PA9_DRXD);
    AT91C_BASE_PIOA->PIO_BSR = 0;
    AT91C_BASE_PIOA->PIO_PDR = (((unsigned int) AT91C_PA10_DTXD)|((unsigned int) AT91C_PA9_DRXD) | 0);

    AT91C_BASE_DBGU->DBGU_RPR = 0;
    AT91C_BASE_DBGU->DBGU_RCR = 0;
    AT91C_BASE_DBGU->DBGU_RNPR = 0;
    AT91C_BASE_DBGU->DBGU_RNCR = 0;

    AT91C_BASE_DBGU->DBGU_PTCR = AT91C_PDC_TXTEN | AT91C_PDC_RXTEN;

    AT91C_BASE_AIC->AIC_IDCR = (1 << AT91C_ID_SYS);
    AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (unsigned int)DBGUHandler;
    AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | AT91C_AIC_PRIOR_LOWEST;
    AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_SYS);

    AT91C_BASE_DBGU->DBGU_IER = AT91C_US_ENDRX | AT91C_US_ENDTX;
    AT91C_BASE_DBGU->DBGU_IDR = ~(AT91C_US_ENDRX | AT91C_US_ENDTX);

    AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RXEN  // Enable the receiver  
     | AT91C_US_TXEN | AT91C_US_RSTSTA; // Enable the transmitter

Код
Отправка данных:

    AT91C_BASE_DBGU->DBGU_CSR;

    BASE_DBGU_PDC->PDC_TPR = (unsigned int)(unsigned char*)data;
    BASE_DBGU_PDC->PDC_TCR = count;
    
    AT91C_BASE_DBGU->DBGU_IER = (AT91C_US_ENDTX);

    BASE_DBGU_PDC->PDC_PTCR = AT91C_PDC_TXTEN;

    OSSemPend(Semaphore, 0, &error);

    AT91C_BASE_DBGU->DBGU_IDR = (AT91C_US_ENDTX);

    (unsigned long)AT91C_BASE_DBGU->DBGU_CSR;

    BASE_DBGU_PDC->PDC_PTCR = AT91C_PDC_TXTDIS;

Код
Обработчик:
    unsigned long S = AT91C_BASE_DBGU->DBGU_CSR;
    S &= AT91C_BASE_DBGU->DBGU_IMR;

    if (S & AT91C_US_ENDTX)
    {
      AT91C_BASE_DBGU->DBGU_IDR = (AT91C_US_ENDTX);
      OSSemPost(Semaphore);
    }

    AT91C_BASE_AIC->AIC_IVR = 0;
    AT91C_BASE_AIC->AIC_ICCR = 1 << _DBGUports->DBGU_ID;
    AT91C_BASE_AIC->AIC_EOICR = 0;

В чем причина: для любой другой переферии такая тактика приводит к успеху, а вот с DBGU, прерывания вызываються непрерывано, что приводит к огромной загрузке процессора. В чем причина? помогите разобраться.

Сообщение отредактировал piz2383 - Jun 30 2009, 22:32
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 20:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01363 секунд с 7
ELECTRONIX ©2004-2016