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

 
 
> At91R40008 не обробатываються прерывания USARTа
F@ntic
сообщение Jul 22 2011, 05:10
Сообщение #1





Группа: Участник
Сообщений: 13
Регистрация: 7-11-08
Пользователь №: 41 433



Использую:
MK - AT91R40008
OS - NutOS
ПО - Eclipse + JLink + Yagarto

Проблема: программа не попадает в прерывания от USARTа. Обработчик прерывания привязывал, как с помомощью API NutOsа, так и ручками через регистры (текущий вариант). USART работает, т.е. байты передаёт/принимает, флаги выставляет, но прерывания не срабатывает.
Посоветуйте что нить smile3046.gif crying.gif .

CODE
void USART0Interrupt(void *arg)
{
IRQ_ENTRY();
count++;

while ((inr(US0_CSR) & US_TXRDY) == 0);
outr(US0_THR, 0xAA);

IRQ_EXIT();
return;
}

int main(void)
{

...
//----------USART-------------
//! Disable GPIO on UART tx/rx pins.
outr(PIO_PDR, _BV(UART0_TXD_BIT) | _BV(UART0_RXD_BIT));

//! Enable USART clock.
outr(PS_PCER, _BV(US0_ID));

//! Disable all UART interrupts.
outr(US0_IDR, 0xFFFFFFFF);

//! Reset receiver and transmitter
outr(US0_CR, US_RSTRX | US_RSTTX | US_RXDIS | US_TXDIS);

//! Define the baud rate divisor register
outr(US0_BRGR, 33);

//! Write the Timeguard Register
outr(US0_TTGR, 0);

//! Set UART mode to 8 data bits, no parity and 1 stop bit
outr(US0_MR, US_CHMODE_NORMAL | US_CHRL_8 | US_PAR_NO | US_NBSTOP_1);
//outr(US0_MR, US_CHMODE_LOCAL_LOOPBACK | US_CHRL_8 | US_PAR_NO | US_NBSTOP_1);

// Enable USART receiver and transmitter
outr(US0_CR, US_RXEN | US_TXEN);

//! Enable all UART interrupts.
outr(US0_IER, 0xFFFFFFFF);
//outr(US0_IER, US_RXRDY | US_TXRDY | US_RXBRK | US_OVRE | US_FRAME | US_PARE);

//----------AIC-------------
//! Disable the interrupt on the interrupt controller
outr(AIC_IDCR, _BV(US0_ID));
//! Set the vector.
outr(AIC_SVR(US0_ID), (unsigned int)USART0Interrupt);

//! Initialize to edge triggered with defined priority.
outr(AIC_SMR(US0_ID), AIC_SRCTYPE_INT_LEVEL_SENSITIVE | 4);

//! Clear the interrupt on the interrupt controller
outr(AIC_ICCR, _BV(US0_ID));

//! Enable the interrupt on the interrupt controller
outr(AIC_IECR, _BV(US0_ID));


while ((inr(US0_CSR) & US_TXRDY) == 0);
outr(US0_THR, 0xAA);

...
return 0;
}


З.Ы: в теме уровень новичка, если что написал не правильно не пинать.

Сообщение отредактировал IgorKossak - Jul 22 2011, 06:50
Причина редактирования: [codebox]
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 1)
etoja
сообщение Jul 27 2011, 10:47
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 121
Регистрация: 14-01-05
Из: Москва
Пользователь №: 1 952



Совету сменить:
1) компилятор на Rowley Crossstudio
2) микроконтроллер на NXP или ST


Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 15:37
Рейтинг@Mail.ru


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