[an error occurred while processing this directive]
Да ради Бога. В теле сообщения процедура инициализации и обработчик.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Sgrig_ 14 февраля 2006 г. 16:52
В ответ на: Ответ: отправлено AND 14 февраля 2006 г. 15:46


//- USART_GetBase - вычисление базового адреса USART по его ID
__inline AT91PS_USART USART_GetBase(unsigned int USART_ID)
{
return (AT91PS_USART) ( (unsigned int)AT91C_BASE_US0 + 0x4000 * (USART_ID - AT91C_ID_US0) );
}

//-----------------------------------------------------------------------------
// USART_init - аппаратная инициализация USART
//-----------------------------------------------------------------------------
void USART_init( unsigned int USART_ID, void(*IntFunc)(void), unsigned int INTlevel)
{
AT91PS_USART pUSART = USART_GetBase( USART_ID ) ; // базовый адрес

// Подключение сигналов USART к выходным пинам
AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA, USART_PINS[ USART_ID - AT91C_ID_US0 ], 0);
// Разрешение тактирования
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << USART_ID ) ;
// Конфигурирование
AT91F_US_Configure (pUSART, MCK, USART_MODE[ USART_ID - AT91C_ID_US0 ],
USART_BAUD_RATE[ USART_ID - AT91C_ID_US0 ], 0);
// Разрешение приема и передачи
pUSART->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;

if ( IntFunc )
{
// Разрешение прерывания при приеме байта и ошибках
AT91F_US_EnableIt(pUSART, AT91C_US_TIMEOUT | AT91C_US_FRAME | AT91C_US_OVRE | AT91C_US_RXRDY);
// Открываем прерывание
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, USART_ID, INTlevel,
AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, IntFunc);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, USART_ID);
}
} /* USART_init */

//-----------------------------------------------------------------------------
// USART0_c_irq_handler - обработчик прерывания от USART0
//-----------------------------------------------------------------------------
#define RX0_BUF_SIZE 80 // размер приемного буфера для USART0
char RX0_buf[RX0_BUF_SIZE]; // приемный буфер USART0
volatile unsigned int RX0_err = 0; // признак ошибки
volatile unsigned int RX0_done = 0; // признак получения строки

void USART0_c_irq_handler( void )
{
AT91PS_USART pUSART = AT91C_BASE_US0; // Базовый адрес USART
unsigned int status = pUSART->US_CSR; // Получение статуса
static char *pRX0 = RX0_buf; // указатель на буфер USART0

if ( status & AT91C_US_RXRDY )
{ // получение строки
char c = AT91F_US_GetChar( pUSART );
*pRX0++ = c; // добавление принятого символа в буфер
if ( pRX0 > (RX0_buf + RX0_BUF_SIZE - 1) ) pRX0 = RX0_buf;
if ( c == 0x0d ) // строка принята
{
*pRX0 = 0x00; // добавление 0 в конец строки
pRX0 = RX0_buf;
RX0_done = 1;
}
}
else
{ // Ошибка при передаче
RX0_err = ( AT91C_US_OVRE | AT91C_US_PARE | AT91C_US_FRAME | AT91C_US_TIMEOUT );
}
// Очитка статуса
pUSART->US_CR = AT91C_US_RSTSTA;
}


Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru