Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: прерывание от DBGU
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
piz2383
Использую 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, прерывания вызываються непрерывано, что приводит к огромной загрузке процессора. В чем причина? помогите разобраться.
aaarrr
По всей видимости включено еще какое-нибудь прерывание, использующее линию SYS.
piz2383
Я использую операционную систему uc/os, она не может включать линию sys?
К Sys насколько я помню кроме DBGU ещё PIT входит и вроде бы больше ничего. Или я ошибаюсь??
aaarrr
Цитата(piz2383 @ Jul 1 2009, 03:06) *
К Sys насколько я помню кроме DBGU ещё PIT входит и вроде бы больше ничего. Или я ошибаюсь??

Еще RTT, PMC, RSTC, WDT.

Из кода я бы убрал бессмысленные действия:
Код
Иннициализаци
    AT91C_BASE_PIOA->PIO_BSR = 0;

Код
Отправка данных:
    AT91C_BASE_DBGU->DBGU_CSR; затычка для отладки?

Код
Обработчик:
    AT91C_BASE_AIC->AIC_ICCR = 1 << _DBGUports->DBGU_ID;
piz2383
Цитата(aaarrr @ Jul 1 2009, 02:19) *
Еще RTT, PMC, RSTC, WDT.

А все-таки Us/OS ничего с этого не настраивает? Как это вообще проверить не потроша исходники?

Хотя я посмотрел в отладчике, что регистр AIC_IMR в 0x0002. Это значит что uс/os для своих целей системное прерывание использывает.
Что мне посоветуете сделать что бы обеспечить у себя в програме думплексную связь по DBGU?
piz2383
Спасибо всем, я разобрался
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.